Full Code of antgroup/FluidMarkdown for AI

main 7456649dac9d cached
1326 files
7.8 MB
2.1M tokens
5266 symbols
1 requests
Download .txt
Showing preview only (8,620K chars total). Download the full file or copy to clipboard to get everything.
Repository: antgroup/FluidMarkdown
Branch: main
Commit: 7456649dac9d
Files: 1326
Total size: 7.8 MB

Directory structure:
gitextract_1cwcjqz8/

├── .gitignore
├── Android/
│   └── AntFluid/
│       ├── .gitignore
│       ├── app-sample/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── com/
│       │       │           └── fluid/
│       │       │               └── markdown/
│       │       │                   └── ExampleInstrumentedTest.kt
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   ├── java/
│       │       │   │   └── com/
│       │       │   │       └── fluid/
│       │       │   │           └── markdown/
│       │       │   │               ├── MainActivity.kt
│       │       │   │               ├── MyImageHandler.java
│       │       │   │               └── demos/
│       │       │   │                   ├── ListActivity.java
│       │       │   │                   ├── MarkdownData.java
│       │       │   │                   ├── MarkdownHolder.java
│       │       │   │                   ├── MarkwonListAdapter.java
│       │       │   │                   └── PrinterActivity.java
│       │       │   └── res/
│       │       │       ├── drawable/
│       │       │       │   ├── baseline_arrow_back_24.xml
│       │       │       │   ├── circle.xml
│       │       │       │   ├── editor_bg.xml
│       │       │       │   ├── ic_launcher_background.xml
│       │       │       │   └── item_bg.xml
│       │       │       ├── drawable-v24/
│       │       │       │   └── ic_launcher_foreground.xml
│       │       │       ├── layout/
│       │       │       │   ├── activity_list.xml
│       │       │       │   ├── activity_printer.xml
│       │       │       │   ├── layout_main.xml
│       │       │       │   └── list_item.xml
│       │       │       ├── mipmap-anydpi-v26/
│       │       │       │   ├── ic_launcher.xml
│       │       │       │   └── ic_launcher_round.xml
│       │       │       ├── values/
│       │       │       │   ├── colors.xml
│       │       │       │   ├── strings.xml
│       │       │       │   └── themes.xml
│       │       │       ├── values-v35/
│       │       │       │   └── themes.xml
│       │       │       ├── values-zh/
│       │       │       │   └── strings.xml
│       │       │       └── xml/
│       │       │           ├── backup_rules.xml
│       │       │           └── data_extraction_rules.xml
│       │       └── test/
│       │           └── java/
│       │               └── com/
│       │                   └── fluid/
│       │                       └── markdown/
│       │                           └── ExampleUnitTest.kt
│       ├── build.gradle
│       ├── fluid-markdown/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── consumer-rules.pro
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── com/
│       │       │           └── fluid/
│       │       │               └── afm/
│       │       │                   └── ExampleInstrumentedTest.java
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   ├── java/
│       │       │   │   └── com/
│       │       │   │       └── fluid/
│       │       │   │           └── afm/
│       │       │   │               ├── AFMInitializer.java
│       │       │   │               ├── markdown/
│       │       │   │               │   ├── ElementClickEventCallback.java
│       │       │   │               │   ├── MarkdownParser.java
│       │       │   │               │   ├── MarkdownParserFactory.java
│       │       │   │               │   ├── code/
│       │       │   │               │   │   └── CodeBlockPlugin.java
│       │       │   │               │   ├── html/
│       │       │   │               │   │   ├── CustomHtmlPlugin.java
│       │       │   │               │   │   ├── CustomIndentSpan.java
│       │       │   │               │   │   ├── CustomUnderlineSpan.java
│       │       │   │               │   │   ├── HtmlMarkTagHandler.java
│       │       │   │               │   │   ├── HtmlParaTagHandler.java
│       │       │   │               │   │   ├── HtmlSpanTagHandler.java
│       │       │   │               │   │   ├── SpanTextClickableSpan.java
│       │       │   │               │   │   └── TextHeightBackgroundSpan.java
│       │       │   │               │   ├── icon/
│       │       │   │               │   │   ├── IconSpan.java
│       │       │   │               │   │   └── IconSpanHandler.java
│       │       │   │               │   ├── iconlink/
│       │       │   │               │   │   ├── IconLinkSpan.java
│       │       │   │               │   │   └── IconLinkSpanHandler.java
│       │       │   │               │   ├── image/
│       │       │   │               │   │   ├── CustomImageSpan.java
│       │       │   │               │   │   ├── FootnoteClickSpan.java
│       │       │   │               │   │   ├── FootnoteSpan.java
│       │       │   │               │   │   └── SuperscriptImageSpan.java
│       │       │   │               │   ├── list/
│       │       │   │               │   │   └── DefinitionListPlugin.java
│       │       │   │               │   ├── model/
│       │       │   │               │   │   └── EventModel.java
│       │       │   │               │   ├── span/
│       │       │   │               │   │   ├── LinkClickSpan.java
│       │       │   │               │   │   └── OpacitySpan.java
│       │       │   │               │   ├── text/
│       │       │   │               │   │   ├── AfmTextPlugin.java
│       │       │   │               │   │   ├── FootnoteInTableSpan.java
│       │       │   │               │   │   └── RoundedBackgroundSpan.java
│       │       │   │               │   └── widget/
│       │       │   │               │       └── PrinterMarkDownTextView.java
│       │       │   │               └── ui/
│       │       │   │                   ├── MarkDownPreviewActivity.java
│       │       │   │                   ├── MarkdownContentAdapter.java
│       │       │   │                   └── MarkdownTextAdapter.java
│       │       │   └── res/
│       │       │       ├── drawable/
│       │       │       │   ├── back.xml
│       │       │       │   ├── bg_shape_ffffffff_12.xml
│       │       │       │   ├── default_placeholderdefault.xml
│       │       │       │   └── ic_triangle.xml
│       │       │       ├── layout/
│       │       │       │   ├── activity_magnify_table.xml
│       │       │       │   ├── item_markdown_content.xml
│       │       │       │   └── item_markdown_text.xml
│       │       │       └── values/
│       │       │           ├── colors.xml
│       │       │           ├── dimes.xml
│       │       │           ├── ids.xml
│       │       │           ├── strings.xml
│       │       │           └── themes.xml
│       │       └── test/
│       │           └── java/
│       │               └── com/
│       │                   └── fluid/
│       │                       └── afm/
│       │                           └── ExampleUnitTest.java
│       ├── gradle/
│       │   ├── libs.versions.toml
│       │   └── wrapper/
│       │       ├── gradle-wrapper.jar
│       │       └── gradle-wrapper.properties
│       ├── gradle.properties
│       ├── gradlew
│       ├── gradlew.bat
│       ├── markwon-core/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── io/
│       │       │           └── noties/
│       │       │               └── markwon/
│       │       │                   └── ExampleInstrumentedTest.kt
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   ├── java/
│       │       │   │   ├── com/
│       │       │   │   │   └── fluid/
│       │       │   │   │       └── afm/
│       │       │   │   │           ├── ContextHolder.java
│       │       │   │   │           ├── StreamOutStateObserver.java
│       │       │   │   │           ├── func/
│       │       │   │   │           │   ├── Callback.java
│       │       │   │   │           │   └── IImageClickCallback.java
│       │       │   │   │           ├── handler/
│       │       │   │   │           │   ├── BackgroundTaskHandler.java
│       │       │   │   │           │   ├── DefaultLogHandler.java
│       │       │   │   │           │   ├── DefaultTaskHandler.java
│       │       │   │   │           │   ├── DefualtImageHandler.java
│       │       │   │   │           │   ├── EventHandlerManager.java
│       │       │   │   │           │   ├── ImageHandler.java
│       │       │   │   │           │   └── LogHandler.java
│       │       │   │   │           ├── icon/
│       │       │   │   │           │   ├── DrawableWrapper.java
│       │       │   │   │           │   ├── LoadIconUtil.java
│       │       │   │   │           │   └── LoadImageCallback.java
│       │       │   │   │           ├── span/
│       │       │   │   │           │   ├── AntUnderlineSupportMulLinesSpan.java
│       │       │   │   │           │   ├── BaseIconTextSpan.java
│       │       │   │   │           │   ├── CodeLanguageSpan.java
│       │       │   │   │           │   ├── HeadingTopOrBottomSpacingSpan.java
│       │       │   │   │           │   ├── IClickableSpan.java
│       │       │   │   │           │   ├── LinkWithIconSpan.java
│       │       │   │   │           │   └── ParagraphSpacingSpan.java
│       │       │   │   │           ├── styles/
│       │       │   │   │           │   ├── BlockQuoteStyle.java
│       │       │   │   │           │   ├── BulletStyle.java
│       │       │   │   │           │   ├── CodeStyle.java
│       │       │   │   │           │   ├── FootnoteStyle.java
│       │       │   │   │           │   ├── HorizonRuleStyle.java
│       │       │   │   │           │   ├── LinkStyle.java
│       │       │   │   │           │   ├── MarkdownStyles.java
│       │       │   │   │           │   ├── OrderStyle.java
│       │       │   │   │           │   ├── ParagraphStyle.java
│       │       │   │   │           │   ├── Shape.java
│       │       │   │   │           │   ├── TableStyle.java
│       │       │   │   │           │   ├── TitleStyle.java
│       │       │   │   │           │   └── UnderlineStyle.java
│       │       │   │   │           └── utils/
│       │       │   │   │               ├── MDLogger.java
│       │       │   │   │               ├── ParseUtil.java
│       │       │   │   │               └── Utils.java
│       │       │   │   └── io/
│       │       │   │       └── noties/
│       │       │   │           └── markwon/
│       │       │   │               ├── AbstractMarkwonPlugin.java
│       │       │   │               ├── BlockHandlerDef.java
│       │       │   │               ├── LinkResolver.java
│       │       │   │               ├── LinkResolverDef.java
│       │       │   │               ├── Markwon.java
│       │       │   │               ├── MarkwonBuilderImpl.java
│       │       │   │               ├── MarkwonConfiguration.java
│       │       │   │               ├── MarkwonImpl.java
│       │       │   │               ├── MarkwonPlugin.java
│       │       │   │               ├── MarkwonReducer.java
│       │       │   │               ├── MarkwonSpansFactory.java
│       │       │   │               ├── MarkwonSpansFactoryImpl.java
│       │       │   │               ├── MarkwonVisitor.java
│       │       │   │               ├── MarkwonVisitorFactory.java
│       │       │   │               ├── MarkwonVisitorImpl.java
│       │       │   │               ├── PrecomputedFutureTextSetterCompat.java
│       │       │   │               ├── PrecomputedTextSetterCompat.java
│       │       │   │               ├── Prop.java
│       │       │   │               ├── RegistryImpl.java
│       │       │   │               ├── RenderProps.java
│       │       │   │               ├── RenderPropsImpl.java
│       │       │   │               ├── SoftBreakAddsNewLinePlugin.java
│       │       │   │               ├── SpanFactory.java
│       │       │   │               ├── SpannableBuilder.java
│       │       │   │               ├── core/
│       │       │   │               │   ├── CorePlugin.java
│       │       │   │               │   ├── CoreProps.java
│       │       │   │               │   ├── MarkwonTheme.java
│       │       │   │               │   ├── SimpleBlockNodeVisitor.java
│       │       │   │               │   ├── factory/
│       │       │   │               │   │   ├── BlockQuoteSpanFactory.java
│       │       │   │               │   │   ├── CodeBlockSpanFactory.java
│       │       │   │               │   │   ├── CodeSpanFactory.java
│       │       │   │               │   │   ├── EmphasisSpanFactory.java
│       │       │   │               │   │   ├── HeadingSpanFactory.java
│       │       │   │               │   │   ├── LinkSpanFactory.java
│       │       │   │               │   │   ├── ListItemSpanFactory.java
│       │       │   │               │   │   ├── StrongEmphasisSpanFactory.java
│       │       │   │               │   │   └── ThematicBreakSpanFactory.java
│       │       │   │               │   └── spans/
│       │       │   │               │       ├── BlockQuoteSpan.java
│       │       │   │               │       ├── BulletListItemSpan.java
│       │       │   │               │       ├── CodeBlockSpan.java
│       │       │   │               │       ├── CodeSpan.java
│       │       │   │               │       ├── CustomTypefaceSpan.java
│       │       │   │               │       ├── EmphasisSpan.java
│       │       │   │               │       ├── HeadingSpan.java
│       │       │   │               │       ├── LastLineSpacingSpan.java
│       │       │   │               │       ├── LinkSpan.java
│       │       │   │               │       ├── ObjectsPool.java
│       │       │   │               │       ├── OrderedListItemSpan.java
│       │       │   │               │       ├── StrongEmphasisSpan.java
│       │       │   │               │       ├── TextLayoutSpan.java
│       │       │   │               │       ├── TextViewSpan.java
│       │       │   │               │       └── ThematicBreakSpan.java
│       │       │   │               ├── image/
│       │       │   │               │   ├── AsyncDrawable.java
│       │       │   │               │   ├── AsyncDrawableLoader.java
│       │       │   │               │   ├── AsyncDrawableLoaderNoOp.java
│       │       │   │               │   ├── AsyncDrawableScheduler.java
│       │       │   │               │   ├── AsyncDrawableSpan.java
│       │       │   │               │   ├── DrawableUtils.java
│       │       │   │               │   ├── ImageProps.java
│       │       │   │               │   ├── ImageSize.java
│       │       │   │               │   ├── ImageSizeResolver.java
│       │       │   │               │   ├── ImageSizeResolverDef.java
│       │       │   │               │   ├── ImageSpanFactory.java
│       │       │   │               │   └── destination/
│       │       │   │               │       ├── ImageDestinationProcessor.java
│       │       │   │               │       ├── ImageDestinationProcessorAssets.java
│       │       │   │               │       └── ImageDestinationProcessorRelativeToAbsolute.java
│       │       │   │               ├── movement/
│       │       │   │               │   └── MovementMethodPlugin.java
│       │       │   │               ├── node/
│       │       │   │               │   └── OiintNode.java
│       │       │   │               ├── syntax/
│       │       │   │               │   ├── SyntaxHighlight.java
│       │       │   │               │   └── SyntaxHighlightNoOp.java
│       │       │   │               └── utils/
│       │       │   │                   ├── ColorUtils.java
│       │       │   │                   ├── Dip.java
│       │       │   │                   ├── DrawableUtils.java
│       │       │   │                   ├── DumpNodes.java
│       │       │   │                   ├── LayoutUtils.java
│       │       │   │                   ├── LeadingMarginUtils.java
│       │       │   │                   ├── NoCopySpannableFactory.java
│       │       │   │                   ├── ParserUtils.java
│       │       │   │                   └── SpanUtils.java
│       │       │   └── res/
│       │       │       └── values/
│       │       │           └── ids.xml
│       │       └── test/
│       │           └── java/
│       │               └── io/
│       │                   └── noties/
│       │                       └── markwon/
│       │                           └── ExampleUnitTest.kt
│       ├── markwon-ext-latex/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── consumer-rules.pro
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── io/
│       │       │           └── noties/
│       │       │               └── markwon/
│       │       │                   └── ext/
│       │       │                       └── latex/
│       │       │                           └── ExampleInstrumentedTest.java
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   └── java/
│       │       │       └── io/
│       │       │           └── noties/
│       │       │               └── markwon/
│       │       │                   └── ext/
│       │       │                       └── latex/
│       │       │                           ├── JLatexAsyncDrawableSpan.java
│       │       │                           ├── JLatexBlockImageSizeResolver.java
│       │       │                           ├── JLatexInlineAsyncDrawableSpan.java
│       │       │                           ├── JLatexMathBlock.java
│       │       │                           ├── JLatexMathBlockParser.java
│       │       │                           ├── JLatexMathBlockParserLegacy.java
│       │       │                           ├── JLatexMathInlineProcessor.java
│       │       │                           ├── JLatexMathNode.java
│       │       │                           ├── JLatexMathPlugin.java
│       │       │                           ├── JLatexMathTheme.java
│       │       │                           └── JLatextAsyncDrawable.java
│       │       └── test/
│       │           └── java/
│       │               └── io/
│       │                   └── noties/
│       │                       └── markwon/
│       │                           └── ext/
│       │                               └── latex/
│       │                                   └── ExampleUnitTest.java
│       ├── markwon-ext-strikethrough/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── consumer-rules.pro
│       │   ├── libs/
│       │   │   └── commonmark-ext-gfm-strikethrough-0.13.0.jar
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── io/
│       │       │           └── noties/
│       │       │               └── markwon/
│       │       │                   └── ext/
│       │       │                       └── strikethrough/
│       │       │                           └── ExampleInstrumentedTest.java
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   └── java/
│       │       │       └── io/
│       │       │           └── noties/
│       │       │               └── markwon/
│       │       │                   └── ext/
│       │       │                       └── strikethrough/
│       │       │                           └── StrikethroughPlugin.java
│       │       └── test/
│       │           └── java/
│       │               └── io/
│       │                   └── noties/
│       │                       └── markwon/
│       │                           └── ext/
│       │                               └── strikethrough/
│       │                                   └── ExampleUnitTest.java
│       ├── markwon-ext-tables/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── consumer-rules.pro
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── io/
│       │       │           └── noties/
│       │       │               └── markwon/
│       │       │                   └── ext/
│       │       │                       └── tables/
│       │       │                           └── ExampleInstrumentedTest.java
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   ├── java/
│       │       │   │   ├── com/
│       │       │   │   │   └── fluid/
│       │       │   │   │       └── afm/
│       │       │   │   │           ├── BaseBlockTitleSpan.java
│       │       │   │   │           ├── CodeBlockLineSpacingSpan.java
│       │       │   │   │           ├── CodeBlockTitleSpan.java
│       │       │   │   │           ├── IMarkdownLayer.java
│       │       │   │   │           ├── MarkdownAwareMovementMethod.java
│       │       │   │   │           ├── TableBlockTitleBlockSpan.java
│       │       │   │   │           ├── TableLineSpacingSpan.java
│       │       │   │   │           └── TopSpacingSpan.java
│       │       │   │   └── io/
│       │       │   │       └── noties/
│       │       │   │           └── markwon/
│       │       │   │               └── ext/
│       │       │   │                   └── tables/
│       │       │   │                       ├── Table.java
│       │       │   │                       ├── TablePlugin.java
│       │       │   │                       ├── TableRowSpan.java
│       │       │   │                       ├── TableRowsScheduler.java
│       │       │   │                       └── TableSpan.java
│       │       │   └── res/
│       │       │       ├── values/
│       │       │       │   ├── ids.xml
│       │       │       │   └── strings.xml
│       │       │       └── values-zh/
│       │       │           └── strings.xml
│       │       └── test/
│       │           └── java/
│       │               └── io/
│       │                   └── noties/
│       │                       └── markwon/
│       │                           └── ext/
│       │                               └── tables/
│       │                                   └── ExampleUnitTest.java
│       ├── markwon-ext-tasklist/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── consumer-rules.pro
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── io/
│       │       │           └── noties/
│       │       │               └── markwon/
│       │       │                   └── ext/
│       │       │                       └── tasklist/
│       │       │                           └── ExampleInstrumentedTest.java
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   └── java/
│       │       │       └── io/
│       │       │           └── noties/
│       │       │               └── markwon/
│       │       │                   └── ext/
│       │       │                       └── tasklist/
│       │       │                           ├── TaskListDrawable.java
│       │       │                           ├── TaskListItem.java
│       │       │                           ├── TaskListPlugin.java
│       │       │                           ├── TaskListPostProcessor.java
│       │       │                           ├── TaskListProps.java
│       │       │                           ├── TaskListSpan.java
│       │       │                           └── TaskListSpanFactory.java
│       │       └── test/
│       │           └── java/
│       │               └── io/
│       │                   └── noties/
│       │                       └── markwon/
│       │                           └── ext/
│       │                               └── tasklist/
│       │                                   └── ExampleUnitTest.java
│       ├── markwon-html/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── consumer-rules.pro
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── io/
│       │       │           └── noties/
│       │       │               └── markwon/
│       │       │                   └── html/
│       │       │                       └── ExampleInstrumentedTest.java
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   └── java/
│       │       │       ├── com/
│       │       │       │   └── fluid/
│       │       │       │       └── afm/
│       │       │       │           ├── spans/
│       │       │       │           │   └── DefinitionListSpan.java
│       │       │       │           └── tag/
│       │       │       │               └── DefinitionListTagHandler.java
│       │       │       └── io/
│       │       │           └── noties/
│       │       │               └── markwon/
│       │       │                   └── html/
│       │       │                       ├── AppendableUtils.java
│       │       │                       ├── CssInlineStyleParser.java
│       │       │                       ├── CssProperty.java
│       │       │                       ├── HtmlEmptyTagReplacement.java
│       │       │                       ├── HtmlPlugin.java
│       │       │                       ├── HtmlTag.java
│       │       │                       ├── HtmlTagImpl.java
│       │       │                       ├── MarkwonHtmlParser.java
│       │       │                       ├── MarkwonHtmlParserImpl.java
│       │       │                       ├── MarkwonHtmlRenderer.java
│       │       │                       ├── MarkwonHtmlRendererImpl.java
│       │       │                       ├── MarkwonHtmlRendererNoOp.java
│       │       │                       ├── TagHandler.java
│       │       │                       ├── TagHandlerNoOp.java
│       │       │                       ├── TrimmingAppender.java
│       │       │                       ├── jsoup/
│       │       │                       │   ├── UncheckedIOException.java
│       │       │                       │   ├── helper/
│       │       │                       │   │   ├── Normalizer.java
│       │       │                       │   │   └── Validate.java
│       │       │                       │   ├── nodes/
│       │       │                       │   │   ├── Attribute.java
│       │       │                       │   │   ├── Attributes.java
│       │       │                       │   │   ├── CommonMarkEntities.java
│       │       │                       │   │   └── DocumentType.java
│       │       │                       │   └── parser/
│       │       │                       │       ├── CharacterReader.java
│       │       │                       │       ├── ParseError.java
│       │       │                       │       ├── ParseErrorList.java
│       │       │                       │       ├── Token.java
│       │       │                       │       ├── Tokeniser.java
│       │       │                       │       └── TokeniserState.java
│       │       │                       ├── span/
│       │       │                       │   ├── SubScriptSpan.java
│       │       │                       │   └── SuperScriptSpan.java
│       │       │                       └── tag/
│       │       │                           ├── BlockquoteHandler.java
│       │       │                           ├── EmphasisHandler.java
│       │       │                           ├── HeadingHandler.java
│       │       │                           ├── ImageHandler.java
│       │       │                           ├── ImageSizeParserImpl.java
│       │       │                           ├── LinkHandler.java
│       │       │                           ├── ListHandler.java
│       │       │                           ├── SimpleTagHandler.java
│       │       │                           ├── StrikeHandler.java
│       │       │                           ├── StrongEmphasisHandler.java
│       │       │                           ├── SubScriptHandler.java
│       │       │                           ├── SuperScriptHandler.java
│       │       │                           └── UnderlineHandler.java
│       │       └── test/
│       │           └── java/
│       │               └── io/
│       │                   └── noties/
│       │                       └── markwon/
│       │                           └── html/
│       │                               └── ExampleUnitTest.java
│       ├── markwon-image/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── consumer-rules.pro
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── io/
│       │       │           └── noties/
│       │       │               └── markwon/
│       │       │                   └── image/
│       │       │                       └── ExampleInstrumentedTest.java
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   └── java/
│       │       │       ├── com/
│       │       │       │   └── fluid/
│       │       │       │       └── afm/
│       │       │       │           └── network/
│       │       │       │               ├── CircleDrawable.java
│       │       │       │               └── ImageLoaderSchemeHandler.java
│       │       │       └── io/
│       │       │           └── noties/
│       │       │               └── markwon/
│       │       │                   └── image/
│       │       │                       ├── AsyncDrawableLoaderBuilder.java
│       │       │                       ├── AsyncDrawableLoaderImpl.java
│       │       │                       ├── DefaultDownScalingMediaDecoder.java
│       │       │                       ├── DefaultMediaDecoder.java
│       │       │                       ├── ImageItem.java
│       │       │                       ├── ImagesPlugin.java
│       │       │                       ├── MediaDecoder.java
│       │       │                       ├── SchemeHandler.java
│       │       │                       ├── data/
│       │       │                       │   ├── DataUri.java
│       │       │                       │   ├── DataUriDecoder.java
│       │       │                       │   ├── DataUriParser.java
│       │       │                       │   └── DataUriSchemeHandler.java
│       │       │                       ├── file/
│       │       │                       │   └── FileSchemeHandler.java
│       │       │                       └── network/
│       │       │                           └── NetworkSchemeHandler.java
│       │       └── test/
│       │           └── java/
│       │               └── io/
│       │                   └── noties/
│       │                       └── markwon/
│       │                           └── image/
│       │                               └── ExampleUnitTest.java
│       ├── markwon-inline-parser/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── consumer-rules.pro
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── io/
│       │       │           └── noties/
│       │       │               └── markwon/
│       │       │                   └── inlineparser/
│       │       │                       └── ExampleInstrumentedTest.java
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   └── java/
│       │       │       ├── com/
│       │       │       │   └── fluid/
│       │       │       │       └── afm/
│       │       │       │           └── inline/
│       │       │       │               └── OiintInlineProcessor.java
│       │       │       └── io/
│       │       │           └── noties/
│       │       │               └── markwon/
│       │       │                   └── inlineparser/
│       │       │                       ├── AutolinkInlineProcessor.java
│       │       │                       ├── BackslashInlineProcessor.java
│       │       │                       ├── BackticksInlineProcessor.java
│       │       │                       ├── BangInlineProcessor.java
│       │       │                       ├── CloseBracketInlineProcessor.java
│       │       │                       ├── EntityInlineProcessor.java
│       │       │                       ├── HtmlInlineProcessor.java
│       │       │                       ├── InlineParserUtils.java
│       │       │                       ├── InlineProcessor.java
│       │       │                       ├── MarkwonInlineParser.java
│       │       │                       ├── MarkwonInlineParserContext.java
│       │       │                       ├── MarkwonInlineParserPlugin.java
│       │       │                       ├── NewLineInlineProcessor.java
│       │       │                       ├── OpenBracketInlineProcessor.java
│       │       │                       └── StaggeredDelimiterProcessor.java
│       │       └── test/
│       │           └── java/
│       │               └── io/
│       │                   └── noties/
│       │                       └── markwon/
│       │                           └── inlineparser/
│       │                               └── ExampleUnitTest.java
│       ├── markwon-syntax-highlight/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── consumer-rules.pro
│       │   ├── libs/
│       │   │   ├── prism4j-2.0.0.jar
│       │   │   └── prism4j-languages-2.0.0.jar
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── io/
│       │       │           └── noties/
│       │       │               └── markwon/
│       │       │                   └── syntax/
│       │       │                       └── ExampleInstrumentedTest.java
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   └── java/
│       │       │       └── io/
│       │       │           └── noties/
│       │       │               └── markwon/
│       │       │                   └── syntax/
│       │       │                       ├── BaseCodeGrammar.java
│       │       │                       ├── FixPrism4j.java
│       │       │                       ├── Prism4jSyntaxHighlight.java
│       │       │                       ├── Prism4jSyntaxVisitor.java
│       │       │                       ├── Prism4jTheme.java
│       │       │                       ├── Prism4jThemeBase.java
│       │       │                       ├── Prism4jThemeDarkula.java
│       │       │                       ├── Prism4jThemeDefault.java
│       │       │                       └── SyntaxHighlightPlugin.java
│       │       └── test/
│       │           └── java/
│       │               └── io/
│       │                   └── noties/
│       │                       └── markwon/
│       │                           └── syntax/
│       │                               └── ExampleUnitTest.java
│       └── settings.gradle
├── CHANGELOG.md
├── CONTRIBUTING.md
├── HarmonyOS/
│   ├── .gitignore
│   ├── AppScope/
│   │   ├── app.json5
│   │   └── resources/
│   │       └── base/
│   │           ├── element/
│   │           │   └── string.json
│   │           └── media/
│   │               └── layered_image.json
│   ├── build-profile.json5
│   ├── code-linter.json5
│   ├── hvigor/
│   │   └── hvigor-config.json5
│   ├── hvigorfile.ts
│   ├── markdown/
│   │   ├── .gitignore
│   │   ├── BuildProfile.ets
│   │   ├── CHANGELOG.md
│   │   ├── Index.ets
│   │   ├── LICENSE
│   │   ├── README.md
│   │   ├── build-profile.json5
│   │   ├── consumer-rules.txt
│   │   ├── hvigorfile.ts
│   │   ├── obfuscation-rules.txt
│   │   ├── oh-package.json5
│   │   └── src/
│   │       ├── main/
│   │       │   ├── cpp/
│   │       │   │   ├── CMakeLists.txt
│   │       │   │   ├── formula-ffi/
│   │       │   │   │   ├── .gitcode/
│   │       │   │   │   │   ├── ISSUE_TEMPLATE/
│   │       │   │   │   │   │   ├── bug.md
│   │       │   │   │   │   │   ├── question.md
│   │       │   │   │   │   │   └── request.md
│   │       │   │   │   │   └── PULL_REQUEST_TEMPLATE.md
│   │       │   │   │   ├── .gitignore
│   │       │   │   │   ├── .gitmodules
│   │       │   │   │   ├── CHANGELOG.md
│   │       │   │   │   ├── LICENSE
│   │       │   │   │   ├── README.OpenSource
│   │       │   │   │   ├── README.md
│   │       │   │   │   ├── build-ohos.sh
│   │       │   │   │   ├── cjpm.toml
│   │       │   │   │   ├── doc/
│   │       │   │   │   │   └── feature_api.md
│   │       │   │   │   ├── ffi/
│   │       │   │   │   │   ├── CMakeLists.txt
│   │       │   │   │   │   ├── ffi/
│   │       │   │   │   │   │   ├── graphic_ohos.cpp
│   │       │   │   │   │   │   ├── graphic_ohos.h
│   │       │   │   │   │   │   ├── graphic_ohos_ffi.cpp
│   │       │   │   │   │   │   ├── graphic_ohos_ffi.h
│   │       │   │   │   │   │   ├── latex_ffi.cpp
│   │       │   │   │   │   │   ├── latex_ffi.h
│   │       │   │   │   │   │   ├── render_ffi.cpp
│   │       │   │   │   │   │   ├── render_ffi.h
│   │       │   │   │   │   │   └── utils.h
│   │       │   │   │   │   ├── latex/
│   │       │   │   │   │   │   ├── .gitignore
│   │       │   │   │   │   │   ├── CMakeLists.txt
│   │       │   │   │   │   │   ├── README.md
│   │       │   │   │   │   │   ├── githooks/
│   │       │   │   │   │   │   │   ├── pre-commit
│   │       │   │   │   │   │   │   └── pre-push
│   │       │   │   │   │   │   ├── readme/
│   │       │   │   │   │   │   │   └── samples.md
│   │       │   │   │   │   │   ├── res/
│   │       │   │   │   │   │   │   ├── RES_README
│   │       │   │   │   │   │   │   ├── SAMPLES.tex
│   │       │   │   │   │   │   │   ├── cyrillic/
│   │       │   │   │   │   │   │   │   ├── cyrillic.map.xml
│   │       │   │   │   │   │   │   │   ├── language_cyrillic.xml
│   │       │   │   │   │   │   │   │   ├── mappings_cyrillic.xml
│   │       │   │   │   │   │   │   │   ├── symbols_cyrillic.xml
│   │       │   │   │   │   │   │   │   ├── wnbx10.xml
│   │       │   │   │   │   │   │   │   ├── wnbxti10.xml
│   │       │   │   │   │   │   │   │   ├── wnr10.xml
│   │       │   │   │   │   │   │   │   ├── wnss10.xml
│   │       │   │   │   │   │   │   │   ├── wnssbx10.xml
│   │       │   │   │   │   │   │   │   ├── wnssi10.xml
│   │       │   │   │   │   │   │   │   ├── wnti10.xml
│   │       │   │   │   │   │   │   │   └── wntt10.xml
│   │       │   │   │   │   │   │   ├── fonts/
│   │       │   │   │   │   │   │   │   └── licences/
│   │       │   │   │   │   │   │   │       ├── Knuth_License.txt
│   │       │   │   │   │   │   │   │       ├── License_for_dsrom.txt
│   │       │   │   │   │   │   │   │       └── OFL.txt
│   │       │   │   │   │   │   │   └── greek/
│   │       │   │   │   │   │   │       ├── fcmbipg.xml
│   │       │   │   │   │   │   │       ├── fcmbpg.xml
│   │       │   │   │   │   │   │       ├── fcmripg.xml
│   │       │   │   │   │   │   │       ├── fcmrpg.xml
│   │       │   │   │   │   │   │       ├── fcsbpg.xml
│   │       │   │   │   │   │   │       ├── fcsropg.xml
│   │       │   │   │   │   │   │       ├── fcsrpg.xml
│   │       │   │   │   │   │   │       ├── fctrpg.xml
│   │       │   │   │   │   │   │       ├── greek.map.xml
│   │       │   │   │   │   │   │       ├── language_greek.xml
│   │       │   │   │   │   │   │       ├── mappings_greek.xml
│   │       │   │   │   │   │   │       └── symbols_greek.xml
│   │       │   │   │   │   │   └── src/
│   │       │   │   │   │   │       ├── atom/
│   │       │   │   │   │   │       │   ├── atom.h
│   │       │   │   │   │   │       │   ├── atom_basic.cpp
│   │       │   │   │   │   │       │   ├── atom_basic.h
│   │       │   │   │   │   │       │   ├── atom_impl.cpp
│   │       │   │   │   │   │       │   ├── atom_impl.h
│   │       │   │   │   │   │       │   ├── box.cpp
│   │       │   │   │   │   │       │   ├── box.h
│   │       │   │   │   │   │       │   └── colors_def.cpp
│   │       │   │   │   │   │       ├── common.h
│   │       │   │   │   │   │       ├── config.h
│   │       │   │   │   │   │       ├── core/
│   │       │   │   │   │   │       │   ├── core.cpp
│   │       │   │   │   │   │       │   ├── core.h
│   │       │   │   │   │   │       │   ├── formula.cpp
│   │       │   │   │   │   │       │   ├── formula.h
│   │       │   │   │   │   │       │   ├── formula_def.cpp
│   │       │   │   │   │   │       │   ├── localized_num.cpp
│   │       │   │   │   │   │       │   ├── macro.cpp
│   │       │   │   │   │   │       │   ├── macro.h
│   │       │   │   │   │   │       │   ├── macro_def.cpp
│   │       │   │   │   │   │       │   ├── macro_impl.cpp
│   │       │   │   │   │   │       │   ├── macro_impl.h
│   │       │   │   │   │   │       │   ├── parser.cpp
│   │       │   │   │   │   │       │   └── parser.h
│   │       │   │   │   │   │       ├── fonts/
│   │       │   │   │   │   │       │   ├── alphabet.cpp
│   │       │   │   │   │   │       │   ├── alphabet.h
│   │       │   │   │   │   │       │   ├── font_info.cpp
│   │       │   │   │   │   │       │   ├── font_info.h
│   │       │   │   │   │   │       │   ├── font_reg.h
│   │       │   │   │   │   │       │   ├── fonts.cpp
│   │       │   │   │   │   │       │   ├── fonts.h
│   │       │   │   │   │   │       │   └── symbol_reg.h
│   │       │   │   │   │   │       ├── graphic/
│   │       │   │   │   │   │       │   ├── graphic.h
│   │       │   │   │   │   │       │   └── graphic_basic.h
│   │       │   │   │   │   │       ├── latex.cpp
│   │       │   │   │   │   │       ├── latex.h
│   │       │   │   │   │   │       ├── platform/
│   │       │   │   │   │   │       │   ├── cairo/
│   │       │   │   │   │   │       │   │   ├── graphic_cairo.cpp
│   │       │   │   │   │   │       │   │   └── graphic_cairo.h
│   │       │   │   │   │   │       │   └── gdi_win/
│   │       │   │   │   │   │       │       ├── graphic_win32.cpp
│   │       │   │   │   │   │       │       └── graphic_win32.h
│   │       │   │   │   │   │       ├── render.cpp
│   │       │   │   │   │   │       ├── render.h
│   │       │   │   │   │   │       ├── res/
│   │       │   │   │   │   │       │   ├── builtin/
│   │       │   │   │   │   │       │   │   ├── formula_mappings.res.cpp
│   │       │   │   │   │   │       │   │   ├── glue.res.cpp
│   │       │   │   │   │   │       │   │   ├── symbol_mapping.res.cpp
│   │       │   │   │   │   │       │   │   ├── tex_param.res.cpp
│   │       │   │   │   │   │       │   │   └── tex_symbols.res.cpp
│   │       │   │   │   │   │       │   ├── font/
│   │       │   │   │   │   │       │   │   ├── README
│   │       │   │   │   │   │       │   │   ├── bi10.def.cpp
│   │       │   │   │   │   │       │   │   ├── bx10.def.cpp
│   │       │   │   │   │   │       │   │   ├── cmbsy10.def.cpp
│   │       │   │   │   │   │       │   │   ├── cmbx10.def.cpp
│   │       │   │   │   │   │       │   │   ├── cmbxti10.def.cpp
│   │       │   │   │   │   │       │   │   ├── cmex10.def.cpp
│   │       │   │   │   │   │       │   │   ├── cmmi10.def.cpp
│   │       │   │   │   │   │       │   │   ├── cmmi10_unchanged.def.cpp
│   │       │   │   │   │   │       │   │   ├── cmmib10.def.cpp
│   │       │   │   │   │   │       │   │   ├── cmmib10_unchanged.def.cpp
│   │       │   │   │   │   │       │   │   ├── cmr10.def.cpp
│   │       │   │   │   │   │       │   │   ├── cmss10.def.cpp
│   │       │   │   │   │   │       │   │   ├── cmssbx10.def.cpp
│   │       │   │   │   │   │       │   │   ├── cmssi10.def.cpp
│   │       │   │   │   │   │       │   │   ├── cmsy10.def.cpp
│   │       │   │   │   │   │       │   │   ├── cmti10.def.cpp
│   │       │   │   │   │   │       │   │   ├── cmti10_unchanged.def.cpp
│   │       │   │   │   │   │       │   │   ├── cmtt10.def.cpp
│   │       │   │   │   │   │       │   │   ├── dsrom10.def.cpp
│   │       │   │   │   │   │       │   │   ├── eufb10.def.cpp
│   │       │   │   │   │   │       │   │   ├── eufm10.def.cpp
│   │       │   │   │   │   │       │   │   ├── i10.def.cpp
│   │       │   │   │   │   │       │   │   ├── moustache.def.cpp
│   │       │   │   │   │   │       │   │   ├── msam10.def.cpp
│   │       │   │   │   │   │       │   │   ├── msbm10.def.cpp
│   │       │   │   │   │   │       │   │   ├── r10.def.cpp
│   │       │   │   │   │   │       │   │   ├── r10_unchanged.def.cpp
│   │       │   │   │   │   │       │   │   ├── rsfs10.def.cpp
│   │       │   │   │   │   │       │   │   ├── sb10.def.cpp
│   │       │   │   │   │   │       │   │   ├── sbi10.def.cpp
│   │       │   │   │   │   │       │   │   ├── si10.def.cpp
│   │       │   │   │   │   │       │   │   ├── special.def.cpp
│   │       │   │   │   │   │       │   │   ├── ss10.def.cpp
│   │       │   │   │   │   │       │   │   ├── stmary10.def.cpp
│   │       │   │   │   │   │       │   │   └── tt10.def.cpp
│   │       │   │   │   │   │       │   ├── font_def.res.h
│   │       │   │   │   │   │       │   ├── parser/
│   │       │   │   │   │   │       │   │   ├── font_parser.cpp
│   │       │   │   │   │   │       │   │   ├── font_parser.h
│   │       │   │   │   │   │       │   │   ├── formula_parser.cpp
│   │       │   │   │   │   │       │   │   └── formula_parser.h
│   │       │   │   │   │   │       │   ├── reg/
│   │       │   │   │   │   │       │   │   ├── builtin_font_reg.cpp
│   │       │   │   │   │   │       │   │   ├── builtin_font_reg.h
│   │       │   │   │   │   │       │   │   ├── builtin_syms_reg.cpp
│   │       │   │   │   │   │       │   │   └── builtin_syms_reg.h
│   │       │   │   │   │   │       │   ├── sym/
│   │       │   │   │   │   │       │   │   ├── amsfonts.def.cpp
│   │       │   │   │   │   │       │   │   ├── amssymb.def.cpp
│   │       │   │   │   │   │       │   │   ├── base.def.cpp
│   │       │   │   │   │   │       │   │   ├── special.def.cpp
│   │       │   │   │   │   │       │   │   └── stmaryrd.def.cpp
│   │       │   │   │   │   │       │   └── symbol_def.res.h
│   │       │   │   │   │   │       ├── samples/
│   │       │   │   │   │   │       │   ├── gtkmm_main.cpp
│   │       │   │   │   │   │       │   ├── mem_check_main.cpp
│   │       │   │   │   │   │       │   ├── samples.h
│   │       │   │   │   │   │       │   └── win32_main.cpp
│   │       │   │   │   │   │       └── xml/
│   │       │   │   │   │   │           ├── tinyxml2.cpp
│   │       │   │   │   │   │           └── tinyxml2.h
│   │       │   │   │   │   └── third_party_bounds_checking_function/
│   │       │   │   │   │       ├── .gitignore
│   │       │   │   │   │       ├── BUILD.gn
│   │       │   │   │   │       ├── CMakeLists.txt
│   │       │   │   │   │       ├── LICENSE
│   │       │   │   │   │       ├── Makefile
│   │       │   │   │   │       ├── OAT.xml
│   │       │   │   │   │       ├── README.OpenSource
│   │       │   │   │   │       ├── README.en.md
│   │       │   │   │   │       ├── README.md
│   │       │   │   │   │       ├── bundle.json
│   │       │   │   │   │       ├── include/
│   │       │   │   │   │       │   ├── securec.h
│   │       │   │   │   │       │   └── securectype.h
│   │       │   │   │   │       ├── libsec_src.gni
│   │       │   │   │   │       └── src/
│   │       │   │   │   │           ├── fscanf_s.c
│   │       │   │   │   │           ├── fwscanf_s.c
│   │       │   │   │   │           ├── gets_s.c
│   │       │   │   │   │           ├── input.inl
│   │       │   │   │   │           ├── memcpy_s.c
│   │       │   │   │   │           ├── memmove_s.c
│   │       │   │   │   │           ├── memset_s.c
│   │       │   │   │   │           ├── output.inl
│   │       │   │   │   │           ├── scanf_s.c
│   │       │   │   │   │           ├── secinput.h
│   │       │   │   │   │           ├── securecutil.c
│   │       │   │   │   │           ├── securecutil.h
│   │       │   │   │   │           ├── secureinput_a.c
│   │       │   │   │   │           ├── secureinput_w.c
│   │       │   │   │   │           ├── secureprintoutput.h
│   │       │   │   │   │           ├── secureprintoutput_a.c
│   │       │   │   │   │           ├── secureprintoutput_w.c
│   │       │   │   │   │           ├── snprintf_s.c
│   │       │   │   │   │           ├── sprintf_s.c
│   │       │   │   │   │           ├── sscanf_s.c
│   │       │   │   │   │           ├── strcat_s.c
│   │       │   │   │   │           ├── strcpy_s.c
│   │       │   │   │   │           ├── strncat_s.c
│   │       │   │   │   │           ├── strncpy_s.c
│   │       │   │   │   │           ├── strtok_s.c
│   │       │   │   │   │           ├── swprintf_s.c
│   │       │   │   │   │           ├── swscanf_s.c
│   │       │   │   │   │           ├── vfscanf_s.c
│   │       │   │   │   │           ├── vfwscanf_s.c
│   │       │   │   │   │           ├── vscanf_s.c
│   │       │   │   │   │           ├── vsnprintf_s.c
│   │       │   │   │   │           ├── vsprintf_s.c
│   │       │   │   │   │           ├── vsscanf_s.c
│   │       │   │   │   │           ├── vswprintf_s.c
│   │       │   │   │   │           ├── vswscanf_s.c
│   │       │   │   │   │           ├── vwscanf_s.c
│   │       │   │   │   │           ├── wcscat_s.c
│   │       │   │   │   │           ├── wcscpy_s.c
│   │       │   │   │   │           ├── wcsncat_s.c
│   │       │   │   │   │           ├── wcsncpy_s.c
│   │       │   │   │   │           ├── wcstok_s.c
│   │       │   │   │   │           ├── wmemcpy_s.c
│   │       │   │   │   │           ├── wmemmove_s.c
│   │       │   │   │   │           └── wscanf_s.c
│   │       │   │   │   ├── src/
│   │       │   │   │   │   ├── ffi.cj
│   │       │   │   │   │   ├── graphic_2d.cj
│   │       │   │   │   │   ├── latex.cj
│   │       │   │   │   │   └── render.cj
│   │       │   │   │   └── test/
│   │       │   │   │       ├── DOC/
│   │       │   │   │       │   └── test.cj
│   │       │   │   │       ├── HLT/
│   │       │   │   │       │   ├── c_test1.cj
│   │       │   │   │       │   ├── c_test10.cj
│   │       │   │   │       │   ├── c_test11.cj
│   │       │   │   │       │   ├── c_test2.cj
│   │       │   │   │       │   ├── c_test222222222.cj
│   │       │   │   │       │   ├── c_test3.cj
│   │       │   │   │       │   ├── c_test4.cj
│   │       │   │   │       │   ├── c_test5.cj
│   │       │   │   │       │   ├── c_test6.cj
│   │       │   │   │       │   ├── c_test7.cj
│   │       │   │   │       │   ├── c_test8.cj
│   │       │   │   │       │   ├── c_test9.cj
│   │       │   │   │       │   ├── fortify_test1.cj
│   │       │   │   │       │   ├── fortify_test2.cj
│   │       │   │   │       │   ├── fortify_test3.cj
│   │       │   │   │       │   ├── fortify_test4.cj
│   │       │   │   │       │   ├── fortify_test5.cj
│   │       │   │   │       │   ├── later_test1.cj
│   │       │   │   │       │   ├── later_test10.cj
│   │       │   │   │       │   ├── later_test11.cj
│   │       │   │   │       │   ├── later_test12.cj
│   │       │   │   │       │   ├── later_test13.cj
│   │       │   │   │       │   ├── later_test14.cj
│   │       │   │   │       │   ├── later_test15.cj
│   │       │   │   │       │   ├── later_test16.cj
│   │       │   │   │       │   ├── later_test17.cj
│   │       │   │   │       │   ├── later_test18.cj
│   │       │   │   │       │   ├── later_test2.cj
│   │       │   │   │       │   ├── later_test3.cj
│   │       │   │   │       │   ├── later_test4.cj
│   │       │   │   │       │   ├── later_test5.cj
│   │       │   │   │       │   ├── later_test6.cj
│   │       │   │   │       │   ├── later_test7.cj
│   │       │   │   │       │   ├── later_test8.cj
│   │       │   │   │       │   ├── later_test9.cj
│   │       │   │   │       │   ├── test1.cj
│   │       │   │   │       │   ├── test2.cj
│   │       │   │   │       │   ├── test3.cj
│   │       │   │   │       │   ├── test4.cj
│   │       │   │   │       │   ├── test5.cj
│   │       │   │   │       │   ├── test6.cj
│   │       │   │   │       │   ├── test7.cj
│   │       │   │   │       │   └── test8.cj
│   │       │   │   │       └── LLT/
│   │       │   │   │           ├── c_test1.cj
│   │       │   │   │           ├── c_test10.cj
│   │       │   │   │           ├── c_test12.cj
│   │       │   │   │           ├── c_test13.cj
│   │       │   │   │           ├── c_test2.cj
│   │       │   │   │           ├── c_test3.cj
│   │       │   │   │           ├── c_test4.cj
│   │       │   │   │           ├── c_test5.cj
│   │       │   │   │           ├── c_test6.cj
│   │       │   │   │           ├── c_test7.cj
│   │       │   │   │           ├── c_test8.cj
│   │       │   │   │           ├── c_test9.cj
│   │       │   │   │           ├── later_test1.cj
│   │       │   │   │           ├── later_test10.cj
│   │       │   │   │           ├── later_test11.cj
│   │       │   │   │           ├── later_test12.cj
│   │       │   │   │           ├── later_test13.cj
│   │       │   │   │           ├── later_test14.cj
│   │       │   │   │           ├── later_test15.cj
│   │       │   │   │           ├── later_test16.cj
│   │       │   │   │           ├── later_test17.cj
│   │       │   │   │           ├── later_test18.cj
│   │       │   │   │           ├── later_test2.cj
│   │       │   │   │           ├── later_test3.cj
│   │       │   │   │           ├── later_test4.cj
│   │       │   │   │           ├── later_test5.cj
│   │       │   │   │           ├── later_test6.cj
│   │       │   │   │           ├── later_test7.cj
│   │       │   │   │           ├── later_test8.cj
│   │       │   │   │           ├── later_test9.cj
│   │       │   │   │           ├── test1.cj
│   │       │   │   │           ├── test2.cj
│   │       │   │   │           ├── test3.cj
│   │       │   │   │           ├── test4.cj
│   │       │   │   │           ├── test5.cj
│   │       │   │   │           ├── test6.cj
│   │       │   │   │           ├── test7.cj
│   │       │   │   │           ├── test8.cj
│   │       │   │   │           └── test9.cj
│   │       │   │   ├── napi_init.cpp
│   │       │   │   └── types/
│   │       │   │       └── liblatexentry/
│   │       │   │           ├── Index.d.ts
│   │       │   │           └── oh-package.json5
│   │       │   ├── ets/
│   │       │   │   ├── engine/
│   │       │   │   │   ├── base.ets
│   │       │   │   │   ├── engine.ets
│   │       │   │   │   ├── index.ets
│   │       │   │   │   ├── plugin.ets
│   │       │   │   │   └── service.ets
│   │       │   │   ├── index.ets
│   │       │   │   ├── markdown.ets
│   │       │   │   ├── render/
│   │       │   │   │   ├── component/
│   │       │   │   │   │   ├── builder.ets
│   │       │   │   │   │   ├── code.ets
│   │       │   │   │   │   ├── content-box.ets
│   │       │   │   │   │   ├── embed.ets
│   │       │   │   │   │   ├── fragment.ets
│   │       │   │   │   │   ├── image-gallery.ets
│   │       │   │   │   │   ├── index.ets
│   │       │   │   │   │   ├── table.ets
│   │       │   │   │   │   └── text.ets
│   │       │   │   │   ├── index.ets
│   │       │   │   │   ├── service.ets
│   │       │   │   │   ├── styled/
│   │       │   │   │   │   ├── build-in.ets
│   │       │   │   │   │   ├── index.ets
│   │       │   │   │   │   ├── styled-controller.ets
│   │       │   │   │   │   ├── styled-embed.ets
│   │       │   │   │   │   ├── styled-object.ets
│   │       │   │   │   │   ├── styled-value.ets
│   │       │   │   │   │   └── styled.ets
│   │       │   │   │   └── typing/
│   │       │   │   │       ├── controller.ets
│   │       │   │   │       ├── index.ets
│   │       │   │   │       └── timer.ets
│   │       │   │   ├── service/
│   │       │   │   │   ├── ast/
│   │       │   │   │   │   ├── index.ets
│   │       │   │   │   │   ├── markdown-it/
│   │       │   │   │   │   │   ├── index.ets
│   │       │   │   │   │   │   ├── plugin/
│   │       │   │   │   │   │   │   ├── index.ets
│   │       │   │   │   │   │   │   ├── markdown-it-emoji/
│   │       │   │   │   │   │   │   │   ├── index.ets
│   │       │   │   │   │   │   │   │   ├── markdown-it-emoji-bare.js
│   │       │   │   │   │   │   │   │   ├── markdown-it-emoji-light.js
│   │       │   │   │   │   │   │   │   └── markdown-it-emoji.js
│   │       │   │   │   │   │   │   ├── markdown-it-footnote/
│   │       │   │   │   │   │   │   │   ├── index.ets
│   │       │   │   │   │   │   │   │   └── markdown-it-footnote.js
│   │       │   │   │   │   │   │   ├── markdown-it-sub/
│   │       │   │   │   │   │   │   │   ├── index.ets
│   │       │   │   │   │   │   │   │   └── markdown-it-sub.js
│   │       │   │   │   │   │   │   ├── markdown-it-sup/
│   │       │   │   │   │   │   │   │   ├── index.ets
│   │       │   │   │   │   │   │   │   └── markdown-it-sup.js
│   │       │   │   │   │   │   │   ├── markdown-it-task-lists/
│   │       │   │   │   │   │   │   │   ├── index.ets
│   │       │   │   │   │   │   │   │   └── markdown-it-task-lists.js
│   │       │   │   │   │   │   │   └── vscode-markdown-it-katex/
│   │       │   │   │   │   │   │       ├── index.ets
│   │       │   │   │   │   │   │       └── vscode-markdown-it-katex.js
│   │       │   │   │   │   │   └── src/
│   │       │   │   │   │   │       ├── markdown-it.js
│   │       │   │   │   │   │       ├── token.ets
│   │       │   │   │   │   │       └── types.ets
│   │       │   │   │   │   ├── node/
│   │       │   │   │   │   │   ├── index.ets
│   │       │   │   │   │   │   ├── models.ets
│   │       │   │   │   │   │   ├── plugin/
│   │       │   │   │   │   │   │   ├── build-in.ets
│   │       │   │   │   │   │   │   ├── index.ets
│   │       │   │   │   │   │   │   └── plugin.ets
│   │       │   │   │   │   │   └── program.ets
│   │       │   │   │   │   └── service.ets
│   │       │   │   │   ├── code/
│   │       │   │   │   │   ├── highlightjs/
│   │       │   │   │   │   │   ├── index.ets
│   │       │   │   │   │   │   └── src/
│   │       │   │   │   │   │       ├── highlight.js
│   │       │   │   │   │   │       ├── index.ets
│   │       │   │   │   │   │       └── types.ets
│   │       │   │   │   │   ├── index.ets
│   │       │   │   │   │   ├── service.ets
│   │       │   │   │   │   └── style.ets
│   │       │   │   │   ├── css/
│   │       │   │   │   │   ├── csstree/
│   │       │   │   │   │   │   ├── csstree.rollup.esm.js
│   │       │   │   │   │   │   ├── index.d.ts
│   │       │   │   │   │   │   ├── index.js
│   │       │   │   │   │   │   └── version.js
│   │       │   │   │   │   ├── index.ets
│   │       │   │   │   │   ├── service.ets
│   │       │   │   │   │   └── styled.ets
│   │       │   │   │   ├── ctx/
│   │       │   │   │   │   ├── index.ets
│   │       │   │   │   │   └── service.ets
│   │       │   │   │   ├── event/
│   │       │   │   │   │   ├── index.ets
│   │       │   │   │   │   └── service.ets
│   │       │   │   │   ├── file/
│   │       │   │   │   │   ├── index.ets
│   │       │   │   │   │   └── service.ets
│   │       │   │   │   ├── html/
│   │       │   │   │   │   ├── dom-serializer/
│   │       │   │   │   │   │   ├── index.ets
│   │       │   │   │   │   │   └── src/
│   │       │   │   │   │   │       ├── foreignNames.d.ts
│   │       │   │   │   │   │       ├── foreignNames.js
│   │       │   │   │   │   │       ├── index.d.ts
│   │       │   │   │   │   │       └── index.js
│   │       │   │   │   │   ├── domelementtype/
│   │       │   │   │   │   │   ├── index.ets
│   │       │   │   │   │   │   └── src/
│   │       │   │   │   │   │       ├── index.d.ts
│   │       │   │   │   │   │       └── index.js
│   │       │   │   │   │   ├── domhandler/
│   │       │   │   │   │   │   ├── index.ets
│   │       │   │   │   │   │   └── src/
│   │       │   │   │   │   │       ├── index.d.ts
│   │       │   │   │   │   │       ├── index.js
│   │       │   │   │   │   │       ├── node.d.ts
│   │       │   │   │   │   │       └── node.js
│   │       │   │   │   │   ├── domutils/
│   │       │   │   │   │   │   ├── index.ets
│   │       │   │   │   │   │   └── src/
│   │       │   │   │   │   │       ├── feeds.d.ts
│   │       │   │   │   │   │       ├── feeds.js
│   │       │   │   │   │   │       ├── helpers.d.ts
│   │       │   │   │   │   │       ├── helpers.js
│   │       │   │   │   │   │       ├── index.d.ts
│   │       │   │   │   │   │       ├── index.js
│   │       │   │   │   │   │       ├── legacy.d.ts
│   │       │   │   │   │   │       ├── legacy.js
│   │       │   │   │   │   │       ├── manipulation.d.ts
│   │       │   │   │   │   │       ├── manipulation.js
│   │       │   │   │   │   │       ├── querying.d.ts
│   │       │   │   │   │   │       ├── querying.js
│   │       │   │   │   │   │       ├── stringify.d.ts
│   │       │   │   │   │   │       ├── stringify.js
│   │       │   │   │   │   │       ├── traversal.d.ts
│   │       │   │   │   │   │       └── traversal.js
│   │       │   │   │   │   ├── entities/
│   │       │   │   │   │   │   ├── index.ets
│   │       │   │   │   │   │   └── src/
│   │       │   │   │   │   │       ├── decode-codepoint.d.ts
│   │       │   │   │   │   │       ├── decode-codepoint.js
│   │       │   │   │   │   │       ├── decode.d.ts
│   │       │   │   │   │   │       ├── decode.js
│   │       │   │   │   │   │       ├── encode.d.ts
│   │       │   │   │   │   │       ├── encode.js
│   │       │   │   │   │   │       ├── escape.d.ts
│   │       │   │   │   │   │       ├── escape.js
│   │       │   │   │   │   │       ├── generated/
│   │       │   │   │   │   │       │   ├── decode-data-html.d.ts
│   │       │   │   │   │   │       │   ├── decode-data-html.js
│   │       │   │   │   │   │       │   ├── decode-data-xml.d.ts
│   │       │   │   │   │   │       │   ├── decode-data-xml.js
│   │       │   │   │   │   │       │   ├── encode-html.d.ts
│   │       │   │   │   │   │       │   └── encode-html.js
│   │       │   │   │   │   │       ├── index.d.ts
│   │       │   │   │   │   │       └── index.js
│   │       │   │   │   │   ├── htmlparser2/
│   │       │   │   │   │   │   ├── index.ets
│   │       │   │   │   │   │   └── src/
│   │       │   │   │   │   │       ├── Parser.d.ts
│   │       │   │   │   │   │       ├── Parser.js
│   │       │   │   │   │   │       ├── Tokenizer.d.ts
│   │       │   │   │   │   │       ├── Tokenizer.js
│   │       │   │   │   │   │       ├── index.d.ts
│   │       │   │   │   │   │       └── index.js
│   │       │   │   │   │   ├── index.ets
│   │       │   │   │   │   ├── service.ets
│   │       │   │   │   │   └── styled.ets
│   │       │   │   │   ├── image/
│   │       │   │   │   │   ├── index.ets
│   │       │   │   │   │   └── service.ets
│   │       │   │   │   ├── index.ets
│   │       │   │   │   └── math/
│   │       │   │   │       ├── index.ets
│   │       │   │   │       └── service.ets
│   │       │   │   ├── theme/
│   │       │   │   │   ├── index.ets
│   │       │   │   │   ├── service.ets
│   │       │   │   │   ├── styling.ets
│   │       │   │   │   └── theme.ets
│   │       │   │   └── util/
│   │       │   │       ├── color.ets
│   │       │   │       ├── component.ets
│   │       │   │       ├── crypto.ets
│   │       │   │       ├── dom.ets
│   │       │   │       ├── error.ets
│   │       │   │       ├── event.ets
│   │       │   │       ├── index.ets
│   │       │   │       ├── layout.ets
│   │       │   │       ├── log.ets
│   │       │   │       └── uuid/
│   │       │   │           ├── index.ets
│   │       │   │           └── src/
│   │       │   │               ├── index.js
│   │       │   │               ├── max.js
│   │       │   │               ├── md5.js
│   │       │   │               ├── native.js
│   │       │   │               ├── nil.js
│   │       │   │               ├── parse.js
│   │       │   │               ├── regex.js
│   │       │   │               ├── rng.js
│   │       │   │               ├── sha1.js
│   │       │   │               ├── stringify.js
│   │       │   │               ├── types.js
│   │       │   │               ├── uuid-bin.js
│   │       │   │               ├── v1.js
│   │       │   │               ├── v1ToV6.js
│   │       │   │               ├── v3.js
│   │       │   │               ├── v35.js
│   │       │   │               ├── v4.js
│   │       │   │               ├── v5.js
│   │       │   │               ├── v6.js
│   │       │   │               ├── v6ToV1.js
│   │       │   │               ├── v7.js
│   │       │   │               ├── validate.js
│   │       │   │               └── version.js
│   │       │   ├── module.json5
│   │       │   └── resources/
│   │       │       ├── base/
│   │       │       │   └── element/
│   │       │       │       └── string.json
│   │       │       ├── en_US/
│   │       │       │   └── element/
│   │       │       │       └── string.json
│   │       │       ├── resfile/
│   │       │       │   └── res/
│   │       │       │       ├── cyrillic/
│   │       │       │       │   ├── cyrillic.map.xml
│   │       │       │       │   ├── language_cyrillic.xml
│   │       │       │       │   ├── mappings_cyrillic.xml
│   │       │       │       │   ├── symbols_cyrillic.xml
│   │       │       │       │   ├── wnbx10.xml
│   │       │       │       │   ├── wnbxti10.xml
│   │       │       │       │   ├── wnr10.xml
│   │       │       │       │   ├── wnss10.xml
│   │       │       │       │   ├── wnssbx10.xml
│   │       │       │       │   ├── wnssi10.xml
│   │       │       │       │   ├── wnti10.xml
│   │       │       │       │   └── wntt10.xml
│   │       │       │       ├── fonts/
│   │       │       │       │   └── licences/
│   │       │       │       │       ├── Knuth_License.txt
│   │       │       │       │       ├── License_for_dsrom.txt
│   │       │       │       │       └── OFL.txt
│   │       │       │       └── greek/
│   │       │       │           ├── fcmbipg.xml
│   │       │       │           ├── fcmbpg.xml
│   │       │       │           ├── fcmripg.xml
│   │       │       │           ├── fcmrpg.xml
│   │       │       │           ├── fcsbpg.xml
│   │       │       │           ├── fcsropg.xml
│   │       │       │           ├── fcsrpg.xml
│   │       │       │           ├── fctrpg.xml
│   │       │       │           ├── greek.map.xml
│   │       │       │           ├── language_greek.xml
│   │       │       │           ├── mappings_greek.xml
│   │       │       │           └── symbols_greek.xml
│   │       │       └── zh_CN/
│   │       │           └── element/
│   │       │               └── string.json
│   │       ├── ohosTest/
│   │       │   ├── ets/
│   │       │   │   └── test/
│   │       │   │       ├── Ability.test.ets
│   │       │   │       └── List.test.ets
│   │       │   └── module.json5
│   │       └── test/
│   │           ├── List.test.ets
│   │           └── LocalUnit.test.ets
│   ├── oh-package.json5
│   └── playground/
│       ├── .gitignore
│       ├── build-profile.json5
│       ├── hvigorfile.ts
│       ├── obfuscation-rules.txt
│       ├── oh-package.json5
│       └── src/
│           ├── main/
│           │   ├── ets/
│           │   │   ├── pages/
│           │   │   │   ├── board.ets
│           │   │   │   ├── feature-detail.ets
│           │   │   │   ├── feature-list.ets
│           │   │   │   ├── index.ets
│           │   │   │   └── shared/
│           │   │   │       ├── feature.ets
│           │   │   │       ├── index.ets
│           │   │   │       └── navigation.ets
│           │   │   ├── playgroundability/
│           │   │   │   └── PlaygroundAbility.ets
│           │   │   └── playgroundbackupability/
│           │   │       └── PlaygroundBackupAbility.ets
│           │   ├── module.json5
│           │   └── resources/
│           │       ├── base/
│           │       │   ├── element/
│           │       │   │   ├── color.json
│           │       │   │   ├── float.json
│           │       │   │   └── string.json
│           │       │   ├── media/
│           │       │   │   └── layered_image.json
│           │       │   └── profile/
│           │       │       ├── backup_config.json
│           │       │       └── main_pages.json
│           │       ├── dark/
│           │       │   └── element/
│           │       │       └── color.json
│           │       └── rawfile/
│           │           └── feature/
│           │               ├── cmark-gfm-bench/
│           │               │   ├── block-bq-flat.md
│           │               │   ├── block-bq-nested.md
│           │               │   ├── block-code.md
│           │               │   ├── block-fences.md
│           │               │   ├── block-heading.md
│           │               │   ├── block-hr.md
│           │               │   ├── block-html.md
│           │               │   ├── block-lheading.md
│           │               │   ├── block-list-flat.md
│           │               │   ├── block-list-nested.md
│           │               │   ├── block-ref-flat.md
│           │               │   ├── block-ref-nested.md
│           │               │   ├── inline-autolink.md
│           │               │   ├── inline-backticks.md
│           │               │   ├── inline-em-flat.md
│           │               │   ├── inline-em-nested.md
│           │               │   ├── inline-em-worst.md
│           │               │   ├── inline-entity.md
│           │               │   ├── inline-escape.md
│           │               │   ├── inline-html.md
│           │               │   ├── inline-links-flat.md
│           │               │   ├── inline-links-nested.md
│           │               │   ├── inline-newlines.md
│           │               │   ├── lorem1.md
│           │               │   └── rawtabs.md
│           │               ├── markdown-ant/
│           │               │   ├── html-tag-a.md
│           │               │   ├── html-tag-mark.md
│           │               │   ├── html-tag-sub.md
│           │               │   ├── html-tag-sup.md
│           │               │   └── html-tag-u.md
│           │               └── markdown-it/
│           │                   ├── code.md
│           │                   ├── emoji.md
│           │                   ├── emph.md
│           │                   ├── footnote.md
│           │                   ├── heading.md
│           │                   ├── image.md
│           │                   ├── line-break.md
│           │                   ├── link.md
│           │                   ├── list.md
│           │                   ├── math.md
│           │                   ├── paragraph.md
│           │                   ├── quote.md
│           │                   ├── strike-through.md
│           │                   ├── strong.md
│           │                   ├── sub.md
│           │                   ├── sup.md
│           │                   ├── table.md
│           │                   ├── task.md
│           │                   └── thematic-break.md
│           ├── mock/
│           │   └── mock-config.json5
│           ├── ohosTest/
│           │   ├── ets/
│           │   │   └── test/
│           │   │       ├── Ability.test.ets
│           │   │       └── List.test.ets
│           │   └── module.json5
│           └── test/
│               ├── List.test.ets
│               └── LocalUnit.test.ets
├── INSTALL.md
├── LICENSE
├── README.md
└── iOS/
    ├── AntMarkdown/
    │   ├── .ruby-version
    │   ├── .travis.yml
    │   ├── AntMarkdown.xcodeproj/
    │   │   └── project.pbxproj
    │   ├── Makefile
    │   ├── Resources/
    │   │   ├── AntMarkdown.bundle/
    │   │   │   └── Images.xcassets/
    │   │   │       └── Contents.json
    │   │   └── mathFonts.bundle/
    │   │       ├── xits-math.otf
    │   │       └── xits-math.plist
    │   ├── Scripts/
    │   │   └── inject.ini
    │   ├── Sources/
    │   │   ├── External/
    │   │   │   ├── CocoaMarkdown/
    │   │   │   │   ├── CMAttributeRun.h
    │   │   │   │   ├── CMAttributeRun.m
    │   │   │   │   ├── CMAttributedStringRenderer.h
    │   │   │   │   ├── CMAttributedStringRenderer.m
    │   │   │   │   ├── CMAttributedStringRenderer_Private.h
    │   │   │   │   ├── CMBlockTextAttachment.h
    │   │   │   │   ├── CMBlockTextAttachment.m
    │   │   │   │   ├── CMCascadingAttributeStack.h
    │   │   │   │   ├── CMCascadingAttributeStack.m
    │   │   │   │   ├── CMDocument+AttributedStringAdditions.h
    │   │   │   │   ├── CMDocument+AttributedStringAdditions.m
    │   │   │   │   ├── CMDocument+HTMLAdditions.h
    │   │   │   │   ├── CMDocument+HTMLAdditions.m
    │   │   │   │   ├── CMDocument.h
    │   │   │   │   ├── CMDocument.m
    │   │   │   │   ├── CMDocument_Private.h
    │   │   │   │   ├── CMHTMLElement.h
    │   │   │   │   ├── CMHTMLElement.m
    │   │   │   │   ├── CMHTMLElementTransformer.h
    │   │   │   │   ├── CMHTMLRenderer.h
    │   │   │   │   ├── CMHTMLRenderer.m
    │   │   │   │   ├── CMHTMLScriptTransformer.h
    │   │   │   │   ├── CMHTMLScriptTransformer.m
    │   │   │   │   ├── CMHTMLScriptTransformer_Private.h
    │   │   │   │   ├── CMHTMLStrikethroughTransformer.h
    │   │   │   │   ├── CMHTMLStrikethroughTransformer.m
    │   │   │   │   ├── CMHTMLSubscriptTransformer.h
    │   │   │   │   ├── CMHTMLSubscriptTransformer.m
    │   │   │   │   ├── CMHTMLSuperscriptTransformer.h
    │   │   │   │   ├── CMHTMLSuperscriptTransformer.m
    │   │   │   │   ├── CMHTMLUnderlineTransformer.h
    │   │   │   │   ├── CMHTMLUnderlineTransformer.m
    │   │   │   │   ├── CMHTMLUtilities.h
    │   │   │   │   ├── CMHTMLUtilities.m
    │   │   │   │   ├── CMHorizontalRuleAttachment.h
    │   │   │   │   ├── CMHorizontalRuleAttachment.m
    │   │   │   │   ├── CMImageTextAttachment.h
    │   │   │   │   ├── CMImageTextAttachment.m
    │   │   │   │   ├── CMInlineTextAttachment.h
    │   │   │   │   ├── CMInlineTextAttachment.m
    │   │   │   │   ├── CMIterator.h
    │   │   │   │   ├── CMIterator.m
    │   │   │   │   ├── CMNode+Table.h
    │   │   │   │   ├── CMNode+Table.m
    │   │   │   │   ├── CMNode.h
    │   │   │   │   ├── CMNode.m
    │   │   │   │   ├── CMNode_Private.h
    │   │   │   │   ├── CMParser.h
    │   │   │   │   ├── CMParser.m
    │   │   │   │   ├── CMPlatformDefines.h
    │   │   │   │   ├── CMStack.h
    │   │   │   │   ├── CMStack.m
    │   │   │   │   ├── CMTaskCheckAttachment+Private.h
    │   │   │   │   ├── CMTaskCheckAttachment.h
    │   │   │   │   ├── CMTaskCheckAttachment.m
    │   │   │   │   ├── CMTextAttributes.h
    │   │   │   │   ├── CMTextAttributes.m
    │   │   │   │   ├── CocoaMarkdown.h
    │   │   │   │   └── Info.plist
    │   │   │   ├── Ono/
    │   │   │   │   ├── ONOXMLDocument.h
    │   │   │   │   ├── ONOXMLDocument.m
    │   │   │   │   └── Ono.h
    │   │   │   ├── cmark-gfm/
    │   │   │   │   ├── cmark-gfm_export.h
    │   │   │   │   ├── cmark-gfm_version.h
    │   │   │   │   ├── config.h
    │   │   │   │   ├── extensions/
    │   │   │   │   │   ├── CMakeLists.txt
    │   │   │   │   │   ├── autolink.c
    │   │   │   │   │   ├── autolink.h
    │   │   │   │   │   ├── cmark-gfm-core-extensions.h
    │   │   │   │   │   ├── core-extensions.c
    │   │   │   │   │   ├── emoji.c
    │   │   │   │   │   ├── emoji.h
    │   │   │   │   │   ├── ext_scanners.c
    │   │   │   │   │   ├── ext_scanners.h
    │   │   │   │   │   ├── ext_scanners.re
    │   │   │   │   │   ├── math_mark.c
    │   │   │   │   │   ├── math_mark.h
    │   │   │   │   │   ├── strikethrough.c
    │   │   │   │   │   ├── strikethrough.h
    │   │   │   │   │   ├── table.c
    │   │   │   │   │   ├── table.h
    │   │   │   │   │   ├── tagfilter.c
    │   │   │   │   │   ├── tagfilter.h
    │   │   │   │   │   ├── tasklist.c
    │   │   │   │   │   └── tasklist.h
    │   │   │   │   └── src/
    │   │   │   │       ├── CMakeLists.txt
    │   │   │   │       ├── arena.c
    │   │   │   │       ├── blocks.c
    │   │   │   │       ├── buffer.c
    │   │   │   │       ├── buffer.h
    │   │   │   │       ├── case_fold_switch.inc
    │   │   │   │       ├── chunk.h
    │   │   │   │       ├── cmark-gfm-extension_api.h
    │   │   │   │       ├── cmark-gfm.h
    │   │   │   │       ├── cmark-gfm_version.h.in
    │   │   │   │       ├── cmark.c
    │   │   │   │       ├── cmark_ctype.c
    │   │   │   │       ├── cmark_ctype.h
    │   │   │   │       ├── commonmark.c
    │   │   │   │       ├── config.h.in
    │   │   │   │       ├── entities.inc
    │   │   │   │       ├── footnotes.c
    │   │   │   │       ├── footnotes.h
    │   │   │   │       ├── houdini.h
    │   │   │   │       ├── houdini_href_e.c
    │   │   │   │       ├── houdini_html_e.c
    │   │   │   │       ├── houdini_html_u.c
    │   │   │   │       ├── html.c
    │   │   │   │       ├── html.h
    │   │   │   │       ├── inlines.c
    │   │   │   │       ├── inlines.h
    │   │   │   │       ├── iterator.c
    │   │   │   │       ├── iterator.h
    │   │   │   │       ├── latex.c
    │   │   │   │       ├── libcmark-gfm.pc.in
    │   │   │   │       ├── linked_list.c
    │   │   │   │       ├── man.c
    │   │   │   │       ├── map.c
    │   │   │   │       ├── map.h
    │   │   │   │       ├── node.c
    │   │   │   │       ├── node.h
    │   │   │   │       ├── parser.h
    │   │   │   │       ├── plaintext.c
    │   │   │   │       ├── plugin.c
    │   │   │   │       ├── plugin.h
    │   │   │   │       ├── references.c
    │   │   │   │       ├── references.h
    │   │   │   │       ├── registry.c
    │   │   │   │       ├── registry.h
    │   │   │   │       ├── render.c
    │   │   │   │       ├── render.h
    │   │   │   │       ├── scanners.c
    │   │   │   │       ├── scanners.h
    │   │   │   │       ├── scanners.re
    │   │   │   │       ├── syntax_extension.c
    │   │   │   │       ├── syntax_extension.h
    │   │   │   │       ├── utf8.c
    │   │   │   │       ├── utf8.h
    │   │   │   │       └── xml.c
    │   │   │   └── iosMath/
    │   │   │       ├── IosMath.h
    │   │   │       ├── lib/
    │   │   │       │   ├── MTMathAtomFactory.h
    │   │   │       │   ├── MTMathAtomFactory.m
    │   │   │       │   ├── MTMathList.h
    │   │   │       │   ├── MTMathList.m
    │   │   │       │   ├── MTMathListBuilder.h
    │   │   │       │   ├── MTMathListBuilder.m
    │   │   │       │   ├── MTMathListIndex.h
    │   │   │       │   ├── MTMathListIndex.m
    │   │   │       │   ├── MTUnicode.h
    │   │   │       │   └── MTUnicode.m
    │   │   │       └── render/
    │   │   │           ├── MTConfig.h
    │   │   │           ├── MTFont.h
    │   │   │           ├── MTFont.m
    │   │   │           ├── MTFontManager.h
    │   │   │           ├── MTFontManager.m
    │   │   │           ├── MTLabel.h
    │   │   │           ├── MTLabel.m
    │   │   │           ├── MTMathListDisplay.h
    │   │   │           ├── MTMathListDisplay.m
    │   │   │           ├── MTMathUILabel.h
    │   │   │           ├── MTMathUILabel.m
    │   │   │           ├── NSBezierPath+addLineToPoint.h
    │   │   │           ├── NSBezierPath+addLineToPoint.m
    │   │   │           ├── NSColor+HexString.h
    │   │   │           ├── NSColor+HexString.m
    │   │   │           ├── NSView+backgroundColor.h
    │   │   │           ├── NSView+backgroundColor.m
    │   │   │           ├── UIColor+HexString.h
    │   │   │           ├── UIColor+HexString.m
    │   │   │           └── internal/
    │   │   │               ├── MTFont+Internal.h
    │   │   │               ├── MTFontMathTable.h
    │   │   │               ├── MTFontMathTable.m
    │   │   │               ├── MTMathListDisplayInternal.h
    │   │   │               ├── MTTypesetter.h
    │   │   │               └── MTTypesetter.m
    │   │   └── Public/
    │   │       ├── AMAttributedStringRenderer.h
    │   │       ├── AMAttributedStringRenderer.m
    │   │       ├── AMBlockMathAttachment.h
    │   │       ├── AMBlockMathAttachment.m
    │   │       ├── AMCodeHighlighter.h
    │   │       ├── AMCodeHighlighter.m
    │   │       ├── AMCodeViewAttachment.h
    │   │       ├── AMCodeViewAttachment.m
    │   │       ├── AMDrawable.h
    │   │       ├── AMDrawable.m
    │   │       ├── AMEmojiManager.h
    │   │       ├── AMEmojiManager.m
    │   │       ├── AMGradient.h
    │   │       ├── AMGradient.m
    │   │       ├── AMGradientLayer.h
    │   │       ├── AMGradientLayer.m
    │   │       ├── AMGradientView.h
    │   │       ├── AMGradientView.m
    │   │       ├── AMHTMLTransformer.h
    │   │       ├── AMHTMLTransformer.m
    │   │       ├── AMIconAttachment.h
    │   │       ├── AMIconAttachment.m
    │   │       ├── AMIconLinkAttachment.h
    │   │       ├── AMIconLinkAttachment.m
    │   │       ├── AMImageTextAttachment.h
    │   │       ├── AMImageTextAttachment.m
    │   │       ├── AMInlineMathAttachment.h
    │   │       ├── AMInlineMathAttachment.m
    │   │       ├── AMLayoutManager+Quote.h
    │   │       ├── AMLayoutManager+Quote.m
    │   │       ├── AMLayoutManager.h
    │   │       ├── AMLayoutManager.m
    │   │       ├── AMMarkDownTableViewBlowUpControllerViewController.h
    │   │       ├── AMMarkDownTableViewBlowUpControllerViewController.m
    │   │       ├── AMMarkdownCodeView.h
    │   │       ├── AMMarkdownCodeView.m
    │   │       ├── AMMarkdownTableLayout.h
    │   │       ├── AMMarkdownTableLayout.m
    │   │       ├── AMMarkdownTableView.h
    │   │       ├── AMMarkdownTableView.m
    │   │       ├── AMTableViewAttachment.h
    │   │       ├── AMTableViewAttachment.m
    │   │       ├── AMTextBackground.h
    │   │       ├── AMTextBackground.m
    │   │       ├── AMTextStyles.h
    │   │       ├── AMTextStyles.m
    │   │       ├── AMUnderline.h
    │   │       ├── AMUnderline.m
    │   │       ├── AMUtils.h
    │   │       ├── AMUtils.m
    │   │       ├── AMViewAttachment.h
    │   │       ├── AMViewAttachment.m
    │   │       ├── AntMarkdown.h
    │   │       ├── NSMutableAttributedString+AntMarkdown.h
    │   │       ├── NSMutableAttributedString+AntMarkdown.m
    │   │       ├── NSString+AntMarkdown.h
    │   │       ├── NSString+AntMarkdown.m
    │   │       ├── UILabel+AntMarkdown.h
    │   │       ├── UILabel+AntMarkdown.m
    │   │       ├── UITextView+AntMarkdown.h
    │   │       └── UITextView+AntMarkdown.m
    │   ├── SupportingFiles/
    │   │   ├── AntMarkdown-Framework.plist
    │   │   ├── AntMarkdown-Info.plist
    │   │   ├── AntMarkdown-Prefix.pch
    │   │   └── en.lproj/
    │   │       └── InfoPlist.strings
    │   └── project.yml
    ├── FluidMarkdown/
    │   ├── AppDelegate.h
    │   ├── AppDelegate.m
    │   ├── Assets.xcassets/
    │   │   ├── AccentColor.colorset/
    │   │   │   └── Contents.json
    │   │   ├── AppIcon.appiconset/
    │   │   │   └── Contents.json
    │   │   └── Contents.json
    │   ├── Base.lproj/
    │   │   ├── LaunchScreen.storyboard
    │   │   └── Main.storyboard
    │   ├── Example/
    │   │   ├── AIChatViewController.h
    │   │   ├── AIChatViewController.m
    │   │   ├── MenuViewController.h
    │   │   ├── MenuViewController.m
    │   │   ├── StreamPreviewViewController.h
    │   │   ├── StreamPreviewViewController.m
    │   │   ├── ToastView.h
    │   │   └── ToastView.m
    │   ├── Info.plist
    │   ├── SceneDelegate.h
    │   ├── SceneDelegate.m
    │   ├── Sources/
    │   │   ├── API/
    │   │   │   └── AMXMarkdownWidget.h
    │   │   ├── Markdown/
    │   │   │   ├── AMTextStyles+CardUIPlugins.h
    │   │   │   ├── AMTextStyles+CardUIPlugins.m
    │   │   │   ├── AMXFootnodeBuilder.h
    │   │   │   ├── AMXFootnodeBuilder.m
    │   │   │   ├── AMXMarkdownCodeView.h
    │   │   │   ├── AMXMarkdownCodeView.m
    │   │   │   ├── AMXMarkdownCodeViewAttachment.h
    │   │   │   ├── AMXMarkdownCodeViewAttachment.m
    │   │   │   ├── AMXMarkdownCustomRenderEventModel.h
    │   │   │   ├── AMXMarkdownCustomRenderEventModel.m
    │   │   │   ├── AMXMarkdownHelper.h
    │   │   │   ├── AMXMarkdownHelper.m
    │   │   │   ├── AMXMarkdownImageAttachmentBuilder.h
    │   │   │   ├── AMXMarkdownImageAttachmentBuilder.m
    │   │   │   ├── AMXMarkdownImageTextAttachment.h
    │   │   │   ├── AMXMarkdownImageTextAttachment.m
    │   │   │   ├── AMXMarkdownLogModel.h
    │   │   │   ├── AMXMarkdownLogModel.m
    │   │   │   ├── AMXMarkdownTextView.h
    │   │   │   ├── AMXMarkdownTextView.m
    │   │   │   ├── AMXMarkdownTimer.h
    │   │   │   └── AMXMarkdownTimer.m
    │   │   ├── Style/
    │   │   │   ├── AMXMarkdownStyle.h
    │   │   │   ├── AMXMarkdownStyle.m
    │   │   │   ├── AMXRenderService.h
    │   │   │   └── AMXRenderService.m
    │   │   └── Util/
    │   │       ├── AMXMarkdownDefine.h
    │   │       ├── AMXMarkdownUtil.h
    │   │       └── AMXMarkdownUtil.m
    │   ├── ViewController.h
    │   ├── ViewController.m
    │   └── main.m
    ├── FluidMarkdown.xcodeproj/
    │   ├── project.pbxproj
    │   └── project.xcworkspace/
    │       └── contents.xcworkspacedata
    ├── FluidMarkdown.xcworkspace/
    │   └── contents.xcworkspacedata
    └── Resources/
        ├── AntMarkdown.bundle/
        │   └── Images.xcassets/
        │       └── Contents.json
        ├── data1.txt
        ├── data2.txt
        ├── data3.txt
        └── mathFonts.bundle/
            ├── xits-math.otf
            └── xits-math.plist

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
Pods/
DerivedData/
Products/
Podfile.lock
out/
xcschememanagement.plist
xcshareddata/
*.xcscmblueprint
xcuserdata/
Podfile_cp
.DS_S*
.DS_Store
node_modules


================================================
FILE: Android/AntFluid/.gitignore
================================================
*.iml
.gradle
/local.properties
/.idea/caches
/.idea/libraries
/.idea/modules.xml
/.idea/workspace.xml
/.idea/navEditor.xml
/.idea/assetWizardSettings.xml
/.idea/*
.DS_Store
/build
/captures
.externalNativeBuild
.cxx
local.properties


================================================
FILE: Android/AntFluid/app-sample/.gitignore
================================================
/build

================================================
FILE: Android/AntFluid/app-sample/build.gradle
================================================
plugins {
    alias(libs.plugins.android.application)
    alias(libs.plugins.kotlin.android)
    alias(libs.plugins.kotlin.compose)
}

android {
    namespace 'com.fluid.afm'
    compileSdk 35

    defaultConfig {
        applicationId "com.fluid.afm"
        minSdk 21
        targetSdk 35
        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_11
        targetCompatibility JavaVersion.VERSION_11
    }
    kotlinOptions {
        jvmTarget = '11'
    }
}

dependencies {
    implementation libs.androidx.appcompat
    implementation libs.androidx.core.ktx
    implementation libs.androidx.lifecycle.runtime.ktx
    implementation libs.androidx.activity.compose
    implementation platform(libs.androidx.compose.bom)
    implementation libs.androidx.ui
    implementation libs.androidx.ui.graphics
    implementation libs.androidx.ui.tooling.preview
    implementation libs.androidx.material3
    api project(':fluid-markdown')
    implementation libs.material
    implementation libs.androidx.activity
    implementation libs.androidx.constraintlayout
    testImplementation libs.junit
    androidTestImplementation libs.androidx.junit
    androidTestImplementation libs.androidx.espresso.core
    androidTestImplementation platform(libs.androidx.compose.bom)
    androidTestImplementation libs.androidx.ui.test.junit4
    debugImplementation libs.androidx.ui.tooling
    debugImplementation libs.androidx.ui.test.manifest
    implementation 'com.github.bumptech.glide:glide:5.0.4'

}

================================================
FILE: Android/AntFluid/app-sample/proguard-rules.pro
================================================
# 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

================================================
FILE: Android/AntFluid/app-sample/src/androidTest/java/com/fluid/markdown/ExampleInstrumentedTest.kt
================================================
package com.fluid.markdown

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.fluid.afm", appContext.packageName)
    }
}

================================================
FILE: Android/AntFluid/app-sample/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.AntFluidMarkdown"
        tools:targetApi="31">
        <activity
            android:name="com.fluid.markdown.demos.ListActivity"
            android:exported="false" />
        <activity
            android:name="com.fluid.markdown.demos.PrinterActivity"
            android:theme="@style/Theme.AntFluidMarkdown" />
        <activity
            android:name="com.fluid.markdown.MainActivity"
            android:exported="true"
            android:label="@string/app_name"
            android:theme="@style/Theme.AntFluidMarkdown">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

================================================
FILE: Android/AntFluid/app-sample/src/main/java/com/fluid/markdown/MainActivity.kt
================================================
package com.fluid.markdown

import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.core.widget.NestedScrollView
import com.fluid.afm.AFMInitializer
import com.fluid.afm.R
import com.fluid.afm.markdown.ElementClickEventCallback
import com.fluid.afm.markdown.html.SpanTextClickableSpan.ClickableTextType
import com.fluid.afm.markdown.model.EventModel
import com.fluid.afm.markdown.widget.PrinterMarkDownTextView
import com.fluid.afm.styles.MarkdownStyles
import com.fluid.afm.styles.TitleStyle
import com.fluid.markdown.demos.ListActivity
import com.fluid.markdown.demos.PrinterActivity


class MainActivity : AppCompatActivity() {
    companion object {
        @JvmStatic
        var initialed = false
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.layout_main)
        val markdown = resources.getString(R.string.toPrinter) + resources.getString(R.string.toList) + resources.getString(R.string.sample)

        val markdownTextView = findViewById<PrinterMarkDownTextView>(R.id.textView)
        if (!initialed) {
            initialed = true
            AFMInitializer.init(this, null, MyImageHandler(), null)
        }
        val styles =  MarkdownStyles.getDefaultStyles()
        styles.linkStyle().icon("local://mipmap/link")
        styles.setTitleStyle(0, TitleStyle.create(1.5f).icon("local://mipmap/title"))
        markdownTextView.init(styles, object : ElementClickEventCallback {
                override fun onLinkClicked(params: Map<String?, Any?>?): Boolean {
                    val url = params?.get(ElementClickEventCallback.PARAM_KEY_LINK) as String?
                    if(url.equals("open://printer")) {
                        startActivity(Intent(this@MainActivity, PrinterActivity::class.java))
                        return true
                    } else if (url.equals("open://list_printer")) {
                        startActivity(Intent(this@MainActivity, ListActivity::class.java))
                        return true
                    }
                    Toast.makeText(this@MainActivity, "link click$url", Toast.LENGTH_SHORT).show()
                    return false
                }

                override fun onFootnoteClicked(index: String) {
                    Toast.makeText(this@MainActivity, "footnote click$index", Toast.LENGTH_SHORT).show()

                }

                override fun onImageClicked(url: String?, description: String?) {
                    Toast.makeText(this@MainActivity, "onImageClicked click-$description", Toast.LENGTH_SHORT).show()
                }

                override fun onTextClickableSpanClicked(
                    widget: View?,
                    link: String?,
                    entityID: String?,
                    type: ClickableTextType?
                ): Boolean {
                    Toast.makeText(this@MainActivity, "clickable click link$link type$type entityID$entityID", Toast.LENGTH_SHORT).show()
                    return false
                }

                override fun exposureSpmBehavior(models: MutableList<EventModel>?) {
                    Log.d("exposureSpmBehavior", models.toString())
                }
            }
        )

        markdownTextView.setMarkdownText(markdown)
        val scroller = findViewById<NestedScrollView>(R.id.scrollView)

        scroller.setOnScrollChangeListener(object : NestedScrollView.OnScrollChangeListener {
            override fun onScrollChange(
                v: NestedScrollView,
                scrollX: Int,
                scrollY: Int,
                oldScrollX: Int,
                oldScrollY: Int
            ) {
                markdownTextView.handleExposureSpm()
            }

        })
    }
}

================================================
FILE: Android/AntFluid/app-sample/src/main/java/com/fluid/markdown/MyImageHandler.java
================================================
package com.fluid.markdown;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.res.ResourcesCompat;

import com.bumptech.glide.Glide;
import com.bumptech.glide.request.RequestOptions;
import com.bumptech.glide.request.target.SimpleTarget;
import com.bumptech.glide.request.transition.Transition;
import com.fluid.afm.handler.ImageHandler;

import com.fluid.afm.ContextHolder;
import com.fluid.afm.utils.Utils;
import com.fluid.afm.func.Callback;

public class MyImageHandler implements ImageHandler {
    @Override
    public void loadImage(Context context, String url, Callback<Drawable> callback) {
        if (url.startsWith("local://")) {
            Drawable drawable = loadDrawableResource(context, url, 0, 0);
            if (drawable != null) {
                callback.onSuccess(drawable);
            }
            return;
        }
        int defaultW = context.getResources().getDisplayMetrics().widthPixels - Utils.dpToPx(context, 24);
        Glide.with(context).load(url).apply(new RequestOptions().override(defaultW)).into(new SimpleTarget<Drawable>() {
            @Override
            public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
                callback.onSuccess(resource);
            }
        });
    }

    private static Drawable loadDrawableResource(Context context, String url, int width, int height) {
        Uri uri = Uri.parse(url);
        String host = uri.getHost();
        String path = uri.getPathSegments().get(0);
        int resourceId = getResourceIdByName(context.getPackageName(), host, path);
        if (resourceId != 0) {
            Drawable drawable = ResourcesCompat.getDrawable(context.getResources(), resourceId, null);
            if (drawable instanceof BitmapDrawable
                    && width > 0 && height > 0
                    && (((BitmapDrawable) drawable).getBitmap().getWidth() != width ||((BitmapDrawable) drawable).getBitmap().getHeight() != height)) {
            Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();
                    int imgWidth = bitmap.getWidth();
                    int imgHeight = bitmap.getHeight();
                    float scale = Math.max((float) height / imgHeight, (float) width / imgWidth);
                    int newWidth = Math.round(imgWidth * scale);
                    int newHeight = Math.round(imgHeight * scale);
                    Bitmap scaledBitmap = Bitmap.createScaledBitmap(bitmap, newWidth, newHeight, true);
                    int xCrop = (newWidth - width) / 2;
                    int yCrop = (newHeight - height) / 2;
                    bitmap = Bitmap.createBitmap(scaledBitmap, xCrop, yCrop, width, height);
                return new BitmapDrawable(ContextHolder.getContext().getResources(), bitmap);
            }
            return drawable;
        }
        return null;
    }
    private static int getResourceIdByName(String packageName, String className, String name) {

        Class<?> r;
        int id = 0;
        try {
            r = Class.forName(packageName + ".R");
            Class<?>[] classes = r.getClasses();
            Class<?> desireClass = null;
            for (int i = 0; i < classes.length; i++) {
                if (classes[i].getName().split("\\$")[1].equals(className)) {
                    desireClass = classes[i];
                    break;
                }
            }
            if (desireClass != null) id = desireClass.getField(name).getInt(desireClass);
        } catch (ClassNotFoundException | IllegalAccessException | NoSuchFieldException | SecurityException | IllegalArgumentException e) {
            e.printStackTrace();
        }
        return id;
    }

    @Override
    public void loadImage(Context context, String url, int width, int height, Callback<Drawable> callback) {
        if (url.startsWith("local://")) {
            Drawable drawable = loadDrawableResource(context, url, width, height);
            if (drawable != null) {
                callback.onSuccess(drawable);
            }
            return;
        }
        Glide.with(context).load(url).apply(new RequestOptions().override(width, height)).into(new SimpleTarget<Drawable>() {
            @Override
            public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
                callback.onSuccess(resource);
            }
        });
    }

    @Override
    public Drawable loadImageSync(Context context, String url) {
        if (url.startsWith("local://")) {
            return loadDrawableResource(context, url, 0, 0);
        }
        int defaultW = context.getResources().getDisplayMetrics().widthPixels - Utils.dpToPx(context, 24);
        try {
            return Glide.with(context).asDrawable().load(url).into(defaultW, defaultW).get();
        } catch (Throwable e) {
        }
        return null;
    }

    @Override
    public Drawable loadImageSync(Context context, String url, int width, int height) {
        if (url.startsWith("local://")) {
            return loadDrawableResource(context, url, width, height);
        }
        try {
            return Glide.with(context).asDrawable().load(url).into(width,  height).get();
        } catch (Throwable e) {
        }
        return null;
    }
}


================================================
FILE: Android/AntFluid/app-sample/src/main/java/com/fluid/markdown/demos/ListActivity.java
================================================
package com.fluid.markdown.demos;

import android.os.Bundle;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.fluid.afm.R;


public class ListActivity extends AppCompatActivity {


    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list);
        String sampleString = getString(R.string.sample);
        MarkwonListAdapter adapter = new MarkwonListAdapter();
        findViewById(R.id.add).setOnClickListener(v -> {
            adapter.addData(new MarkdownData(sampleString));
        });
        findViewById(R.id.back).setOnClickListener(v -> {
            onBackPressed();
        });
        RecyclerView recyclerView = findViewById(R.id.recycler);
        recyclerView.setLayoutManager(new LinearLayoutManager( this, LinearLayoutManager.VERTICAL, false){{setStackFromEnd(true);}});
        recyclerView.setAdapter(adapter);
    }
}


================================================
FILE: Android/AntFluid/app-sample/src/main/java/com/fluid/markdown/demos/MarkdownData.java
================================================
package com.fluid.markdown.demos;

import com.fluid.afm.markdown.widget.PrinterMarkDownTextView;

public class MarkdownData {
    public String content;
    public PrinterMarkDownTextView.MarkDownPrintData printData;

    public MarkdownData(String content) {
        this.content = content;
        printData = new PrinterMarkDownTextView.MarkDownPrintData();
    }

}


================================================
FILE: Android/AntFluid/app-sample/src/main/java/com/fluid/markdown/demos/MarkdownHolder.java
================================================
package com.fluid.markdown.demos;

import android.view.View;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.fluid.afm.R;
import com.fluid.afm.markdown.MarkdownParserFactory;
import com.fluid.afm.markdown.widget.PrinterMarkDownTextView;
import com.fluid.afm.styles.MarkdownStyles;

public class MarkdownHolder extends RecyclerView.ViewHolder {
    private final PrinterMarkDownTextView mMarkdownTextView;

    public MarkdownHolder(@NonNull View itemView) {
        super(itemView);
        mMarkdownTextView = itemView.findViewById(R.id.markdown);
        MarkdownStyles styles =  MarkdownStyles.getDefaultStyles();
        styles.linkStyle().icon("local://mipmap/link");
        mMarkdownTextView.init(styles, null);
    }

    public void bind(MarkdownData markdownData) {
        if (!markdownData.printData.hasBoundView) {
            mMarkdownTextView.setPrintData(markdownData.printData);
            mMarkdownTextView.startPrinting(markdownData.content);
        } else {
            mMarkdownTextView.restore(markdownData.printData);
        }
    }
}


================================================
FILE: Android/AntFluid/app-sample/src/main/java/com/fluid/markdown/demos/MarkwonListAdapter.java
================================================
package com.fluid.markdown.demos;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.fluid.afm.R;

import java.util.ArrayList;
import java.util.List;

public class MarkwonListAdapter extends RecyclerView.Adapter<MarkdownHolder>{
    private final List<MarkdownData> mData = new ArrayList<>();

    @NonNull
    @Override
    public MarkdownHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View contentView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.list_item, parent, false);
        return new MarkdownHolder(contentView);
    }

    @Override
    public int getItemCount() {
        return mData.size();
    }

    @Override
    public void onBindViewHolder(@NonNull MarkdownHolder holder, int position) {
        holder.bind(mData.get(position));
    }

    public void addData(MarkdownData markdownData) {
        mData.add(markdownData);
        notifyItemInserted(mData.size() - 1);
        notifyItemChanged(mData.size() - 1, mData.size());
    }
}


================================================
FILE: Android/AntFluid/app-sample/src/main/java/com/fluid/markdown/demos/PrinterActivity.java
================================================
package com.fluid.markdown.demos;

import android.os.Bundle;
import android.view.ViewGroup;
import android.widget.EditText;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.SwitchCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.fluid.afm.R;
import com.fluid.afm.markdown.MarkdownParser;
import com.fluid.afm.markdown.MarkdownParserFactory;
import com.fluid.afm.markdown.widget.PrinterMarkDownTextView;
import com.fluid.afm.styles.MarkdownStyles;

public class PrinterActivity extends AppCompatActivity {

    private EditText mEditText;
    private boolean isAppend;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_printer);
        findViewById(R.id.back).setOnClickListener(v -> onBackPressed());
        mEditText = findViewById(R.id.editor);
        RecyclerView recyclerView = findViewById(R.id.recyclerView);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager( this, LinearLayoutManager.VERTICAL, false);
        recyclerView.setLayoutManager(linearLayoutManager);
        PrinterMarkDownTextView markDownTextView = new PrinterMarkDownTextView(this);
        linearLayoutManager.setStackFromEnd(true);
        recyclerView.setAdapter(new RecyclerView.Adapter() {
            @NonNull
            @Override
            public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                return new RecyclerView.ViewHolder(markDownTextView) {};
            }

            @Override
            public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {

            }

            @Override
            public int getItemCount() {
                return 1;
            }
        });

        markDownTextView.init(MarkdownStyles.getDefaultStyles(), null);
        markDownTextView.setPrintParams(25, 1);

        findViewById(R.id.start).setOnClickListener(v -> {
            String content = mEditText.getText().toString();
            if (!content.isEmpty()) {
                markDownTextView.startPrinting(content);
            }
        });
        SwitchCompat appendSwitch = findViewById(R.id.appendSwitch);
        isAppend = appendSwitch.isChecked();
        appendSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> {
            isAppend = isChecked;
        });
        findViewById(R.id.append).setOnClickListener(v -> {
            String content = mEditText.getText().toString();
            if (!content.isEmpty()) {
                markDownTextView.appendPrinting(content, isAppend);
            }
        });

        findViewById(R.id.stop).setOnClickListener(v -> {
            markDownTextView.stopPrinting(getResources().getString(R.string.stopped));
        });
        findViewById(R.id.clear).setOnClickListener(v -> {
            mEditText.setText("");
        });

        findViewById(R.id.pause).setOnClickListener(v -> {
            markDownTextView.pause();
        });

        findViewById(R.id.resume).setOnClickListener(v -> {
            markDownTextView.resume();
        });

    }
}

================================================
FILE: Android/AntFluid/app-sample/src/main/res/drawable/baseline_arrow_back_24.xml
================================================
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:autoMirrored="true" android:height="24dp" android:tint="#FFFFFF" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp">
      
    <path android:fillColor="@android:color/white" android:pathData="M20,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z"/>
    
</vector>


================================================
FILE: Android/AntFluid/app-sample/src/main/res/drawable/circle.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval" >
    <solid android:color="#1677FF" />

</shape>

================================================
FILE: Android/AntFluid/app-sample/src/main/res/drawable/editor_bg.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <stroke
        android:width="1dp"
        android:color="#CCC" />
    <corners android:radius="18dp"/>

</shape>

================================================
FILE: Android/AntFluid/app-sample/src/main/res/drawable/ic_launcher_background.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="108dp"
    android:height="108dp"
    android:viewportWidth="108"
    android:viewportHeight="108">
    <path
        android:fillColor="#3DDC84"
        android:pathData="M0,0h108v108h-108z" />
    <path
        android:fillColor="#00000000"
        android:pathData="M9,0L9,108"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M19,0L19,108"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M29,0L29,108"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M39,0L39,108"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M49,0L49,108"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M59,0L59,108"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M69,0L69,108"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M79,0L79,108"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M89,0L89,108"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M99,0L99,108"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,9L108,9"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,19L108,19"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,29L108,29"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,39L108,39"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,49L108,49"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,59L108,59"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,69L108,69"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,79L108,79"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,89L108,89"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,99L108,99"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M19,29L89,29"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M19,39L89,39"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M19,49L89,49"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M19,59L89,59"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M19,69L89,69"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M19,79L89,79"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M29,19L29,89"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M39,19L39,89"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M49,19L49,89"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M59,19L59,89"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M69,19L69,89"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M79,19L79,89"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
</vector>


================================================
FILE: Android/AntFluid/app-sample/src/main/res/drawable/item_bg.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">

    <solid android:color="#FFFFFF" />
    <corners android:radius="10dp" />
    <stroke
        android:width="2dp"
        android:color="#E0E0E0" />
</shape>

================================================
FILE: Android/AntFluid/app-sample/src/main/res/drawable-v24/ic_launcher_foreground.xml
================================================
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:aapt="http://schemas.android.com/aapt"
    android:width="108dp"
    android:height="108dp"
    android:viewportWidth="108"
    android:viewportHeight="108">
    <path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
        <aapt:attr name="android:fillColor">
            <gradient
                android:endX="85.84757"
                android:endY="92.4963"
                android:startX="42.9492"
                android:startY="49.59793"
                android:type="linear">
                <item
                    android:color="#44000000"
                    android:offset="0.0" />
                <item
                    android:color="#00000000"
                    android:offset="1.0" />
            </gradient>
        </aapt:attr>
    </path>
    <path
        android:fillColor="#FFFFFF"
        android:fillType="nonZero"
        android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
        android:strokeWidth="1"
        android:strokeColor="#00000000" />
</vector>

================================================
FILE: Android/AntFluid/app-sample/src/main/res/layout/activity_list.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="#F5F5F5"
    tools:context="com.fluid.markdown.demos.ListActivity">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:background="@color/colorPrimary"
        android:gravity="center_vertical"
        android:orientation="horizontal">

        <ImageView
            android:id="@+id/back"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="12dp"
            android:background="@drawable/baseline_arrow_back_24"
            android:importantForAccessibility="no" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="12dp"
            android:gravity="center_vertical"
            android:text="@string/list"
            android:textColor="@color/white"
            android:textSize="20sp"
            android:textStyle="bold" />
    </LinearLayout>

    <Button
        android:id="@+id/add"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="#1677FF"
        android:layout_margin="2dp"
        android:textColor="@color/white"
        android:text="@string/add"/>
    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycler"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:clipToPadding="false"
        android:padding="12dp"
        android:stackFromBottom="true" />

</LinearLayout>

================================================
FILE: Android/AntFluid/app-sample/src/main/res/layout/activity_printer.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:background="@color/colorPrimary"
        android:gravity="center_vertical"
        android:orientation="horizontal">

        <ImageView
            android:id="@+id/back"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="12dp"
            android:background="@drawable/baseline_arrow_back_24"
            android:importantForAccessibility="no" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="12dp"
            android:gravity="center_vertical"
            android:text="@string/printer"
            android:textColor="@color/white"
            android:textSize="20sp"
            android:textStyle="bold" />

    </LinearLayout>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/main"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        tools:context="com.fluid.markdown.demos.PrinterActivity">

        <Button
            android:id="@+id/clear"
            android:layout_width="25dp"
            android:layout_height="25dp"
            android:layout_margin="12dp"
            android:layout_marginTop="12dp"
            android:background="@drawable/circle"
            android:text="@string/delete"
            android:textColor="@color/white"
            android:textSize="16sp"
            app:layout_constraintBottom_toBottomOf="@+id/editorContainer"
            app:layout_constraintEnd_toEndOf="@+id/editorContainer" />

        <ScrollView
            android:id="@+id/editorContainer"
            android:layout_width="match_parent"
            android:layout_height="150dp"
            android:layout_margin="12dp"
            android:background="@drawable/editor_bg"
            android:clipToPadding="false"
            android:gravity="start|top"
            android:padding="12dp"
            android:textSize="15sp"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent">

            <EditText
                android:id="@+id/editor"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="#0000"
                android:gravity="start|top"
                android:hint="@string/input_markdown_text"
                android:minHeight="126dp"
                android:textColorHint="#bbb"
                android:textSize="15sp" />
        </ScrollView>

        <TextView
            android:id="@+id/start"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="12dp"
            android:background="#1677FF"
            android:gravity="center"
            android:minWidth="70dp"
            android:padding="12dp"
            android:text="@string/start"
            android:textColor="@color/white"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/editorContainer"
            app:layout_constraintEnd_toStartOf="@+id/stop"/>
        <TextView
            android:id="@+id/stop"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="#1677FF"
            android:gravity="center"
            android:minWidth="70dp"
            android:padding="12dp"
            android:text="@string/stop"
            android:textColor="@color/white"
            app:layout_constraintStart_toEndOf="@+id/start"
            app:layout_constraintEnd_toStartOf="@+id/append"
            app:layout_constraintTop_toTopOf="@+id/start" />


        <TextView
            android:id="@+id/append"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="#1677FF"
            android:padding="12dp"
            android:text="@string/appendText"
            android:textColor="@color/white"
            app:layout_constraintEnd_toStartOf="@+id/appendSwitch"
            app:layout_constraintStart_toEndOf="@+id/stop"
            app:layout_constraintTop_toTopOf="@+id/start" />

        <androidx.appcompat.widget.SwitchCompat
            android:id="@+id/appendSwitch"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/append"
            app:layout_constraintBottom_toBottomOf="@+id/stop"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toEndOf="@+id/append"
            app:layout_constraintTop_toTopOf="@+id/append" />

        <TextView
            android:id="@+id/pause"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="#1677FF"
            android:padding="12dp"
            android:minWidth="70dp"
            android:gravity="center"
            android:text="@string/pause"
            android:textColor="@color/white"
            android:layout_marginTop="12dp"
            app:layout_constraintStart_toStartOf="@+id/start"
            app:layout_constraintTop_toBottomOf="@id/start" />

        <TextView
            android:id="@+id/resume"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="#1677FF"
            android:gravity="center"
            android:minWidth="70dp"
            android:padding="12dp"
            android:text="@string/resume"
            android:textColor="@color/white"
            app:layout_constraintStart_toStartOf="@+id/stop"
            app:layout_constraintTop_toTopOf="@id/pause" />


    </androidx.constraintlayout.widget.ConstraintLayout>

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:clipToPadding="false"
        android:padding="12dp"
        android:stackFromBottom="true" />
</LinearLayout>

================================================
FILE: Android/AntFluid/app-sample/src/main/res/layout/layout_main.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:background="@color/colorPrimary"
        android:orientation="vertical">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="0dp"
            android:gravity="center_vertical"
            android:layout_marginStart="12dp"
            android:layout_weight="1"
            android:text="@string/demo"
            android:textColor="@color/white"
            android:textSize="20sp"
            android:textStyle="bold" />

        <View
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="#ccc" />
    </LinearLayout>

    <androidx.core.widget.NestedScrollView
        android:id="@+id/scrollView"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:background="@color/white">

        <com.fluid.afm.markdown.widget.PrinterMarkDownTextView
            android:id="@+id/textView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="12dp" />

    </androidx.core.widget.NestedScrollView>

</LinearLayout>


================================================
FILE: Android/AntFluid/app-sample/src/main/res/layout/list_item.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/item_bg"
    android:padding="12dp"
    android:layout_marginBottom="12dp">

    <com.fluid.afm.markdown.widget.PrinterMarkDownTextView
        android:id="@+id/markdown"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</FrameLayout>

================================================
FILE: Android/AntFluid/app-sample/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
    <background android:drawable="@drawable/ic_launcher_background" />
    <foreground android:drawable="@drawable/ic_launcher_foreground" />
    <monochrome android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>

================================================
FILE: Android/AntFluid/app-sample/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
    <background android:drawable="@drawable/ic_launcher_background" />
    <foreground android:drawable="@drawable/ic_launcher_foreground" />
    <monochrome android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>

================================================
FILE: Android/AntFluid/app-sample/src/main/res/values/colors.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="purple_200">#FFBB86FC</color>
    <color name="purple_500">#FF6200EE</color>
    <color name="purple_700">#FF3700B3</color>
    <color name="teal_200">#FF03DAC5</color>
    <color name="teal_700">#FF018786</color>
    <color name="black">#FF000000</color>
    <color name="white">#FFFFFFFF</color>
    <color name="colorPrimary">#3F51B5</color>
    <color name="colorPrimaryDark">#303F9F</color>
    <color name="colorAccent">#FF018786</color>
</resources>

================================================
FILE: Android/AntFluid/app-sample/src/main/res/values/strings.xml
================================================
<resources>
    <string name="app_name">AntFluidMarkdown</string>
    <string name="printer">Printer</string>
    <string name="start">start</string>
    <string name="appendText">append text</string>
    <string name="stop">stop</string>
    <string name="delete">×</string>
    <string name="append">append:</string>
    <string name="demo">Demo</string>
    <string name="input_markdown_text">input markdown text</string>
    <string name="resume">resume</string>
    <string name="pause">pause</string>
    <string name="toPrinter"><![CDATA[ <br/><iconlink link="open://printer" src="local://mipmap/link" style="color:#1296DB;font-size:26px">Stream print demo</iconlink>\n\n ]]></string>
    <string name="toList"><![CDATA[ <iconlink link="open://list_printer" src="local://mipmap/link" style="color:#1296DB;font-size:26px">List stream print demo</iconlink>\n\n ]]></string>

    <string name="sample"><![CDATA[# h1 Heading\nThis is normal text. This is normal text. This is normal text. This is normal text. This is normal text. This is normal text. This is normal text. This is normal text. \n\n## h2 Heading\n### h3 Heading\n#### h4 Heading\n##### h5 Heading\n###### h6 Heading\n**This is bold text**\n*This is italic text*  \n***This is bold and italic text***  \n~~Strikethrough~~  \n\n---\n\n### Lists\n- Unordered 1 level:0\n- Unordered 2 level:0\n\t- Unordered 1 level:1\n\t- Unordered 2 level:1\n1. Ordered 1 level:0\n2. Ordered 2 level:0\n\t1. Ordered 1 level:1\n\t2. Ordered 2 level:1\n    3. Ordered 2 level:1\n\n---\n\n### Blockquotes\n> This is blockquotes\n> Blockquotes can also be nested…\n> **bold tex in blockquotes**\n> Dorothy followed her through many of the beautiful rooms in her castle.\n>> The Witch bade her clean the pots and kettles and sweep the floor and keep the fire fed with wood.\n\n---\n\n### Links & Images\n[link text](https://www.example.com)  \n\n![image description1](https://gw.alipayobjects.com/zos/bmw-prod/4c49eb9a-88c1-4bd2-afa3-d3054331e983/kvgaht9k_w849_h375.png) \n\n![image description2](https://gw.alipayobjects.com/zos/bmw-prod/79ea98f0-303b-4816-ba27-5638a04ca353/kvgahl7g_w849_h375.png)\n\n---\n\n### Table\n| header1 | header2 | header3 |\n|-------|-------|-------|\n| content1 | content2 | content3 |\n| content4 | content5 | content6 |\n\n---\n\n### Code\n`inline code`\n\n```python\n# Code block\ndef hello_world():\n    print("Hello, World!")\n```\n\n---\n\n### Horizontal Rules\n\n---\n\n### Footnotes\nthis is a footnote[^1][^2].\n。\n\n---\n\n### HTML\n<a href=\"https://www.example.com\" style=\"color: blue;text-decoration: underline;\"> This is a tag. </a><u>this is underline</u>\n]]></string>
    <string name="stopped">(stopped)</string>
    <string name="list">List</string>
    <string name="add">add item</string>

</resources>

================================================
FILE: Android/AntFluid/app-sample/src/main/res/values/themes.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="Theme.AntFluidMarkdown" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

</resources>

================================================
FILE: Android/AntFluid/app-sample/src/main/res/values-v35/themes.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="Theme.AntFluidMarkdown" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:windowOptOutEdgeToEdgeEnforcement">true</item>
    </style>

</resources>

================================================
FILE: Android/AntFluid/app-sample/src/main/res/values-zh/strings.xml
================================================
<resources>
    <string name="app_name">AntFluidMarkdown</string>
    <string name="printer">Printer</string>
    <string name="start">开始</string>
    <string name="appendText">追加文字</string>
    <string name="stop">停止</string>
    <string name="delete">×</string>
    <string name="append">append:</string>
    <string name="demo">Demo</string>
    <string name="input_markdown_text">输入markdown原文</string>
    <string name="resume">继续</string>
    <string name="pause">暂停</string>
    <string name="toPrinter"><![CDATA[ <br/><iconlink link="open://printer" src="local://mipmap/link" style="color:#1296DB;font-size:26px">流式打印Demo</iconlink>\n\n ]]></string>
    <string name="toList"><![CDATA[ <iconlink link="open://list_printer" src="local://mipmap/link" style="color:#1296DB;font-size:26px">流式打印列表demo</iconlink>\n\n ]]></string>
    <string name="sample"><![CDATA[# 一级标题\n我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文\n\n## 二级标题\n### 三级标题\n#### 四级标题\n##### 五级标题\n###### 六级标题\n**加粗文本**\n*斜体文本*  \n***加粗斜体文本***  \n~~删除线文本~~  \n\n---\n\n### 列表\n- 无序列表项1\n- 无序列表项2\n\t- 子列表项1\n\t- 子列表项2\n1. 有序列表项1\n2. 有序列表项2\n\t1. 子列表项1\n\t2. 子列表项2\n\t3. 子列表项3\n\n---\n\n### 引用\n> 引用内容\n> 多行引用内容\n> 引用中**加粗文本**\n> Dorothy followed her through many of the beautiful rooms in her castle.\n>> The Witch bade her clean the pots and kettles and sweep the floor and keep the fire fed with wood.\n\n---\n\n### 链接与图片\n[这是一个链接](https://www.example.com)  \n\n![图片描述1](https://gw.alipayobjects.com/zos/bmw-prod/4c49eb9a-88c1-4bd2-afa3-d3054331e983/kvgaht9k_w849_h375.png) \n\n![图片描述2](https://gw.alipayobjects.com/zos/bmw-prod/79ea98f0-303b-4816-ba27-5638a04ca353/kvgahl7g_w849_h375.png)\n\n---\n\n### 表格\n| 表头1 | 表头2 | 表头3 |\n|-------|-------|-------|\n| 内容1 | 内容2 | 内容3 |\n| 内容4 | 内容5 | 内容6 |\n\n---\n\n### 代码\n行内代码:`inline code`\n\n```python\n# 代码块\ndef hello_world():\n    print(\"Hello, World!\")\n```\n\n---\n\n### 分隔线\n\n---\n\n### 脚注\n这是一个脚注示例[^1][^2].\n。\n\n---\n\n### 内嵌HTML\n<a href=\"https://www.example.com\" style=\"color: blue;text-decoration: underline;\"> 我是一个a标签。</a><u>我是下划线</u>]]></string>
    <string name="stopped">(已终止)</string>
    <string name="list">多markdown列表</string>
    <string name="add">添加数据</string>


</resources>

================================================
FILE: Android/AntFluid/app-sample/src/main/res/xml/backup_rules.xml
================================================
<?xml version="1.0" encoding="utf-8"?><!--
   Sample backup rules file; uncomment and customize as necessary.
   See https://developer.android.com/guide/topics/data/autobackup
   for details.
   Note: This file is ignored for devices older than API 31
   See https://developer.android.com/about/versions/12/backup-restore
-->
<full-backup-content>
    <!--
   <include domain="sharedpref" path="."/>
   <exclude domain="sharedpref" path="device.xml"/>
-->
</full-backup-content>

================================================
FILE: Android/AntFluid/app-sample/src/main/res/xml/data_extraction_rules.xml
================================================
<?xml version="1.0" encoding="utf-8"?><!--
   Sample data extraction rules file; uncomment and customize as necessary.
   See https://developer.android.com/about/versions/12/backup-restore#xml-changes
   for details.
-->
<data-extraction-rules>
    <cloud-backup>
    </cloud-backup>
</data-extraction-rules>

================================================
FILE: Android/AntFluid/app-sample/src/test/java/com/fluid/markdown/ExampleUnitTest.kt
================================================
package com.fluid.markdown

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)
    }
}

================================================
FILE: Android/AntFluid/build.gradle
================================================
// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
alias(libs.plugins.android.application) apply false
    alias(libs.plugins.kotlin.android) apply false
    alias(libs.plugins.kotlin.compose) apply false
    alias(libs.plugins.android.library) apply false
}

================================================
FILE: Android/AntFluid/fluid-markdown/.gitignore
================================================
/build

================================================
FILE: Android/AntFluid/fluid-markdown/build.gradle
================================================
plugins {
    alias(libs.plugins.android.library)
}

android {
    namespace 'com.fluid.afm'
    compileSdk 35

    defaultConfig {
        minSdk 21

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        consumerProguardFiles "consumer-rules.pro"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_11
        targetCompatibility JavaVersion.VERSION_11
    }
}

dependencies {

    implementation libs.androidx.appcompat
    api project(':markwon-core')
    api project(':markwon-ext-latex')
    api project(':markwon-ext-strikethrough')
    api project(':markwon-ext-tables')
    api project(':markwon-ext-tasklist')
    api project(':markwon-image')
    api project(':markwon-html')
    api project(':markwon-inline-parser')
    api project(':markwon-syntax-highlight')
    implementation libs.androidx.recyclerview
    testImplementation libs.junit
    androidTestImplementation libs.androidx.junit
    androidTestImplementation libs.androidx.espresso.core
    implementation 'com.vdurmont:emoji-java:5.1.1'
}

================================================
FILE: Android/AntFluid/fluid-markdown/consumer-rules.pro
================================================


================================================
FILE: Android/AntFluid/fluid-markdown/proguard-rules.pro
================================================
# 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

================================================
FILE: Android/AntFluid/fluid-markdown/src/androidTest/java/com/fluid/afm/ExampleInstrumentedTest.java
================================================
package com.fluid.afm;

import static org.junit.Assert.assertEquals;

import android.content.Context;

import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.platform.app.InstrumentationRegistry;

import org.junit.Test;
import org.junit.runner.RunWith;

/**
 * Instrumented test, which will execute on an Android device.
 *
 * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
 */
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
    @Test
    public void useAppContext() {
        // Context of the app under test.
        Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
        assertEquals("com.fluid.afm", appContext.getPackageName());
    }
}

================================================
FILE: Android/AntFluid/fluid-markdown/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">

    <application>
        <activity
            android:name=".ui.MarkDownPreviewActivity"
            android:screenOrientation="landscape"
            android:theme="@style/Theme.Preview">
        </activity>
    </application>
</manifest>

================================================
FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/AFMInitializer.java
================================================
package com.fluid.afm;

import android.content.Context;

import androidx.annotation.Nullable;

import com.fluid.afm.handler.BackgroundTaskHandler;
import com.fluid.afm.handler.EventHandlerManager;
import com.fluid.afm.handler.ImageHandler;
import com.fluid.afm.handler.LogHandler;

public class AFMInitializer {
    public static void init(Context context,
                            @Nullable BackgroundTaskHandler backgroundTaskHandler,
                            @Nullable ImageHandler imageHandler,
                            @Nullable LogHandler logHandler) {
        ContextHolder.setContext(context);
        EventHandlerManager.setLogHandler(logHandler);
        EventHandlerManager.setBackgroundTaskHandler(backgroundTaskHandler);
        EventHandlerManager.setImageHandler(imageHandler);
    }
}


================================================
FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/ElementClickEventCallback.java
================================================
package com.fluid.afm.markdown;

import android.view.View;

import com.fluid.afm.markdown.html.SpanTextClickableSpan;
import com.fluid.afm.markdown.model.EventModel;

import java.util.List;
import java.util.Map;

public interface ElementClickEventCallback {
    String PARAM_KEY_LINK = "link";
    String PARAM_KEY_SOURCE = "source";
    String SOURCE_TYPE_LINK= "link";
    String SOURCE_TYPE_ICON_LINK= "iconlink";

    default boolean onLinkClicked(Map<String, Object> params) { return false;}
    default void onFootnoteClicked(String index) { }

    default void onImageClicked(String url, String description) {}
    default boolean onTextClickableSpanClicked(View widget, String link, String entityID, SpanTextClickableSpan.ClickableTextType type)  { return false;}

    default void exposureSpmBehavior(List<EventModel> models) {}
}


================================================
FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/MarkdownParser.java
================================================
package com.fluid.afm.markdown;

import android.content.Context;
import android.graphics.Paint;
import android.os.Build;
import android.os.SystemClock;
import android.util.TypedValue;
import android.widget.TextView;

import androidx.annotation.NonNull;

import com.fluid.afm.ContextHolder;
import com.fluid.afm.StreamOutStateObserver;
import com.fluid.afm.markdown.code.CodeBlockPlugin;
import com.fluid.afm.markdown.widget.PrinterMarkDownTextView;
import com.fluid.afm.styles.MarkdownStyles;
import com.fluid.afm.utils.MDLogger;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import io.noties.markwon.AbstractMarkwonPlugin;
import io.noties.markwon.Markwon;
import io.noties.markwon.MarkwonPlugin;
import io.noties.markwon.core.CorePlugin;
import io.noties.markwon.core.MarkwonTheme;
import io.noties.markwon.inlineparser.MarkwonInlineParser;
import io.noties.markwon.inlineparser.MarkwonInlineParserPlugin;

public class MarkdownParser {

    public static final String TAG = "MarkdownParser";
    private Markwon.Builder mMarkwonBuilder;
    private Markwon mMarkwon;
    private final PrinterMarkDownTextView mTextView;
    private final List<StreamOutStateObserver> mStreamOutStateObservers = new ArrayList<>();
    private MarkdownStyles mProductStyles;
    private MarkwonTheme mMarkwonTheme;

    public MarkdownParser(Context context, List<AbstractMarkwonPlugin> plugins, PrinterMarkDownTextView textView, MarkdownStyles styles) {
        this.mTextView = textView;
        mProductStyles = styles;
        init(context, plugins);
    }

    public void updateMarkdownStyles(MarkdownStyles styles) {
        if (styles == null) {
            return;
        }
        mProductStyles = styles;
        if (mMarkwonTheme != null) {
            mMarkwonTheme.updateStyles(styles);
        }
        if (mTextView == null) {
            return;
        }
        updateTextViewStyle(styles);
        mTextView.setText(mTextView.getText());
    }

    private void updateTextViewStyle(MarkdownStyles styles) {
        if (styles == null) {
            return;
        }
        if (styles.paragraphStyle().fontSize() > 0) {
            mTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, styles.paragraphStyle().fontSize());
        }
        if (styles.paragraphStyle().lineHeight() > 0) {
            mTextView.setLineSpacing(0, 1.f);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
                mTextView.setFallbackLineSpacing(false);
            }
            Paint.FontMetrics fontMetrics = mTextView.getPaint().getFontMetrics();
            mTextView.setLineSpacing(styles.paragraphStyle().lineHeight() - (fontMetrics.bottom- fontMetrics.top), 1f);
        }
        if (styles.paragraphStyle().fontColor() != 0) {
            mTextView.setTextColor(styles.paragraphStyle().fontColor());
        }
    }

    public void setPrintingState(boolean isPrinting) {
        try {
            for (StreamOutStateObserver observer : mStreamOutStateObservers) {
                observer.onStreamOutStateChanged(isPrinting);
            }
        } catch (Exception e) {
            MDLogger.e(TAG, "delieverIsAnimationFinish error", e);
        }
    }

    private void init(final Context context, List<AbstractMarkwonPlugin> customPlugins) {
        if(ContextHolder.getContext() == null) {
            ContextHolder.setContext(context.getApplicationContext());
        }
        List<MarkwonPlugin> plugins = new ArrayList<>();
        if (customPlugins != null) {
            plugins.addAll(customPlugins);
        }
        for (Object obj : plugins) {
            if (obj instanceof StreamOutStateObserver) {
                mStreamOutStateObservers.add((StreamOutStateObserver) obj);
            }
        }
        plugins.addAll(getDefaultPlugins(context));
        mMarkwonBuilder = Markwon.builderWithPlugs(context, plugins);
        mMarkwonTheme = MarkwonTheme.emptyBuilder().setStyles(mProductStyles).setTextView(mTextView).build(plugins);
        mMarkwonBuilder.setMarkdownTheme(mMarkwonTheme);
        mMarkwon = mMarkwonBuilder.build();
        updateTextViewStyle(mProductStyles);
    }

    private ArrayList<AbstractMarkwonPlugin> getDefaultPlugins(final Context context) {
        long startTime = SystemClock.elapsedRealtime();
        ArrayList<AbstractMarkwonPlugin> plugins = new ArrayList<>(4);
        plugins.add(CorePlugin.create(context));
        plugins.add(CodeBlockPlugin.create(context, true));
        plugins.add(new AbstractMarkwonPlugin() {

            @NonNull
            @Override
            public String processMarkdown(@NonNull String markdown) {
                String regex = "\\${1,2}\\s*\\\\bm\\{([A-Za-z]{1,9})\\}\\s*\\${1,2}";
                Pattern pattern = Pattern.compile(regex);
                Matcher matcher = pattern.matcher(markdown);
                StringBuffer output = new StringBuffer();
                while (matcher.find()) {
                    String content = matcher.group(1);
                    matcher.appendReplacement(output, "***" + content + "***");
                }
                matcher.appendTail(output);
                return super.processMarkdown(output.toString());
            }

        });
        plugins.add(MarkwonInlineParserPlugin.create(MarkwonInlineParser.factoryBuilder()));
        MDLogger.d(TAG, "addPlugin costTime=" + (SystemClock.elapsedRealtime() - startTime));
        return plugins;
    }

    public TextView getTextView() {
        return mTextView;
    }

    public void setTextSetter(Markwon.TextSetter setter) {
        mMarkwonBuilder.textSetter(setter);
    }

    public Markwon getMarkwon() {
        return mMarkwon;
    }
}

================================================
FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/MarkdownParserFactory.java
================================================
package com.fluid.afm.markdown;

import android.content.Context;
import android.graphics.drawable.Drawable;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.content.res.AppCompatResources;

import com.fluid.afm.MarkdownAwareMovementMethod;
import com.fluid.afm.R;
import com.fluid.afm.func.IImageClickCallback;
import com.fluid.afm.markdown.code.CodeBlockPlugin;
import com.fluid.afm.markdown.html.CustomHtmlPlugin;
import com.fluid.afm.markdown.html.HtmlMarkTagHandler;
import com.fluid.afm.markdown.html.HtmlParaTagHandler;
import com.fluid.afm.markdown.html.HtmlSpanTagHandler;
import com.fluid.afm.markdown.icon.IconSpanHandler;
import com.fluid.afm.markdown.iconlink.IconLinkSpanHandler;
import com.fluid.afm.markdown.list.DefinitionListPlugin;
import com.fluid.afm.markdown.span.LinkClickSpan;
import com.fluid.afm.markdown.text.AfmTextPlugin;
import com.fluid.afm.markdown.widget.PrinterMarkDownTextView;
import com.fluid.afm.network.ImageLoaderSchemeHandler;
import com.fluid.afm.styles.MarkdownStyles;
import com.fluid.afm.utils.MDLogger;
import com.fluid.afm.utils.Utils;

import org.commonmark.node.Link;

import java.util.ArrayList;

import io.noties.markwon.AbstractMarkwonPlugin;
import io.noties.markwon.MarkwonConfiguration;
import io.noties.markwon.MarkwonSpansFactory;
import io.noties.markwon.RenderProps;
import io.noties.markwon.SpanFactory;
import io.noties.markwon.core.CorePlugin;
import io.noties.markwon.core.CoreProps;
import io.noties.markwon.ext.latex.JLatexMathPlugin;
import io.noties.markwon.ext.strikethrough.StrikethroughPlugin;
import io.noties.markwon.ext.tables.TablePlugin;
import io.noties.markwon.ext.tasklist.TaskListPlugin;
import io.noties.markwon.image.AsyncDrawable;
import io.noties.markwon.image.DefaultDownScalingMediaDecoder;
import io.noties.markwon.image.ImagesPlugin;
import io.noties.markwon.inlineparser.MarkwonInlineParser;
import io.noties.markwon.inlineparser.MarkwonInlineParserPlugin;
import io.noties.markwon.movement.MovementMethodPlugin;
import io.noties.markwon.syntax.SyntaxHighlightPlugin;

public class MarkdownParserFactory {
    public static final String TAG = "MarkdownPluginsCreator";

    public static MarkdownParser create(Context context, PrinterMarkDownTextView textView) {
        return create(context, textView, MarkdownStyles.getDefaultStyles(), null);
    }

    public static void bindMarkdownParser(Context context, PrinterMarkDownTextView textView, MarkdownStyles styles, ElementClickEventCallback callback) {
        create(context, textView, styles, callback);
    }

    public static MarkdownParser create(Context context, PrinterMarkDownTextView textView, MarkdownStyles styles, ElementClickEventCallback callback) {
        ArrayList<AbstractMarkwonPlugin> finalPlugins = getDefaultPlugins(context, textView, callback);
        return new MarkdownParser(context, finalPlugins, textView, styles);
    }

    public static ArrayList<AbstractMarkwonPlugin> getPlugins(Context context, PrinterMarkDownTextView textView, TablePlugin tablePlugin) {
        ArrayList<AbstractMarkwonPlugin> plugins = getDefaultPlugins(context, textView, null);
        plugins.add(tablePlugin);
        plugins.add(CorePlugin.create(context));
        plugins.add(MarkwonInlineParserPlugin.create(MarkwonInlineParser.factoryBuilder()));
        plugins.add(CodeBlockPlugin.create(context, false));
        return plugins;
    }

    public static ArrayList<AbstractMarkwonPlugin> getDefaultPlugins(Context context, PrinterMarkDownTextView textView, ElementClickEventCallback callback) {
        ArrayList<AbstractMarkwonPlugin> plugins = new ArrayList<>();
        plugins.add(linkPlugin(callback));
        plugins.add(imagePlugin(context, callback));
        if (textView != null) {
            plugins.add(htmlPlugin(context, textView, callback));
        }
        plugins.add(MovementMethodPlugin.create(MarkdownAwareMovementMethod.create()));
        plugins.add(createJLatexMathPlugin(context));
        plugins.add(createSyntaxHighlightPlugin());
        plugins.add(createStrikethroughPlugin());
        plugins.add(printStreamPlugin(context, callback));
        plugins.add(createTaskListPlugin(context));
        plugins.add(definitationPlugin());
        plugins.add(TablePlugin.create(context));
        return plugins;
    }

    public static AbstractMarkwonPlugin createJLatexMathPlugin(Context context) {
        JLatexMathPlugin.init(context);
        float size = Utils.dpToPx(context, 16f);
        JLatexMathPlugin.BuilderConfigure jBuilder = builder -> {
            builder.blocksEnabled(true);
            builder.inlinesEnabled(true);
            builder.blocksLegacy(true);
            builder.errorHandler(new JLatexMathPlugin.ErrorHandler() {
                @Nullable
                @Override
                public Drawable handleError(@NonNull String latex, @NonNull Throwable error) {
                    MDLogger.e(
                            TAG,
                            "latex error:" + latex, error
                    );
                    return null;
                }
            });
        };
        return JLatexMathPlugin.create(size, jBuilder);
    }

    public static AbstractMarkwonPlugin createTaskListPlugin(Context context) {
        return TaskListPlugin.create(context);
    }

    public static AbstractMarkwonPlugin createSyntaxHighlightPlugin() {
        return SyntaxHighlightPlugin.createDefault();
    }

    public static AbstractMarkwonPlugin createStrikethroughPlugin() {
        return StrikethroughPlugin.create();
    }

    public static AbstractMarkwonPlugin definitationPlugin() {
        return DefinitionListPlugin.create();
    }

    public static AbstractMarkwonPlugin linkPlugin(ElementClickEventCallback callback) {
        return new AbstractMarkwonPlugin() {
            @Override
            public void configureSpansFactory(@NonNull MarkwonSpansFactory.Builder builder) {
                builder.setFactory(Link.class, new SpanFactory() {
                    @Nullable
                    @Override
                    public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps props) {
                        return new LinkClickSpan(CoreProps.LINK_DESTINATION.require(props), props, configuration.theme(), callback);
                    }
                });
            }
        };
    }

    public static ImagesPlugin imagePlugin(Context context, ElementClickEventCallback callback) {
        IImageClickCallback imageClickCallback = (url, description) -> {
            if (callback != null) {
                callback.onImageClicked(url, description);
            }
        };
         return ImagesPlugin.create(imageClickCallback).addSchemeHandler(ImageLoaderSchemeHandler.create(context))
                .addMediaDecoder(DefaultDownScalingMediaDecoder.create(Utils.getScreenWidth(context) - 2 * Utils.dpToPx(context, 16f), 0))
                .placeholderProvider(new ImagesPlugin.PlaceholderProvider() {
                    @Nullable
                    @Override
                    public Drawable providePlaceholder(@NonNull AsyncDrawable drawable) {
                        return AppCompatResources.getDrawable(context, R.drawable.default_placeholderdefault);
                    }
                });

    }

    public static AbstractMarkwonPlugin htmlPlugin(Context context, TextView textView, ElementClickEventCallback onClickCallback) {
        return CustomHtmlPlugin.create()
                .addHandler(new HtmlSpanTagHandler(context, onClickCallback))
                .addHandler(new HtmlMarkTagHandler())
                .addHandler(new HtmlParaTagHandler(context))
                .addHandler(new IconLinkSpanHandler(textView, onClickCallback))
                .addHandler(new IconSpanHandler(textView));
    }

    public static AbstractMarkwonPlugin printStreamPlugin(Context context, ElementClickEventCallback linkClickedCallback) {
        return new AfmTextPlugin(context).setCustomClickListener(linkClickedCallback);
    }

}


================================================
FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/code/CodeBlockPlugin.java
================================================
package com.fluid.afm.markdown.code;

import static io.noties.markwon.core.MarkwonTheme.CODE_BLOCK_HEADER_HEIGHT;

import android.content.Context;

import androidx.annotation.NonNull;

import com.fluid.afm.CodeBlockLineSpacingSpan;
import com.fluid.afm.CodeBlockTitleSpan;
import com.fluid.afm.markdown.text.RoundedBackgroundSpan;

import org.commonmark.node.Code;
import org.commonmark.node.FencedCodeBlock;
import org.commonmark.node.Node;

import io.noties.markwon.AbstractMarkwonPlugin;
import io.noties.markwon.MarkwonSpansFactory;
import io.noties.markwon.MarkwonVisitor;
import io.noties.markwon.core.MarkwonTheme;

public class CodeBlockPlugin extends AbstractMarkwonPlugin {

    private static final String TAG = "CodeBlockPlugin";
    private final Context context;
    private final Boolean showCodeBlockHeader;

    CodeBlockPlugin(@NonNull Context context, boolean showCodeBlockHeader) {
        this.context = context;
        this.showCodeBlockHeader = showCodeBlockHeader;
    }
    @NonNull
    @Override
    public String processMarkdown(@NonNull String markdown) {
        return super.processMarkdown(markdown);
    }

    @Override
    public void configureSpansFactory(@NonNull MarkwonSpansFactory.Builder builder) {
        if (showCodeBlockHeader) {
            builder.appendFactory(FencedCodeBlock.class, (configuration, props) -> new CodeBlockTitleSpan(context, configuration.theme(), CODE_BLOCK_HEADER_HEIGHT, configuration.theme().codeStyle().titleFontSize()));
            builder.appendFactory(FencedCodeBlock.class, (configuration, props) -> new CodeBlockLineSpacingSpan(CODE_BLOCK_HEADER_HEIGHT, 0));
            builder.appendFactory(Code.class, (configuration, props) -> {
                MarkwonTheme markwonTheme = configuration.theme();
                return new RoundedBackgroundSpan(markwonTheme,
                        markwonTheme.getCodeBackgroundRadius());
            });
        }
    }

    @Override
    public void configureVisitor(MarkwonVisitor.Builder builder) {
        builder.blockHandler(new BlockHandlerNoAdditionalNewLines());
    }

    public static CodeBlockPlugin create(Context context, boolean showCodeBlockHeader) {
        return new CodeBlockPlugin(context, showCodeBlockHeader);
    }
}

class BlockHandlerNoAdditionalNewLines implements MarkwonVisitor.BlockHandler {

    public BlockHandlerNoAdditionalNewLines() {
    }

    @Override
    public void blockStart(@NonNull MarkwonVisitor visitor, @NonNull Node node) {
        // ensure that content rendered on a new line
        visitor.ensureNewLine();
    }

    @Override
    public void blockEnd(@NonNull MarkwonVisitor visitor, @NonNull Node node) {
        /* no-op */
    }
}


================================================
FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/html/CustomHtmlPlugin.java
================================================
package com.fluid.afm.markdown.html;

import android.os.SystemClock;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.TextUtils;
import android.widget.TextView;

import androidx.annotation.NonNull;

import com.fluid.afm.utils.MDLogger;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import io.noties.markwon.html.HtmlPlugin;

public class CustomHtmlPlugin extends HtmlPlugin {
    private static final String TAG = CustomHtmlPlugin.class.getSimpleName();

    CustomHtmlPlugin() {
        super();
    }

    public static CustomHtmlPlugin create() {
        return new CustomHtmlPlugin();
    }

    @NonNull
    @Override
    public String processMarkdown(@NonNull String markdown) {
        markdown = super.processMarkdown(markdown);
        markdown = modifyHighlightData(markdown);
        markdown = appendPoiAndRelatedEntityData(markdown);
        markdown = handleFormulaCompat(markdown);
        return markdown;
    }

    @Override
    public void beforeSetText(@NonNull TextView textView, @NonNull Spanned markdown) {
        super.beforeSetText(textView, markdown);

        try {
            if (markdown instanceof SpannableStringBuilder) {
                int tableIndex = markdown.toString().indexOf("| |-");
                if (tableIndex == -1) {
                    tableIndex = markdown.toString().indexOf("||-");
                }
                if (tableIndex == -1) {
                    tableIndex = markdown.toString().indexOf("| |:");
                }
                if (tableIndex != -1) {
                    ((SpannableStringBuilder) markdown).insert(tableIndex + 2, "\n");
                }
            }
        } catch (Throwable e) {
            MDLogger.e(TAG, "beforeSetText...e:" + e);
        }
    }
    private String modifyHighlightData(String markdown) {
        long startTime = SystemClock.elapsedRealtime();
        try {
            // Regular expression to match <span> tags with class="highlight" or class='highlight'
            String regex = "<span\\s+[^>]*class=[\"|']highlight[\"|'][^>]*>(.*?)</span>";

            // Compile the regex
            Pattern pattern = Pattern.compile(regex);

            // Create a matcher object
            Matcher matcher = pattern.matcher(markdown);
            // Find all matches
            int groupIndex = 0;
            while (matcher.find()) {
                // Print the content inside the <span> tag
                String span = matcher.group();
                ++groupIndex;
                if (TextUtils.isEmpty(span)) {
                    MDLogger.d(TAG, "span is null");
                    continue;
                }

                String spanContent = span.substring(span.indexOf('>') + 1, span.lastIndexOf('<'));
                if (!TextUtils.isEmpty(spanContent) && spanContent.length() > 1) {
                    StringBuilder afterSpan = new StringBuilder();
                    char[] spanArray = spanContent.toCharArray();
                    for (char c : spanArray) {
                        String single = span.replace(spanContent, String.valueOf(c));
                        afterSpan.append(single);
                    }
                    MDLogger.d(TAG, "modifyHighlightData afterSpan=" + afterSpan);
                    markdown = markdown.replace(span, afterSpan);
                }
            }

            final long costTime = (SystemClock.elapsedRealtime() - startTime);
            if (costTime > 5) {
                MDLogger.d(TAG, "modifyHighlightData end cost:" + costTime);
            }
        } catch (Throwable e) {
            MDLogger.e(TAG, "modifyHighlightData...e:" + e);
        }

        return markdown;
    }

    private String appendPoiAndRelatedEntityData(String markdown) {
        long startTime = SystemClock.elapsedRealtime();
        try {
            // Regular expression to match <span> tags with class="highlight" or class='highlight'
            String regex = "<span\\s+[^>]*class=\"(poi|related-entity)\"[^>]*>(.*?)</span>";

            // Compile the regex
            Pattern pattern = Pattern.compile(regex);

            // Create a matcher object
            Matcher matcher = pattern.matcher(markdown);
            // Find all matches
            int groupIndex = 0;
            while (matcher.find()) {
                // Print the content inside the <span> tag
                String span = matcher.group();
                ++groupIndex;
                if (TextUtils.isEmpty(span)) {
                    MDLogger.d(TAG, "append span is null");
                    continue;
                }

                String spanContent = span.substring(span.indexOf('>') + 1, span.lastIndexOf('<'));
                MDLogger.d(TAG, "appendPoiAndRelatedEntityData spanContent=" + spanContent + ", span=" + span);
                if (!TextUtils.isEmpty(spanContent)) {
                    String afterSpan = span.replace("</span>", " </span>");
                    markdown = markdown.replace(span, afterSpan);
                }
            }

            final long costTime = (SystemClock.elapsedRealtime() - startTime);
            if (costTime > 5) {
                MDLogger.d(TAG, "appendPoiAndRelatedEntityData end cost:" + costTime);
            }
        } catch (Throwable e) {
            MDLogger.e(TAG, "appendPoiAndRelatedEntityData...e:" + e);
        }

        return markdown;
    }

    private String handleFormulaCompat(String markdown) {
        try {
            // Regular expression to match formula \[a+b=c\]
            String formulaRegex = "(\\\\\\(.*?\\\\\\)|\\\\\\[[\\s\\S]*?\\\\\\])";

            // Compile the regex
            Pattern pattern = Pattern.compile(formulaRegex, Pattern.DOTALL);

            // Create a matcher object
            Matcher matcher = pattern.matcher(markdown);
            // Find all matches
            while (matcher.find()) {
                // find [a + b =3]
                String formula = matcher.group();
                if (TextUtils.isEmpty(formula)) {
                    MDLogger.d(TAG, "formula is null");
                    continue;
                }

                try {
                    String content = formula.substring(2, formula.length() - 2);
                    if (TextUtils.isEmpty(content) || TextUtils.isEmpty(content.trim())) {
                        MDLogger.d(TAG, "handleFormulaCompat do not handle formula=" + formula);
                        continue;
                    }
                } catch (Throwable e) {
                    MDLogger.e(TAG, "handleFormulaCompat e=" + e);
                }

                String afterFormula = formula;
                if (formula.startsWith("\\[")) {
                    afterFormula = formula.replace("\\[", "$$")
                            .replace("\\]", "$$");
                    markdown = markdown.replace(formula, afterFormula);
                } else {
                    afterFormula = formula.replace("\\(", "$")
                            .replace("\\)", "$");
                    markdown = markdown.replace(formula, afterFormula);
                }

                MDLogger.d(TAG, "handleFormulaCompat afterFormula:" + afterFormula);
            }
        } catch (Throwable e) {
            MDLogger.e(TAG, "handleFormulaCompat...e:" + e);
        }
        return markdown;
    }
}


================================================
FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/html/CustomIndentSpan.java
================================================
package com.fluid.afm.markdown.html;

import android.graphics.Canvas;
import android.graphics.Paint;
import android.text.Layout;
import android.text.style.LeadingMarginSpan;

public class CustomIndentSpan implements LeadingMarginSpan {
    private final int indent;
    private final int firstLineIndent;

    public CustomIndentSpan(int indent) {
        this.indent = indent;
        this.firstLineIndent = indent;
    }
    public CustomIndentSpan(int indent, int firstLineIndent) {
        this.indent = indent;
        this.firstLineIndent = firstLineIndent;
    }


    @Override
    public int getLeadingMargin(boolean first) {
        return first ? firstLineIndent : indent;
    }

    @Override
    public void drawLeadingMargin(Canvas c, Paint p, int x, int dir, int top, int baseline, int bottom, CharSequence text, int start, int end, boolean first, Layout layout) {
    }
}


================================================
FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/html/CustomUnderlineSpan.java
================================================
package com.fluid.afm.markdown.html;

import android.graphics.Canvas;
import android.graphics.Paint;
import android.text.style.ReplacementSpan;

/**
 * 自定义下划线
 */
public class CustomUnderlineSpan extends ReplacementSpan {

    public static final String TAG = "CustomUnderlineSpan";
    private final int color;
    private final float thickness;

    public CustomUnderlineSpan(int color, float thickness) {
        this.color = color;
        this.thickness = thickness;
    }

    @Override
    public int getSize(Paint paint, CharSequence text, int start, int end, Paint.FontMetricsInt fm) {
        return (int) paint.measureText(text, start, end);
    }

    @Override
    public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint) {
        int oldColor = paint.getColor();
        paint.setColor(color);
        paint.setStrokeWidth(thickness);

        canvas.drawLine(x,
                y,
                x + paint.measureText(text, start, end),
                y,
                paint);
        paint.setColor(oldColor);
        canvas.drawText(text, start, end, x, y, paint);
    }
}


================================================
FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/html/HtmlMarkTagHandler.java
================================================
package com.fluid.afm.markdown.html;

import android.graphics.Color;
import android.graphics.Typeface;
import android.text.TextUtils;
import android.text.style.BackgroundColorSpan;
import android.text.style.ForegroundColorSpan;
import android.text.style.StyleSpan;

import androidx.annotation.NonNull;

import com.fluid.afm.utils.MDLogger;
import com.fluid.afm.utils.ParseUtil;

import org.json.JSONObject;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

import io.noties.markwon.MarkwonConfiguration;
import io.noties.markwon.RenderProps;
import com.fluid.afm.span.AntUnderlineSupportMulLinesSpan;
import io.noties.markwon.html.CssInlineStyleParser;
import io.noties.markwon.html.CssProperty;
import io.noties.markwon.html.HtmlTag;
import io.noties.markwon.html.tag.SimpleTagHandler;

public class HtmlMarkTagHandler extends SimpleTagHandler {

    private static final String TAG = "HtmlMarkTagHandler";
    private int mBackgroundColor = 0xFFFFF2B3;
    private int backgroundHeight = 30;
    private String fontWeight = "normal";

    public HtmlMarkTagHandler() {
    }

    @Override
    public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps renderProps, @NonNull HtmlTag tag) {
        final String style = tag.attributes().get("style");
        final String classAttr = tag.attributes().get("class");
        if (!TextUtils.isEmpty(style)) {
            int color = 0;
            int backgroundColor = 0;

            for (CssProperty property : CssInlineStyleParser.create().parse(style)) {
                switch (property.key()) {
                    case "color":
                        color = ParseUtil.parseColor(property.value());
                        break;

                    case "background-color":
                        backgroundColor = ParseUtil.parseColor(property.value());
                        break;

                    default:
                        MDLogger.i("unexpected CSS property: %s", property.key());
                }
            }

            final List<Object> spans = new ArrayList<>(3);
            if (color != 0) {
                spans.add(new ForegroundColorSpan(color));
            }
            if (backgroundColor != 0) {
                spans.add(new BackgroundColorSpan(backgroundColor));
            }

            return spans.toArray();
        } else if (!TextUtils.isEmpty(classAttr)) {
            int color = 0;
            switch (classAttr) {

                case "markdown-green-color":
                case "down":
                    color = Color.parseColor("#0e9976");
                    break;

                case "markdown-red-color":
                case "up":
                    color = Color.parseColor("#e62c3b");
                    break;

                case "highlight":
                    String markTagStyles = "";
                    MDLogger.i(TAG, "mark---markTagStyles: " + markTagStyles);
                    try {
                        if (!TextUtils.isEmpty(markTagStyles)) {
                            JSONObject markTagStylesJson = new JSONObject(markTagStyles);
                            mBackgroundColor = ParseUtil.parseColor(markTagStylesJson.optString("backgroundColor"), mBackgroundColor);
                            backgroundHeight = ParseUtil.parseDp(markTagStylesJson.optString("backgroundHeight"), backgroundHeight);
                            String weight = markTagStylesJson.optString("fontWeight");
                            if (!TextUtils.isEmpty(weight)) {
                                fontWeight = weight;
                            }
                        }
                    } catch (Throwable e) {
                        MDLogger.e(TAG, "markTagStyles error: " + e.getMessage());
                    }
                    final List<Object> spans = new ArrayList<>();
                    if ("bold".equals(fontWeight)) {
                        StyleSpan boldSpan = new StyleSpan(Typeface.BOLD); // 加粗样式
                        spans.add(boldSpan);
                    }
                    spans.add(new AntUnderlineSupportMulLinesSpan(mBackgroundColor, backgroundHeight));
                    return spans.toArray();
            }
            final List<Object> spans = new ArrayList<>();
            if (color != 0) {
                spans.add(new ForegroundColorSpan(color));
                return spans.toArray();
            }
        } else {
            // 针对<mark>默认文本高亮</mark>样式默认处理
            final List<Object> spans = new ArrayList<>(1);
            spans.add(new TextHeightBackgroundSpan(mBackgroundColor));
            return spans.toArray();
        }

        return null;
    }

    @NonNull
    @Override
    public Collection<String> supportedTags() {
        return Collections.singleton("mark");
    }
}


================================================
FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/html/HtmlParaTagHandler.java
================================================
package com.fluid.afm.markdown.html;

import android.content.Context;
import android.text.TextUtils;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.fluid.afm.utils.MDLogger;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

import io.noties.markwon.MarkwonConfiguration;
import io.noties.markwon.RenderProps;
import io.noties.markwon.html.CssInlineStyleParser;
import io.noties.markwon.html.CssProperty;
import io.noties.markwon.html.HtmlTag;
import io.noties.markwon.html.tag.SimpleTagHandler;
import com.fluid.afm.utils.Utils;

public class HtmlParaTagHandler extends SimpleTagHandler {
    private static final String TAG = "HtmlParaTagHandler";

    private static final String ATTRIBUTE_INDENT = "indent";
    private static final String ATTRIBUTE_FIRST_LINE_INDENT = "first-line-indent";
    private final Context context;

    public HtmlParaTagHandler(Context context) {
        this.context = context;
    }

    @Nullable
    @Override
    public Object getSpans(@androidx.annotation.NonNull MarkwonConfiguration configuration, @androidx.annotation.NonNull RenderProps renderProps, @androidx.annotation.NonNull HtmlTag tag) {
        try {
            final String style = tag.attributes().get("style");

            if (!TextUtils.isEmpty(style)) {
                int indent = -1;
                int firstLineIndent = -1;

                for (CssProperty property : CssInlineStyleParser.create().parse(style)) {
                    switch (property.key()) {
                        case ATTRIBUTE_INDENT:
                            String indentValue = property.value();
                            if (indentValue.endsWith("rpx")) {
                                String rpxValue = indentValue.substring(0, indentValue.length() - 3);
                                indent = (int) Utils.rpxToPx(Float.parseFloat(rpxValue), context);
                            } else if (indentValue.endsWith("dp")) {
                                String dpValue = indentValue.substring(0, indentValue.length() - 2);
                                indent = Utils.dpToPx(context, Float.parseFloat(dpValue));
                            } else if (indentValue.endsWith("px")) {
                                String pxValue = indentValue.substring(0, indentValue.length() - 2);
                                indent = Integer.parseInt(pxValue);
                            } else {
                                MDLogger.i(TAG, "Unexpected unit: key=" + property.key() + ", value=" + indentValue);
                            }
                            break;
                        case ATTRIBUTE_FIRST_LINE_INDENT:
                            String firstLineValue = property.value();
                            if (firstLineValue.endsWith("rpx")) {
                                String rpxValue = firstLineValue.substring(0, firstLineValue.length() - 3);
                                firstLineIndent = (int) Utils.rpxToPx(Float.parseFloat(rpxValue), context);
                            } else if (firstLineValue.endsWith("dp")) {
                                String dpValue = firstLineValue.substring(0, firstLineValue.length() - 2);
                                firstLineIndent = Utils.dpToPx(context, Float.parseFloat(dpValue));
                            } else if (firstLineValue.endsWith("px")) {
                                String pxValue = firstLineValue.substring(0, firstLineValue.length() - 2);
                                firstLineIndent = Integer.parseInt(pxValue);
                            } else {
                                MDLogger.i(TAG, "Unexpected unit: key=" + property.key() + ", value=" + firstLineValue);
                            }
                            break;
                        default:
                            MDLogger.i(TAG, "Unexpected CSS property: key=" + property.key());
                    }
                }

                MDLogger.d(TAG, "handleSpans: style=" + style + ", indent=" + indent);

                final List<Object> spans = new ArrayList<>(3);
                if (indent >= 0 && firstLineIndent >= 0) {
                    spans.add(new CustomIndentSpan(indent, firstLineIndent));
                } else if (indent >= 0) {
                    spans.add(new CustomIndentSpan(indent));
                }

                return spans.toArray();
            }
        } catch (Exception e) {
            MDLogger.e(TAG, "handleSpans error: " + e.getMessage());
        }

        return null;
    }

    @NonNull
    @Override
    public Collection<String> supportedTags() {
        return Collections.singleton("para");
    }
}


================================================
FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/html/HtmlSpanTagHandler.java
================================================
package com.fluid.afm.markdown.html;

import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.text.TextUtils;
import android.text.style.BackgroundColorSpan;
import android.text.style.ForegroundColorSpan;

import androidx.annotation.NonNull;
import androidx.appcompat.content.res.AppCompatResources;

import com.fluid.afm.R;
import com.fluid.afm.markdown.ElementClickEventCallback;
import com.fluid.afm.markdown.image.SuperscriptImageSpan;
import com.fluid.afm.utils.MDLogger;
import com.fluid.afm.utils.ParseUtil;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

import io.noties.markwon.MarkwonVisitor;
import io.noties.markwon.SpannableBuilder;
import io.noties.markwon.html.CssInlineStyleParser;
import io.noties.markwon.html.CssProperty;
import io.noties.markwon.html.HtmlTag;
import io.noties.markwon.html.MarkwonHtmlRenderer;
import io.noties.markwon.html.TagHandler;
import com.fluid.afm.utils.Utils;

public class HtmlSpanTagHandler extends TagHandler {
    private static final String TAG = "HtmlSpanTagHandler";

    private static final String DEFAULT_POI_COLOR = "#0E489A";
    private static final String CLASS_POI = "poi";
    private static final String CLASS_RELATED_ENTITY = "related-entity";
    private static final String CLASS_VOICE_TEXT = "voicetext";
    private static final String ATTRIBUTE_COLOR = "color";
    private static final String ATTRIBUTE_BACKGROUND_COLOR = "background-color";
    private static final String CLASS_HIGHLIGHT = "highlight";

    private final Context context;
    private final ElementClickEventCallback mElementClickEventCallback;

    public HtmlSpanTagHandler(Context context, ElementClickEventCallback clickedInterface) {
        this.context = context;
        mElementClickEventCallback = clickedInterface;
    }

    private void handleInner(@NonNull MarkwonVisitor visitor,
                             @NonNull MarkwonHtmlRenderer renderer,
                             @NonNull HtmlTag tag) {
        if (tag.isBlock()) {
            visitChildren(visitor, renderer, tag.getAsBlock());
        }

        handleSpans(visitor, tag);
    }

    @Override
    public void handle(@NonNull MarkwonVisitor visitor,
                       @NonNull MarkwonHtmlRenderer renderer,
                       @NonNull HtmlTag tag) {
        handleInner(visitor, renderer, tag);
    }

    public void handleSpans(@NonNull MarkwonVisitor visitor,
                            @NonNull HtmlTag tag) {
        final String style = tag.attributes().get("style");
        final String classAttr = tag.attributes().get("class");

        if (!TextUtils.isEmpty(style)) {
            int color = 0;
            int backgroundColor = 0;

            for (CssProperty property : CssInlineStyleParser.create().parse(style)) {
                switch (property.key()) {
                    case ATTRIBUTE_COLOR:
                        color = ParseUtil.parseColor(property.value());
                        break;

                    case ATTRIBUTE_BACKGROUND_COLOR:
                        backgroundColor = ParseUtil.parseColor(property.value());
                        break;

                    default:
                        MDLogger.i("unexpected CSS property: %s", property.key());
                }
            }

            final List<Object> spans = new ArrayList<>(3);
            if (color != 0) {
                spans.add(new ForegroundColorSpan(color));
            }
            if (backgroundColor != 0) {
                spans.add(new BackgroundColorSpan(backgroundColor));
            }

            SpannableBuilder.setSpans(visitor.builder(), spans.toArray(), tag.start(), tag.end());
        } else if (!TextUtils.isEmpty(classAttr)) {
            int color = 0;
            switch (classAttr) {
                case "markdown-green-color":
                    color = ParseUtil.parseColor("#0e9976");
                    break;

                case "markdown-red-color":
                    color = ParseUtil.parseColor("#e62c3b");
                    break;

                case CLASS_HIGHLIGHT:
                    final List<Object> spans = new ArrayList<>(2);
                    spans.add(new CustomUnderlineSpan(Color.parseColor("#521677FF"),
                            Utils.dpToPx(context, 11)));
                    SpannableBuilder.setSpans(visitor.builder(), spans.toArray(), tag.start(), tag.end());
                    return;
                case CLASS_POI:
                    setClassPoiSpans(visitor, tag);
                    return;
                case CLASS_RELATED_ENTITY:
                    setClassRelatedEntitySpans(visitor, tag);
                    return;

                case CLASS_VOICE_TEXT:
                    final List<Object> spansVoice = new ArrayList<>();
                    spansVoice.add(new ForegroundColorSpan(0xFF1A65FF));
                    spansVoice.add(new BackgroundColorSpan(0xFFF4F8FF));
                    SpannableBuilder.setSpans(visitor.builder(), spansVoice.toArray(), tag.start(), tag.end());
                    return;

            }

            final List<Object> spans = new ArrayList<>(2);
            if (color != 0) {
                spans.add(new ForegroundColorSpan(color));
                SpannableBuilder.setSpans(visitor.builder(), spans.toArray(), tag.start(), tag.end());
            }
        }
    }
    @NonNull
    @Override
    public Collection<String> supportedTags() {
        return Collections.singleton("span");
    }

    /**
     *  class="poi" span
     *
     */
    private void setClassPoiSpans(@NonNull MarkwonVisitor visitor, @NonNull HtmlTag tag) {
        int color;
        final List<Object> poiSpans = new ArrayList<>(3);
        final String colorAttr = tag.attributes().get(ATTRIBUTE_COLOR);
        if (TextUtils.isEmpty(colorAttr)) {
            // 默认色
            color = Color.parseColor(DEFAULT_POI_COLOR);
        } else {
            color = ParseUtil.parseColor(colorAttr);
        }
        poiSpans.add(new ForegroundColorSpan(color));

        final String hrefAttr = tag.attributes().get("href");
        poiSpans.add(new SpanTextClickableSpan(SpanTextClickableSpan.ClickableTextType.TYPE_POI,
                hrefAttr, null, mElementClickEventCallback));

        MDLogger.d(TAG, "poi color:" + color
                + ",start:" + tag.start()
                + ",end:" + tag.end() + ",href=" + hrefAttr);

        SpannableBuilder.setSpans(visitor.builder(), poiSpans.toArray(), tag.start(), tag.end() - 1);

        Drawable poiSuperscriptDrawable = getPoiSuperscriptDrawable();
        if (poiSuperscriptDrawable != null) {
            final int w = Utils.dpToPx(context, 12);
            poiSuperscriptDrawable.setBounds(0, 0, w, w);
            final List<Object> drawableSpans = new ArrayList<>(2);
            drawableSpans.add(new SuperscriptImageSpan(poiSuperscriptDrawable));
            drawableSpans.add(new SpanTextClickableSpan(SpanTextClickableSpan.ClickableTextType.TYPE_POI,
                    hrefAttr, "", null));
            SpannableBuilder.setSpans(visitor.builder(), drawableSpans.toArray(),
                    tag.end() - 1, tag.end());
        }
    }

    /**
     * class="related-entity" span
     */
    private void setClassRelatedEntitySpans(@NonNull MarkwonVisitor visitor, @NonNull HtmlTag tag) {
        int color;
        final List<Object> entitySpans = new ArrayList<>(3);

        final String entityIdAttr = tag.attributes().get("data-entity-id");

        final String entityColorAttr = tag.attributes().get(ATTRIBUTE_COLOR);
        if (TextUtils.isEmpty(entityColorAttr)) {
            color = Color.parseColor(DEFAULT_POI_COLOR);
        } else {
            color = ParseUtil.parseColor(entityColorAttr);
        }
        entitySpans.add(new ForegroundColorSpan(color));
        entitySpans.add(new SpanTextClickableSpan(SpanTextClickableSpan.ClickableTextType.TYPE_RELATED_ENTITY,
                null, entityIdAttr, mElementClickEventCallback));

        MDLogger.d(TAG, "entity color:" + color
                + ",start:" + tag.start()
                + ",end:" + tag.end() + ",entityIdAttr=" + entityIdAttr);

        SpannableBuilder.setSpans(visitor.builder(), entitySpans.toArray(), tag.start(), tag.end() - 1);

        Drawable superscriptDrawable = getRelatedEntitySuperscriptDrawable();
        if (superscriptDrawable != null) {
            final int w = Utils.dpToPx(context, 12);
            superscriptDrawable.setBounds(0, 0, w, w);
            final List<Object> drawableSpans = new ArrayList<>(2);
            drawableSpans.add(new SuperscriptImageSpan(superscriptDrawable));
            drawableSpans.add(new SpanTextClickableSpan(SpanTextClickableSpan.ClickableTextType.TYPE_RELATED_ENTITY,
                    null, entityIdAttr, mElementClickEventCallback));
            SpannableBuilder.setSpans(visitor.builder(), drawableSpans.toArray(),
                    tag.end() - 1, tag.end());
        }
    }

    private Drawable getPoiSuperscriptDrawable() {
        if (context == null) {
            return null;
        }
        return AppCompatResources.getDrawable(context, R.drawable.chat_span_poi);
    }

    private Drawable getRelatedEntitySuperscriptDrawable() {
        if (context == null) {
            return null;
        }

        return AppCompatResources.getDrawable(context, R.drawable.chat_span_related_entity);
    }
}


================================================
FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/html/SpanTextClickableSpan.java
================================================
package com.fluid.afm.markdown.html;

import android.text.TextPaint;
import android.text.style.URLSpan;
import android.view.View;

import androidx.annotation.NonNull;

import com.fluid.afm.markdown.ElementClickEventCallback;
import com.fluid.afm.utils.MDLogger;

public class SpanTextClickableSpan extends URLSpan {
    private static final String TAG = SpanTextClickableSpan.class.getSimpleName();

    private final ClickableTextType clickableTextType;
    private final String url;
    private final String entityId;
    private final ElementClickEventCallback mElementClickEventCallback;

    public SpanTextClickableSpan(ClickableTextType type, String url, String entityId, ElementClickEventCallback clickedInterface) {
        super(url);
        this.clickableTextType = type;
        this.url = url;
        this.entityId = entityId;
        mElementClickEventCallback = clickedInterface;
    }

    @Override
    public void updateDrawState(TextPaint ds) {
        ds.setColor(ds.linkColor);
        ds.setUnderlineText(false);
    }

    @Override
    public void onClick(@NonNull View widget) {
        MDLogger.d(TAG, "onClick...type:" + clickableTextType
                + ",entityId=" + entityId
                + ",url=" + url);
        if (mElementClickEventCallback != null && mElementClickEventCallback.onTextClickableSpanClicked(widget, url, entityId, clickableTextType)) {
            return;
        }
        super.onClick(widget);
    }

    public enum ClickableTextType {

        TYPE_POI,

        TYPE_RELATED_ENTITY
    }
}


================================================
FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/html/TextHeightBackgroundSpan.java
================================================
package com.fluid.afm.markdown.html;

import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import android.text.style.ReplacementSpan;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

public class TextHeightBackgroundSpan extends ReplacementSpan {

    private final int backgroundColor;

    public TextHeightBackgroundSpan(int backgroundColor) {
        this.backgroundColor = backgroundColor;
    }

    @Override
    public int getSize(@NonNull Paint paint, CharSequence text, int start, int end, @Nullable Paint.FontMetricsInt fm) {
        return (int) paint.measureText(text, start, end);
    }

    @Override
    public void draw(@NonNull Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, @NonNull Paint paint) {
        final int oldColor = paint.getColor();
        final Paint.Style oldStyle = paint.getStyle();

        Paint.FontMetrics fontMetrics = paint.getFontMetrics();

        float backgroundTop = y + fontMetrics.ascent;
        float backgroundBottom = y + fontMetrics.descent;

        paint.setColor(backgroundColor);
        paint.setStyle(Paint.Style.FILL);
        
        RectF rect = new RectF(
                x,
                backgroundTop,
                x + paint.measureText(text, start, end),
                backgroundBottom
        );
        canvas.drawRect(rect, paint);

        paint.setColor(oldColor);
        paint.setStyle(oldStyle);
        canvas.drawText(text, start, end, x, y, paint);
    }
} 

================================================
FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/icon/IconSpan.java
================================================
package com.fluid.afm.markdown.icon;

import android.graphics.Canvas;
import android.graphics.Paint;
import android.text.TextUtils;
import android.text.style.ReplacementSpan;
import android.view.View;
import android.widget.TextView;

import androidx.annotation.NonNull;

import com.fluid.afm.icon.DrawableWrapper;
import com.fluid.afm.icon.LoadIconUtil;
import com.fluid.afm.icon.LoadImageCallback;

import com.fluid.afm.utils.Utils;

public class IconSpan extends ReplacementSpan implements View.OnAttachStateChangeListener {
    private DrawableWrapper mDrawableWrapper;
    private final TextView mTextView;
    private LoadImageCallback mLoadImageCallback;
    private final String mSrc;
    protected float iconOffset;

    public IconSpan(TextView textView, String imageUrl) {
        mTextView = textView;
        mSrc = imageUrl;
        textView.addOnAttachStateChangeListener(this);
    }

    @Override
    public int getSize(@NonNull Paint paint, CharSequence text, int start, int end, Paint.FontMetricsInt fm) {
        if (TextUtils.isEmpty(mSrc)) {
            return 0;
        }
        int textSize = (int) (paint.getFontMetrics().descent - paint.getFontMetrics().ascent + 0.5f);

        iconOffset = textSize * Utils.FONT_HEIGHT_IN_LINE;
        fetchImage(textSize);
        if (mDrawableWrapper.getDrawable() != null) {
            return mDrawableWrapper.getDrawable().getBounds().width();
        }
        return textSize;
    }

    private void fetchImage(int size) {
        mDrawableWrapper = LoadIconUtil.getIcon(mSrc, size, size, false);
        if (mDrawableWrapper.getDrawable() == null) {
            if (mLoadImageCallback == null) {
                mLoadImageCallback = new LoadImageCallback(mTextView);
            }
            mDrawableWrapper.load(mTextView.getContext(), mLoadImageCallback);
        }
    }

    @Override
    public void draw(@NonNull Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, @NonNull Paint paint) {
        // draw icon
        if (mDrawableWrapper.getDrawable() != null) {
            canvas.save();
            canvas.translate(x, y - Math.min(iconOffset, mDrawableWrapper.getDrawable().getBounds().height()));
            mDrawableWrapper.getDrawable().draw(canvas);
            canvas.restore();
        }
    }

    @Override
    public void onViewAttachedToWindow(View v) {
        /* no-op */
    }

    @Override
    public void onViewDetachedFromWindow(View v) {
        if (mDrawableWrapper != null) {
            mDrawableWrapper.cancel(mLoadImageCallback);
        }
        mTextView.removeOnAttachStateChangeListener(this);
    }

}


================================================
FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/icon/IconSpanHandler.java
================================================
package com.fluid.afm.markdown.icon;

import android.widget.TextView;

import java.util.Collection;
import java.util.Collections;

import io.noties.markwon.MarkwonVisitor;
import io.noties.markwon.SpannableBuilder;
import io.noties.markwon.html.HtmlTag;
import io.noties.markwon.html.MarkwonHtmlRenderer;
import io.noties.markwon.html.TagHandler;

public class IconSpanHandler extends TagHandler {
    private final TextView mTextView;

    public IconSpanHandler(TextView textView) {
        mTextView = textView;
    }

    @Override
    public void handle(MarkwonVisitor visitor, MarkwonHtmlRenderer renderer, HtmlTag tag) {
        final String src = tag.attributes().get("src");
        IconSpan iconSpan = new IconSpan(mTextView, src);
        if (tag.end() > tag.start()) {
            SpannableBuilder.setSpans(visitor.builder(), new Object[]{iconSpan}, tag.start(), tag.end());
        } else {
            visitor.builder().spannableStringBuilder().insert(tag.start(), String.valueOf('\u00a0'));
            SpannableBuilder.setSpans(visitor.builder(), new Object[]{iconSpan}, tag.start(), tag.start() + 1);
        }
    }

    @Override
    public Collection<String> supportedTags() {
        return Collections.singleton("icon");
    }
}


================================================
FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/iconlink/IconLinkSpan.java
================================================
package com.fluid.afm.markdown.iconlink;

import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Rect;
import android.text.TextPaint;
import android.text.style.LineHeightSpan;
import android.text.style.ReplacementSpan;
import android.view.View;
import android.widget.TextView;

import androidx.annotation.NonNull;

import com.fluid.afm.icon.DrawableWrapper;
import com.fluid.afm.icon.LoadIconUtil;
import com.fluid.afm.icon.LoadImageCallback;
import com.fluid.afm.span.IClickableSpan;
import com.fluid.afm.utils.Utils;

import io.noties.markwon.utils.SpanUtils;
public class IconLinkSpan extends ReplacementSpan implements LineHeightSpan, View.OnAttachStateChangeListener, IClickableSpan {

    private static final int _10_6DP = Utils.dpToPx(10.67f);
    private static final int _1_5DP = Utils.dpToPx(1.5f);
    private static final int _3DP = Utils.dpToPx(3f);
    private static final int RIGHT_PADDING = _3DP;
    private static final int LEFT_PADDING = _1_5DP;
    private static final int ICON_DISTANCE = _1_5DP;
    private static final int CORNER_RADIUS = _10_6DP;
    private static final int LEFT_RIGHT_MARGIN = _1_5DP;
    private static final float VERTICAL_PADDING_RATIO = 0.2f;
    private int mLineHeight = 0;
    private DrawableWrapper mDrawableWrapper;
    private final TextView mTextView;
    private final Path mPath = new Path();
    private boolean mFetched = false;
    private final int mBackgroundColor;
    private final int mTextColor;
    private final float mFontSize;
    private float mIconSize;
    private final String mSrcUrl;
    private int mInnerLineHeight;
    private final Rect mBgRect = new Rect();
    private LoadImageCallback mLoadImageCallback;
    private final String mLink;
    private int mTop;
    private int mBottom;
    public IconLinkSpan(TextView textView, String imageUrl, int backgroundColor, int textColor, float fontSize, String link) {
        mTextView = textView;
        mFontSize = fontSize;
        mBackgroundColor = backgroundColor;
        mTextColor = textColor;
        mSrcUrl = imageUrl;
        mLink = link;
        textView.addOnAttachStateChangeListener(this);
    }

    @Override
    public int getSize(@NonNull Paint paint, CharSequence text, int start, int end, Paint.FontMetricsInt fm) {
        if (mLineHeight == 0) {
            mLineHeight = (int) (paint.getFontMetrics().descent - paint.getFontMetrics().ascent);
        }
        float oldSize = paint.getTextSize();

        if (mFontSize > 0) {
            paint.setTextSize(mFontSize);
            mInnerLineHeight = (int) (paint.getFontMetrics().descent - paint.getFontMetrics().ascent);
        } else {
            mInnerLineHeight = mLineHeight;
        }

        mIconSize = mInnerLineHeight * 1.05f;
        if (!mFetched) {
            mFetched = true;
            fetchImage((int) mIconSize);
        } else if (mDrawableWrapper.getDrawable() != null) {
            Rect imgBounds = mDrawableWrapper.getDrawable().getBounds();
            mIconSize = imgBounds.width();
        }
        float textW = paint.measureText(text, start, end);
        int size = (int) (textW + LEFT_RIGHT_MARGIN + mIconSize + LEFT_RIGHT_MARGIN + ICON_DISTANCE);
        if (mBackgroundColor != 0) {
            int paddingV = (int) (mInnerLineHeight * VERTICAL_PADDING_RATIO);
            int bgW = (int) (LEFT_PADDING + RIGHT_PADDING + textW + mIconSize + ICON_DISTANCE);
            size = bgW + LEFT_RIGHT_MARGIN + LEFT_RIGHT_MARGIN;
            mBgRect.set(0, 0, bgW, mInnerLineHeight + paddingV + paddingV);
        }
        if (mFontSize > 0) {
            paint.setTextSize(oldSize);
        }

        return size;
    }

    private void fetchImage(int size) {
        mDrawableWrapper = LoadIconUtil.getIcon(mSrcUrl, size, size, true);
        if (mDrawableWrapper.getDrawable() == null) {
            if (mLoadImageCallback == null) {
                mLoadImageCallback = new LoadImageCallback(mTextView);
            }
            mDrawableWrapper.load(mTextView.getContext(), mLoadImageCallback);
        }
    }

    @Override
    public void draw(@NonNull Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, @NonNull Paint paint) {
        mTop = top;
        mBottom = y;
        int originalColor = paint.getColor();
        float finalX = x + LEFT_RIGHT_MARGIN;
        mPath.reset();
        if (mFontSize > 0) {
            paint.setTextSize(mFontSize);
        }
        Paint.Style oldStyle = paint.getStyle();
        float rectTop = y + mInnerLineHeight * 1f / 9f - mIconSize;
        // draw background
        if (mBackgroundColor != 0) {
            paint.setColor(mBackgroundColor);
            paint.setStyle(Paint.Style.FILL);
            int vp = (int) ((mBgRect.height() - mInnerLineHeight) / 2f);
            mPath.addRoundRect(finalX, rectTop - vp,
                    finalX + mBgRect.width(),
                    rectTop  + mBgRect.height(),
                    CORNER_RADIUS, CORNER_RADIUS, Path.Direction.CW);
            canvas.drawPath(mPath, paint);
            paint.setStyle(oldStyle);
            finalX += LEFT_PADDING;
        }
        // draw icon
        if (mDrawableWrapper.getDrawable() != null) {
            canvas.save();
            canvas.translate(finalX, rectTop);
            mDrawableWrapper.getDrawable().draw(canvas);
            canvas.restore();
        }
        paint.setStyle(oldStyle);
        float oldSize = paint.getTextSize();
        if (mTextColor != 0) {
            paint.setColor(mTextColor);
        } else {
            paint.setColor(originalColor);
        }
        // draw text x: left-margin + left-padding + icon + spacing
        canvas.drawText(text, start, end, finalX + mIconSize + ICON_DISTANCE, y, paint);

        if (mTextColor != 0) {
            paint.setColor(originalColor);
        }
        if (mFontSize > 0) {
            paint.setTextSize(oldSize);
        }
    }

    @Override
    public void chooseHeight(CharSequence text, int start, int end, int spanstartv, int lineHeight, Paint.FontMetricsInt fm) {
        if (mBgRect.height() <= mLineHeight) {
            return;
        }
        if (fm == null) {
            return;
        }
        if (SpanUtils.isSelf(start, end, text, this)) { // adjust line height that contains the span
            if (mBgRect.height() > fm.bottom - fm.top) { // span height is higher than line height
                int delta = ((mBgRect.height() - (fm.bottom - fm.top))) / 2;
                fm.top -= delta;
                fm.bottom += delta;
                fm.ascent -= delta;
                fm.descent += delta;
            }
        }
    }

    @Override
    public void updateDrawState(TextPaint ds) {
        super.updateDrawState(ds);
    }

    @Override
    public void onViewAttachedToWindow(@NonNull View v) {
        /* no-op */
    }

    @Override
    public void onViewDetachedFromWindow(@NonNull View v) {
        if (mDrawableWrapper != null) {
            mDrawableWrapper.cancel(mLoadImageCallback);
        }
        mTextView.removeOnAttachStateChangeListener(this);
    }

    @Override
    public String getUrl() {
        return mLink;
    }

    @Override
    public String getType() {
        return "iconlink";
    }

    @Override
    public int getTop() {
        return mTop;
    }

    @Override
    public int getBottom() {
        return mBottom;
    }
}


================================================
FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/iconlink/IconLinkSpanHandler.java
================================================
package com.fluid.afm.markdown.iconlink;

import android.graphics.Color;
import android.text.TextPaint;
import android.text.TextUtils;
import android.text.style.URLSpan;
import android.view.View;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.fluid.afm.markdown.ElementClickEventCallback;
import com.fluid.afm.utils.MDLogger;
import com.fluid.afm.utils.ParseUtil;

import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;

import io.noties.markwon.MarkwonVisitor;
import io.noties.markwon.SpannableBuilder;
import io.noties.markwon.html.CssInlineStyleParser;
import io.noties.markwon.html.CssProperty;
import io.noties.markwon.html.HtmlTag;
import io.noties.markwon.html.MarkwonHtmlRenderer;
import io.noties.markwon.html.TagHandler;

public class IconLinkSpanHandler extends TagHandler {
    private final TextView mTextView;
    private final ElementClickEventCallback mnClickLCallback;

    public IconLinkSpanHandler(TextView textView, @Nullable ElementClickEventCallback onClickLCallback2) {
        mTextView = textView;
        mnClickLCallback = onClickLCallback2;
    }

    @Override
    public void handle(MarkwonVisitor visitor, MarkwonHtmlRenderer renderer, HtmlTag tag) {
        final String style = tag.attributes().get("style");
        int textColor = 0;
        int bgColor = 0;
        float fontSize = 0;
        if (!TextUtils.isEmpty(style)) {
            for (CssProperty property : CssInlineStyleParser.create().parse(style)) {
                switch (property.key()) {
                    case "color":
                        textColor = ParseUtil.parseColorWithRGBA(property.value());
                        break;
                    case "font-size":
                        fontSize = ParseUtil.parseDp(mTextView.getContext(), property.value(), 0);
                        break;
                    case "background-color":
                        bgColor = ParseUtil.parseColorWithRGBA(property.value());
                        break;
                    default:
                        MDLogger.i("unexpected CSS property: %s", property.key());
                }
            }
        }

        final String src = tag.attributes().get("src");
        final String link = tag.attributes().get("link");
        final String destination = visitor.configuration().imageDestinationProcessor().process(src);
        IconLinkSpan iconSpan = new IconLinkSpan(mTextView, destination,
                bgColor, textColor, fontSize, link);
        if (!TextUtils.isEmpty(link)) {
            URLSpan clickableSpan = new URLSpan(link) {
                @Override
                public void onClick(@NonNull View widget) {
                    boolean result = false;
                    if (mnClickLCallback != null) {
                        HashMap<String, Object> param = new HashMap<>(2);
                        param.put(ElementClickEventCallback.PARAM_KEY_LINK, link);
                        param.put(ElementClickEventCallback.PARAM_KEY_SOURCE, ElementClickEventCallback.SOURCE_TYPE_ICON_LINK);
                        result = mnClickLCallback.onLinkClicked(param);
                    }
                    if (!result) {
                        super.onClick(widget);
                    }
                }
                @Override
                public void updateDrawState(TextPaint ds) {
                    ds.bgColor = Color.TRANSPARENT;
                    ds.setUnderlineText(false);
                }
            };
            SpannableBuilder.setSpans(visitor.builder(), new Object[]{iconSpan, clickableSpan}, tag.start(), tag.end());
        } else {
            SpannableBuilder.setSpans(visitor.builder(), new Object[]{iconSpan}, tag.start(), tag.end());
        }

    }

    @Override
    public Collection<String> supportedTags() {
        return Collections.singleton("iconlink");
    }
}


================================================
FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/image/CustomImageSpan.java
================================================
package com.fluid.afm.markdown.image;

import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.drawable.Drawable;
import android.text.Spanned;

public class CustomImageSpan extends SuperscriptImageSpan {

    public CustomImageSpan(Drawable drawable) {
        super(drawable, ALIGN_CENTER);
    }

    @Override
    public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint) {
        if (!isSelf(start, end, text, this)) {
            return;
        }
        super.draw(canvas, text, start, end, x, top, y, bottom, paint);
    }
    private static boolean isSelf(int start, int end, CharSequence text, Object span) {
        final int spanStart = ((Spanned) text).getSpanStart(span);
        final int spanEnd = ((Spanned) text).getSpanEnd(span);
        return spanStart <= start && spanEnd >= end - 1;
    }

}


================================================
FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/image/FootnoteClickSpan.java
================================================
package com.fluid.afm.markdown.image;

import android.annotation.SuppressLint;
import android.text.style.ClickableSpan;
import android.view.View;

import androidx.annotation.NonNull;

import com.fluid.afm.markdown.ElementClickEventCallback;

public class FootnoteClickSpan extends ClickableSpan {
    private final ElementClickEventCallback mClickCallback;
    private final String mIndexSequence;

    public FootnoteClickSpan(String indexSequence, ElementClickEventCallback onClickCallback) {
        mIndexSequence = indexSequence;
        mClickCallback = onClickCallback;
    }

    @SuppressLint("ClickableViewAccessibility")
    @Override
    public void onClick(@NonNull View widget) {
      if (mClickCallback != null) {
          mClickCallback.onFootnoteClicked(mIndexSequence);
      }
    }
}


================================================
FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/image/FootnoteSpan.java
================================================
package com.fluid.afm.markdown.image;

import android.graphics.Canvas;
import android.graphics.Paint;
import android.text.style.ReplacementSpan;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.fluid.afm.styles.FootnoteStyle;

import io.noties.markwon.utils.SpanUtils;
import com.fluid.afm.utils.Utils;

public class FootnoteSpan extends ReplacementSpan {
    private static final int SPACE = Utils.dpToPx(2);
    private static final int SIZE = Utils.dpToPx(16);
    private final String mIndexSequence;
    private final FootnoteStyle mStyle;

    public FootnoteSpan(String indexSequence, FootnoteStyle style) {
        this.mIndexSequence = indexSequence;
        mStyle = style;
    }

    @Override
    public int getSize(@NonNull Paint paint, CharSequence text, int start, int end, @Nullable Paint.FontMetricsInt fm) {
        if (mStyle.style() == FootnoteStyle.STYLE_RECTANGLE) {
            float oldSize = paint.getTextSize();
            boolean oldBold = paint.isFakeBoldText();
            paint.setTextSize(mStyle.fontSize());
            paint.setFakeBoldText(mStyle.isBold());
            float textW = paint.measureText(mIndexSequence);
            float result = mStyle.size();
            if (textW > SIZE) {
                result = textW + SPACE + SPACE;
            }
            paint.setTextSize(oldSize);
            paint.setFakeBoldText(oldBold);
            return (int) (result + 0.5f);
        }
        if (mStyle.size() > 0) {
            return (int) (mStyle.size() + SPACE + SPACE);
        }
        return SIZE + SPACE + SPACE;
    }

    @Override
    public void draw(@NonNull Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, @NonNull Paint paint) {
        if (!SpanUtils.isSelf(start, end, text, this)) {
            return;
        }
        float oldSize = paint.getTextSize();
        int oldColor = paint.getColor();
        int saveCount = canvas.save();
        boolean oldBold = paint.isFakeBoldText();

        if (mStyle.backgroundColor() != 0) {
            paint.setColor(mStyle.backgroundColor());
        }
        float shapeSize = mStyle.size() > 0 ? mStyle.size() : SIZE;
        float lineHeight = paint.getFontMetrics().descent - paint.getFontMetrics().ascent;
        float middleY = y - lineHeight / 2f + Utils.FONT_SPACING_IN_LINE * lineHeight;
        float transY = middleY - shapeSize / 2f;
        canvas.translate(x + SPACE, transY);
        if (mStyle.fontSize() > 0) {
            paint.setTextSize(mStyle.fontSize());
        }
        float textW = paint.measureText(mIndexSequence);
        if (mStyle.style() == FootnoteStyle.STYLE_RECTANGLE) {
            if (textW > shapeSize) {
                shapeSize = textW + SPACE + SPACE;
            }
            canvas.drawRoundRect(0, 0, shapeSize, shapeSize, mStyle.radius(), mStyle.radius(), paint);
        } else {
            canvas.drawCircle(shapeSize / 2f, shapeSize / 2f, shapeSize / 2f, paint);
        }
        canvas.restoreToCount(saveCount);
        if (mStyle.textColor() != 0) {
            paint.setColor(mStyle.textColor());
        } else {
            paint.setColor(oldColor);
        }
        if (mStyle.isBold()) {
             paint.setFakeBoldText(true);
        }
        float textHeight = paint.descent() - paint.ascent();
        float offsetY = (lineHeight - textHeight) / 2;
        float startX = SPACE + x + (shapeSize - textW) / 2;
        canvas.drawText(mIndexSequence, startX, y - offsetY, paint);
        paint.setTextSize(oldSize);
        paint.setColor(oldColor);
        paint.setFakeBoldText(oldBold);
    }
}


================================================
FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/image/SuperscriptImageSpan.java
================================================
package com.fluid.afm.markdown.image;

import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.drawable.Drawable;
import android.text.style.ImageSpan;

import androidx.annotation.NonNull;

import com.fluid.afm.utils.Utils;

public class SuperscriptImageSpan extends ImageSpan {
    public static final int ALIGN_TOP = 0x10;
    public static final int ALIGN_CENTER = 2;

    public SuperscriptImageSpan(@NonNull Drawable drawable) {
        super(drawable, ALIGN_TOP);
    }

    public SuperscriptImageSpan(Drawable drawable, int verticalAlignment) {
        super(drawable, verticalAlignment);
    }

    @Override
    public void draw(Canvas canvas, CharSequence text,
                     int start, int end, float x,
                     int top, int y, int bottom, Paint paint) {
        Drawable b = getDrawable();
        canvas.save();
        float transY = bottom - b.getBounds().bottom;
        if (mVerticalAlignment == ALIGN_BASELINE) {
            transY -= paint.getFontMetricsInt().descent;
        } else if (mVerticalAlignment == ALIGN_CENTER) {
            float delta = (b.getBounds().height() - paint.getTextSize() ) / 2;
            float textTop = y - paint.getTextSize() * Utils.FONT_HEIGHT_IN_LINE;
            transY = textTop - delta;
        } else if (mVerticalAlignment == ALIGN_BOTTOM) {
            transY = bottom - b.getBounds().bottom;
        } else {
            transY = top;
        }

        canvas.translate(x, transY);
        b.draw(canvas);
        canvas.restore();
    }
}



================================================
FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/list/DefinitionListPlugin.java
================================================
package com.fluid.afm.markdown.list;

import android.text.TextUtils;

import androidx.annotation.NonNull;

import com.fluid.afm.utils.MDLogger;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import io.noties.markwon.AbstractMarkwonPlugin;

public class DefinitionListPlugin extends AbstractMarkwonPlugin {
    private static final String TAG = "DefinitionListPlugin";
    private static final Pattern TABLE_PATTERN = Pattern.compile("\\|[ \\t]*:?-+:?[ \\t]*(\\|[ \\t]*:?-+:?[ \\t]*)*(\\|$)?", Pattern.MULTILINE);

    @Override
    public String processMarkdown(@NonNull String markdown) {
        long startTime = System.currentTimeMillis();
        if (!markdown.contains(":")) {
            return markdown;
        }
        
        if (hasMarkdownTable(markdown)) {
            return markdown;
        }
        
        if (!hasDefinitionList(markdown)) {
            return markdown;
        }
        return processDefinitionList(markdown, startTime);
    }

    private boolean hasDefinitionList(String markdown) {
        int length = markdown.length();
        boolean newLine = true;
        boolean hasTerm = false;
        
        for (int i = 0; i < length; i++) {
            char c = markdown.charAt(i);
            
            if (c == '\n') {
                newLine = true;
                continue;
            }
            
            if (newLine && (c == ' ' || c == '\t')) {
                continue;
            }
            
            if (newLine && c == ':') {
                if (hasTerm) {
                    return true;
                }
            } else if (newLine) {
                hasTerm = true;
            }
            
            newLine = false;
        }
        
        return false;
    }

    private String processDefinitionList(String markdown, long startTime) {
        StringBuilder result = new StringBuilder(markdown.length() + 100);
        String[] lines = markdown.split("\n");
        
        int i = 0;
        boolean lastWasDefinitionList = false;
        
        while (i < lines.length) {
            int start = findDefinitionListStart(lines, i);
            if (start == -1) {
                for (int j = i; j < lines.length; j++) {
                    result.append(lines[j]).append('\n');
                }
                break;
            }
            for (int j = i; j < start; j++) {
                result.append(lines[j]).append('\n');
                lastWasDefinitionList = false;
            }
            int end = findDefinitionListEnd(lines, start);
            if (lastWasDefinitionList && start > i) {
                result.append('\n');
            }

            processDefinitionListSection(lines, start, end, result);
            lastWasDefinitionList = true;
            
            i = end + 1;
            
            if (i < lines.length && !lines[i].trim().isEmpty()) {
                result.append('\n');
            }
        }
        MDLogger.i(TAG,"processDefinitionList cost: " + (System.currentTimeMillis() - startTime));
        return result.toString();
    }
    private int findDefinitionListEnd(String[] lines, int startIndex) {
        boolean inDefinitionList = false;
        
        for (int i = startIndex; i < lines.length; i++) {
            String line = lines[i].trim();
            
            if (isOtherMarkdownFormat(line)) {
                return i - 1;
            }
            
            if (line.isEmpty()) {
                if (inDefinitionList && (i + 1 >= lines.length || !isDefinitionListLine(lines[i+1]))) {
                    return i - 1;
                }
                continue;
            }
            
            if (!isDefinitionListLine(line) && inDefinitionList) {
                return i - 1;
            }
            
            if (!line.startsWith(":")) {
                if (i + 1 >= lines.length || !lines[i + 1].trim().startsWith(":")) {
                    if (inDefinitionList) {
                        return i - 1;
                    }
                } else {
                    inDefinitionList = true;
                }
            } else {
                inDefinitionList = true;
            }
        }
        
        return lines.length - 1;
    }

    private boolean isDefinitionListLine(String line) {
        line = line.trim();
        if (line.startsWith(":")) {
            return true;
        }
        return !isOtherMarkdownFormat(line);
    }

    private boolean isOtherMarkdownFormat(String line) {
        return isMarkdownHeader(line) || isMarkdownList(line) || 
               isCodeBlock(line) || isHorizontalRule(line);
    }

    private int findDefinitionListStart(String[] lines, int startIndex) {
        for (int i = startIndex; i < lines.length - 1; i++) {
            String line = lines[i].trim();
            String nextLine = lines[i + 1].trim();
            
            if (!line.isEmpty() && nextLine.startsWith(":") &&
                !isOtherMarkdownFormat(line)) {
                return i;
            }
        }
        return -1;
    }

    private void processDefinitionListSection(String[] lines, int start, int end, StringBuilder result) {
        result.append("<dl>\n");
        
        for (int i = start; i <= end; i++) {
            String line = lines[i].trim();
            
            if (line.isEmpty()) {
                continue;
            }
            
            if (line.startsWith(":")) {
                String definition = line.substring(1);
                
                String trimmedDefinition = definition.trim();
                if (!trimmedDefinition.isEmpty()) {
                    result.append("  <dd>").append(trimmedDefinition).append("</dd>\n");
                }
            } else if (i + 1 <= end && lines[i + 1].trim().startsWith(":")) {
                result.append("  <dt>").append(line).append("</dt>\n");
            } else {
                result.append(lines[i]).append('\n');
            }
        }
        
        result.append("</dl>\n");
    }

    private boolean isMarkdownHeader(String line) {
        return line.startsWith("#") || line.startsWith("=====") || line.startsWith("-----");
    }

    private boolean isMarkdownList(String line) {
        return line.matches("^\\s*[-*+]\\s+.*") || line.matches("^\\s*\\d+\\.\\s+.*");
    }

    private boolean isCodeBlock(String line) {
        return line.startsWith("```") || line.startsWith("    ") || line.startsWith("\t");
    }

    private boolean isHorizontalRule(String line) {
        return line.matches("^\\s*(\\*\\s*){3,}$") || line.matches("^\\s*(-\\s*){3,}$") || line.matches("^\\s*(_\\s*){3,}$");
    }

    private boolean hasMarkdownTable(String markdown) {
        if (TextUtils.isEmpty(markdown)) {
            return false;
        }

        try {
            Matcher matcher = TABLE_PATTERN.matcher(markdown);
            return matcher.find();
        } catch (Throwable e) {
            MDLogger.e(TAG,  e);
            return false;
        }
    }

    public static DefinitionListPlugin create() {
        return new DefinitionListPlugin();
    }
} 

================================================
FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/model/EventModel.java
================================================
package com.fluid.afm.markdown.model;

import androidx.annotation.NonNull;

import java.util.Objects;

public class EventModel {
    public String type;
    public String url;
    public String content;
    public boolean visible;

    public EventModel(String type, String url, String content, boolean visible) {
        this.type = type;
        this.url = url;
        this.content = content;
        this.visible = visible;
    }

    @NonNull
    @Override
    public String toString() {
        return "EventModel{" +
                "type='" + type + '\'' +
                ", url='" + url + '\'' +
                ", content='" + content + '\'' +
                ", visible=" + visible +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (!(o instanceof EventModel)) return false;
        EventModel that = (EventModel) o;
        return visible == that.visible && Objects.equals(type, that.type) && Objects.equals(url, that.url) && Objects.equals(content, that.content);
    }

}


================================================
FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/span/LinkClickSpan.java
================================================
package com.fluid.afm.markdown.span;

import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.text.TextPaint;
import android.text.TextUtils;
import android.text.style.LineBackgroundSpan;
import android.text.style.URLSpan;
import android.view.View;

import androidx.annotation.NonNull;

import com.fluid.afm.markdown.ElementClickEventCallback;
import com.fluid.afm.utils.ParseUtil;

import java.util.HashMap;
import java.util.Map;

import io.noties.markwon.RenderProps;
import io.noties.markwon.core.CoreProps;
import io.noties.markwon.core.MarkwonTheme;
import com.fluid.afm.span.IClickableSpan;


public class LinkClickSpan extends URLSpan implements IClickableSpan, LineBackgroundSpan {
    private final MarkwonTheme theme;
    private final String link;
    private final ElementClickEventCallback linkClickCallback;
    private int mTop = -1;
    private int mBottom;
    private final String decoration;
    private final int color;
    private final boolean isBold;



    public LinkClickSpan(String url, RenderProps props, MarkwonTheme theme, ElementClickEventCallback linkClickCallback) {
        super(url);
        this.theme = theme;
        this.link = url;
        this.linkClickCallback = linkClickCallback;
        String colorStr = CoreProps.COLOR.get(props);
        color = ParseUtil.parseColor(colorStr, 0);
        String fontWeight = CoreProps.FONT_WEIGHT.get(props);
        isBold = TextUtils.equals("bold", fontWeight);
        decoration = CoreProps.LINK_TEXT_DECORATION.get(props);

    }

    @Override
    public void onClick(View widget) {
        if (linkClickCallback != null) {
            Map<String, Object> param = new HashMap<>(2);
            param.put(ElementClickEventCallback.PARAM_KEY_LINK, link);
            param.put(ElementClickEventCallback.PARAM_KEY_SOURCE, ElementClickEventCallback.SOURCE_TYPE_LINK);
            if (linkClickCallback.onLinkClicked(param)) {
                return;
            }
        }
        super.onClick(widget);
    }

    @Override
    public void updateDrawState(@NonNull TextPaint ds) {
        ds.bgColor = Color.TRANSPARENT;
        theme.applyLinkStyle(ds, color, isBold, decoration);
    }

    @Override
    public String getUrl() {
        return link;
    }

    @Override
    public String getType() {
        return "link";
    }

    @Override
    public int getTop() {
        return mTop;
    }

    @Override
    public int getBottom() {
        return mBottom;
    }

    @Override
    public void drawBackground(@NonNull Canvas canvas, @NonNull Paint paint, int left, int right, int top, int baseline, int bottom, @NonNull CharSequence text, int start, int end, int lineNumber) {
        if (mTop == -1) {
            mTop = top;
        }
        if (bottom > mBottom) {
            mBottom = bottom;
        }
    }
}


================================================
FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/span/OpacitySpan.java
================================================
package com.fluid.afm.markdown.span;

import android.text.TextPaint;
import android.text.style.CharacterStyle;
import android.text.style.UpdateAppearance;

public class OpacitySpan extends CharacterStyle
        implements UpdateAppearance {

    private final int opacity;

    public OpacitySpan(int opacity) {
        this.opacity = opacity;
    }

    @Override
    public void updateDrawState(TextPaint tp) {
        tp.setAlpha(opacity);
    }
}


================================================
FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/text/AfmTextPlugin.java
================================================
package com.fluid.afm.markdown.text;

import android.content.Context;
import android.graphics.drawable.Drawable;
import android.text.SpannableStringBuilder;
import android.text.Spanned;

import androidx.annotation.NonNull;
import androidx.appcompat.content.res.AppCompatResources;

import com.fluid.afm.R;
import com.fluid.afm.markdown.ElementClickEventCallback;
import com.fluid.afm.markdown.image.CustomImageSpan;
import com.fluid.afm.markdown.image.FootnoteClickSpan;
import com.fluid.afm.markdown.image.FootnoteSpan;
import com.fluid.afm.utils.MDLogger;
import com.fluid.afm.utils.Utils;
import com.vdurmont.emoji.Emoji;
import com.vdurmont.emoji.EmojiManager;

import org.commonmark.ext.gfm.tables.TableCell;
import org.commonmark.node.Text;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import io.noties.markwon.AbstractMarkwonPlugin;
import io.noties.markwon.MarkwonVisitor;

public class AfmTextPlugin extends AbstractMarkwonPlugin {
    private static final String TAG = AfmTextPlugin.class.getSimpleName();
    private final Context context;
    private final int singleLineHeight;
    private ElementClickEventCallback customClickListener;

    public AfmTextPlugin(Context context) {
        this.context = context;
        singleLineHeight = Utils.dpToPx(context, 16);
    }

    public AfmTextPlugin setCustomClickListener(ElementClickEventCallback callback) {
        customClickListener = callback;
        return this;
    }

    public void configureVisitor(@NonNull MarkwonVisitor.Builder builder) {
        builder.on(Text.class, (visitor, textNode) -> {
            String markdown = textNode.getLiteral();
            Pattern EMOJI_PATTERN = Pattern.compile(":(\\w+):");
            Matcher emojiMatch = EMOJI_PATTERN.matcher(markdown);
            StringBuilder sb = new StringBuilder();
            int lastIndex = 0;
            while (emojiMatch.find()) {
                sb.append(markdown, lastIndex, emojiMatch.start());
                String emojiCode = emojiMatch.group(1);
                String emoji = getEmoji(emojiCode);
                sb.append(emoji);
                lastIndex = emojiMatch.end();
            }
            sb.append(markdown, lastIndex, markdown.length());
            String newMarkdown = sb.toString();
            Pattern pattern = Pattern.compile("\\[\\^(.*?)]");
            Matcher matcher = pattern.matcher(newMarkdown);
            SpannableStringBuilder spannable = new SpannableStringBuilder(newMarkdown);

            while (matcher.find()) {
                int start = matcher.start();
                int end = matcher.end();
                String index = matcher.group(1);
                int leftMargin = Utils.dpToPx(context, 4);
                MDLogger.d(TAG, "index = " + index);
                if ("\"".equals(index) || "”".equals(index)) {
                    MDLogger.d(TAG, "get \" or ” ");
                    Drawable drawable = AppCompatResources.getDrawable(context, R.drawable.quotes_pic);
                    if (drawable != null) {
                        drawable.setBounds(leftMargin, 0, singleLineHeight + leftMargin, singleLineHeight);
                    }
                    CustomImageSpan imageSpan = new CustomImageSpan(drawable);
                    spannable.setSpan(imageSpan, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                } else if (textNode.getParent() instanceof TableCell) {
                    FootnoteInTableSpan span = new FootnoteInTableSpan(index);
                    spannable.setSpan(span, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                } else {
                    FootnoteSpan footnoteSpan = new FootnoteSpan(index, visitor.configuration().theme().footnoteStyle());
                    spannable.setSpan(footnoteSpan, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                }
                end =  index == null ? end : Math.min(start + index.length(), end);
                spannable.setSpan(new FootnoteClickSpan(index, customClickListener),
                        start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
            MDLogger.d(TAG, "spannable = " + spannable);
            // Set modified text
            visitor.builder().append(spannable);

        });
    }

    private String getEmoji(String emojiCode) {
        Emoji emoji = EmojiManager.getForAlias(emojiCode);
        if (emoji != null) {
            return emoji.getUnicode();
        }
        return ":" + emojiCode + ":";
    }

    @androidx.annotation.NonNull
    @Override
    public String processMarkdown(@androidx.annotation.NonNull String markdown) {
        return super.processMarkdown(markdown);
    }
}


================================================
FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/text/FootnoteInTableSpan.java
================================================
package com.fluid.afm.markdown.text;

import android.graphics.Canvas;
import android.graphics.Paint;
import android.text.style.ReplacementSpan;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

public class FootnoteInTableSpan extends ReplacementSpan {
    private final String footnote;

    public FootnoteInTableSpan(String index) {
        this.footnote = "[" + index + "]";
    }

    @Override
    public int getSize(@NonNull Paint paint, CharSequence text, int start, int end, @Nullable Paint.FontMetricsInt fm) {
        return (int) (paint.measureText(footnote) + 0.5f);
    }

    @Override
    public void draw(@NonNull Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, @NonNull Paint paint) {
        canvas.drawText(footnote, x, y, paint);
    }
}


================================================
FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/text/RoundedBackgroundSpan.java
================================================
package com.fluid.afm.markdown.text;

import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import android.graphics.Typeface;
import android.text.Spanned;
import android.text.style.ReplacementSpan;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import io.noties.markwon.core.MarkwonTheme;
public class RoundedBackgroundSpan extends ReplacementSpan {

    private final MarkwonTheme theme;
    private float cornerRadius;
    private final int paddingV;
    private final int paddingH;
    private final Typeface typeface;

    public RoundedBackgroundSpan(MarkwonTheme theme, float cornerRadius) {
        this.theme = theme;
        this.cornerRadius = cornerRadius;
        this.cornerRadius = theme.codeStyle().inlineBackgroundRadius();
        this.paddingV = theme.codeStyle().inlinePaddingVertical();
        this.paddingH = theme.codeStyle().inlinePaddingHorizontal();
        typeface = theme.codeStyle().codeTypeface();
    }

    @Override
    public int getSize(@NonNull Paint paint, CharSequence text, int start, int end, @Nullable Paint.FontMetricsInt fm) {
        return (int) (paint.measureText(text, start, end) + paddingH + paddingH);
    }

    @Override
    public void draw(@NonNull Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, @NonNull Paint paint) {
        if (!isSelf(start, end, text, this)) {
            return;
        }
        final int oldColor = paint.getColor();
        final float oldTextSize = paint.getTextSize();
        final Typeface oldTypeface = paint.getTypeface();

        theme.applyInlineCodeBackgroundColor(paint);
        paint.setAntiAlias(true);

        Paint.FontMetrics fm = paint.getFontMetrics();

        float backgroundTop = y + fm.ascent - paddingV;
        float backgroundBottom = y + fm.descent + paddingV;

        RectF rect = new RectF(
                x,
                backgroundTop,
                x + measureTextWidth(paint, text, start, end) + paddingH + paddingH,
                backgroundBottom
        );
        canvas.drawRoundRect(rect, cornerRadius, cornerRadius, paint);

        if (typeface != null) {
            paint.setTypeface(typeface);
        }
        paint.setColor(theme.getInlineCodeTextColor());
        canvas.drawText(text, start, end, x + paddingH, y, paint);

        paint.setColor(oldColor);
        paint.setTextSize(oldTextSize);
        paint.setTypeface(oldTypeface);
    }

    private static boolean isSelf(int start, int end, CharSequence text, Object span) {
        final int spanStart = ((Spanned) text).getSpanStart(span);
        final int spanEnd = ((Spanned) text).getSpanEnd(span);
        return spanStart <= start && spanEnd >= end - 1;
    }

    private float measureTextWidth(Paint paint, CharSequence text, int start, int end) {
        return paint.measureText(text, start, end);
    }
}


================================================
FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/widget/PrinterMarkDownTextView.java
================================================
package com.fluid.afm.markdown.widget;

import android.content.Context;
import android.content.ContextWrapper;
import android.graphics.Color;
import android.graphics.Rect;
import android.os.Build;
import android.os.Handler;
import android.os.Looper;
import android.text.Editable;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.text.style.AbsoluteSizeSpan;
import android.text.style.CharacterStyle;
import android.text.style.ForegroundColorSpan;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewParent;

import androidx.annotation.NonNull;
import androidx.appcompat.widget.AppCompatTextView;
import androidx.lifecycle.DefaultLifecycleObserver;
import androidx.lifecycle.LifecycleOwner;
import androidx.recyclerview.widget.RecyclerView;

import com.fluid.afm.IMarkdownLayer;
import com.fluid.afm.icon.LoadIconUtil;
import com.fluid.afm.markdown.ElementClickEventCallback;
import com.fluid.afm.markdown.MarkdownParser;
import com.fluid.afm.markdown.MarkdownParserFactory;
import com.fluid.afm.markdown.model.EventModel;
import com.fluid.afm.markdown.span.OpacitySpan;
import com.fluid.afm.span.IClickableSpan;
import com.fluid.afm.styles.MarkdownStyles;
import com.fluid.afm.utils.MDLogger;
import com.fluid.afm.utils.Utils;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import io.noties.markwon.image.AsyncDrawableSpan;

public class PrinterMarkDownTextView extends AppCompatTextView implements IMarkdownLayer, DefaultLifecycleObserver, TextWatcher {
    private static final String TAG = "PrinterMarkDownTextView";
    public static final String END_MESSAGE = "(stopped)";
    private static final Handler MAIN_HANDLER = new Handler(Looper.getMainLooper());

    private static final int GRADIANT_COUNT = 10;
    protected MarkdownParser mMarkdownParser;
    private MarkdownStyles mMarkdownStyles;
    private ElementClickEventCallback mElementClickEventCallback;
    protected String mOriginText;
    private int mExposureNodeCount;
    private boolean initialedScrollerWatcher = false;
    private IClickableSpan[] mClickableSpans;
    private List<EventModel> mEventModels = new ArrayList<>();

    private int mInterval = 25;
    private int mChunkSize = 1;
    private SizeChangedListener mSizeChangedListener;
    private PrintingEventListener mPrintingEventListener;
    private boolean isPrinting;
    private boolean isStopByUser;
    private int mCurrentPrintIndex;
    private SpannableStringBuilder mParsedContentText;
    private final Runnable mPrintTask = () -> printing(mCurrentPrintIndex, mChunkSize);
    private String mEndMessage = END_MESSAGE;
    private boolean isDestroyed;
    private OpacitySpan[] mGradiantSpans;
    private int mHeight;
    private int maxWidth = 0;
    private boolean isStarted;
    private MarkDownPrintData mPrintData;

    public PrinterMarkDownTextView(Context context) {
        this(context, null);
    }

    public PrinterMarkDownTextView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public PrinterMarkDownTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
            setFallbackLineSpacing(false);
        }
        if (context instanceof LifecycleOwner) {
            ((LifecycleOwner) context).getLifecycle().addObserver(this);
        } else if (context instanceof ContextWrapper) {
            Context realContext = ((ContextWrapper) context).getBaseContext();
            if (realContext instanceof LifecycleOwner) {
                ((LifecycleOwner) realContext).getLifecycle().addObserver(this);
            }
        }

        setHighlightColor(Color.TRANSPARENT);
        addTextChangedListener(this);
        setOnLongClickListener(v -> true);
    }

    public void init(@NonNull MarkdownStyles styles, ElementClickEventCallback callback) {
        mMarkdownStyles = styles;
        mElementClickEventCallback = callback;
        mMarkdownParser = MarkdownParserFactory.create(getContext(), this, styles, callback);
    }

    public void setPrintParams(int interval, int chunkSize) {
        if (mInterval > 0) {
            mInterval = interval;
        }
        if(chunkSize > 0) {
            mChunkSize = chunkSize;
        }
    }

    public void handleExposureSpm() {
        handleSpm();
    }

    public void setMarkdownText(@NonNull String markdown) {
        if (mMarkdownParser == null) {
            MDLogger.e(TAG, "PrinterMarkDownTextView is not initialized. Please call init() first.");
            return;
        }
        mOriginText = markdown;
        setMinHeight(0);
        mMarkdownParser.getMarkwon().setMarkdown(this, markdown);
    }

    public void startPrinting(String content) {
        startPrinting(content, 0);
    }

    public boolean isStarted() {
        return isStarted;
    }

    public void startPrinting(String content, int startIndex) {
        if (mMarkdownParser == null) {
            MDLogger.e(TAG, "PrinterMarkDownTextView is not initialized. Please call init() first.");
            return;
        }
        if (isStarted) {
            MDLogger.e(TAG, "appendPrinting printing has started!");
            return;
        }
        setMinHeight(0);
        mCurrentPrintIndex = 0;
        isPrinting = true;
        isStopByUser = false;
        mOriginText = content;
        isStarted = true;
        if (startIndex <= 0) {
            startIndex = 0;
        }

        mMarkdownParser.setPrintingState(true);
        mParsedContentText = new SpannableStringBuilder(mMarkdownParser.getMarkwon().toMarkdown(mOriginText));
        printing(startIndex, mChunkSize);
        if (mPrintingEventListener != null) {
            mPrintingEventListener.onPrintStart();
        }
        if (mPrintData != null) {
            mPrintData.isStopByUser = false;
            mPrintData.isPrinting = isPrinting;
            mPrintData.originalText = mOriginText;
            mPrintData.parsedMarkdownText = mParsedContentText;
            mPrintData.interval = mInterval;
            mPrintData.chunkSize = mChunkSize;
        }

    }
    public void appendPrinting(String content) {
        appendPrinting(content, true);
    }

    public void appendPrinting(String content, boolean append) {
        if (!isStarted) {
            MDLogger.e(TAG, "appendPrinting printing has not started!");
            return;
        }
        if (append) {
            mOriginText += content;
        } else {
            mOriginText = content;
        }

        mParsedContentText = new SpannableStringBuilder(mMarkdownParser.getMarkwon().toMarkdown(mOriginText));
        isStopByUser = false;
        isPrinting = true;
        printing(mCurrentPrintIndex, mChunkSize);
        if (mPrintData != null) {
            mPrintData.isPrinting = isPrinting;
            mPrintData.originalText = mOriginText;
            mPrintData.parsedMarkdownText = mParsedContentText;
        }
    }
    public void setPrintData(MarkDownPrintData printData) {
        mPrintData = printData;
    }

    public MarkDownPrintData getPrintData() {
        return mPrintData;
    }

    public void stopPrinting(String endMessage) {
        if (!isStarted) {
            MDLogger.e(TAG, "appendPrinting printing has not started!");
            return;
        }
        isStarted = false;
        if (!isPrinting) {
            return;
        }
        mEndMessage = endMessage;
        isStopByUser = true;
        MAIN_HANDLER.removeCallbacks(mPrintTask);
        isPrinting = false;
        mMarkdownParser.setPrintingState(false);
        if (!TextUtils.isEmpty(endMessage)) {
            mEndMessage = endMessage;
        }
        clearGradient();
        boolean printAll = mCurrentPrintIndex >= mParsedContentText.length() - 1;
        SpannableStringBuilder span = handleSpan(mParsedContentText, mCurrentPrintIndex, printAll ? null : mEndMessage);
        if (!printAll) {
            setEndMessageStyle(span);
        }
        setTextSafely(span);
        if (mPrintingEventListener != null) {
            mPrintingEventListener.onPrintStop(printAll);
        }
        if (mPrintData != null) {
            mPrintData.showingText = span;
            mPrintData.isPrinting = isPrinting;
            mPrintData.isStopByUser = isStopByUser;
        }
    }

    public void restore(MarkDownPrintData markDownData) {
        MDLogger.d(TAG, "restore-markDownData:" + markDownData);
        if (markDownData == null || TextUtils.isEmpty(markDownData.showingText)) {
            return;
        }
        if (mPrintData == markDownData) {
            return;
        }
        mPrintData = markDownData;
        setMinHeight(0);
        mParsedContentText = mPrintData.parsedMarkdownText;
        mCurrentPrintIndex = mPrintData.currentIndex;
        mChunkSize = mPrintData.chunkSize;
        mInterval = mPrintData.interval;
        isPrinting = mPrintData.isPrinting;
        isStopByUser = mPrintData.isStopByUser;
        setTextSafely(mPrintData.showingText);
        mOriginText = mPrintData.originalText;
        if (isPrinting && !isStopByUser) {
            printing(mCurrentPrintIndex, mChunkSize);
        }
        handleSpm();
    }

    public void setSizeChangedListener(SizeChangedListener listener) {
        mSizeChangedListener = listener;
    }

    public void setPrintingEventListener(PrintingEventListener listener) {
        mPrintingEventListener = listener;
    }

    public void pause() {
        if (!isStarted) {
            MDLogger.e(TAG, "appendPrinting printing has not started!");
            return;
        }
        isPrinting = false;
        mMarkdownParser.setPrintingState(false);
        MAIN_HANDLER.removeCallbacks(mPrintTask);
        if (mPrintingEventListener != null) {
            mPrintingEventListener.onPrintPaused(mCurrentPrintIndex);
        }
    }

    public void resume() {
        resume(mCurrentPrintIndex);
    }

    public void resume(int index) {
        if (!isStarted) {
            MDLogger.e(TAG, "appendPrinting printing has not started!");
            return;
        }
        if (isPrinting) {
            return;
        }
        isStopByUser = false;
        isPrinting = true;
        if (index <= mParsedContentText.length()) {
            mMarkdownParser.setPrintingState(true);
            printing(mCurrentPrintIndex, mChunkSize);
        }
        if (mPrintingEventListener != null) {
            mPrintingEventListener.onPrintResumed();
        }
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int newHeight = getMeasuredHeight();
        if (newHeight != mHeight ) {
            if (mSizeChangedListener != null) {
                mSizeChangedListener.onSizeChanged(getMeasuredWidth(), newHeight);
            }
            if(newHeight > mHeight) {
                setMinHeight(newHeight);
            }
            mHeight = newHeight;
        }
    }

    private void printing(int start, int chunkSize) {
        if (isDestroyed) {
            return;
        }
        int end = start + chunkSize;
        if (end >= mParsedContentText.length()) {
            MDLogger.i(TAG, "end >= spannablePrintText.length()");
            isPrinting = false;
            mMarkdownParser.setPrintingState(false);
            setTextSafely(mParsedContentText);
            onStopPrinting();
        } else {
            SpannableStringBuilder newSpannable = handleSpan(mParsedContentText, end);
            if (newSpannable == null) {
                return;
            }
            mCurrentPrintIndex = end;
            gradiantColorAnimateText(mCurrentPrintIndex, newSpannable);
            setTextSafely(newSpannable);
            if (!isStopByUser) {
                MAIN_HANDLER.removeCallbacks(mPrintTask);
                MAIN_HANDLER.postDelayed(mPrintTask, mInterval);
            } else {
                MAIN_HANDLER.removeCallbacks(mPrintTask);
                MDLogger.i(TAG, "printing---isStopByUser==true");
                isPrinting = false;
                onStopPrinting();
            }
        }
        if (mPrintData != null) {
            mPrintData.currentIndex = mCurrentPrintIndex;
        }

    }

    private void clearGradient() {
        if (mGradiantSpans == null) {
            return;
        }
        mParsedContentText.removeSpan(OpacitySpan.class);
    }

    /**
     * 实现渐变打字的动画
     */
    private void gradiantColorAnimateText(int endIndex, SpannableStringBuilder spannableStringBuilder) {
        if (endIndex == mParsedContentText.length()) {
            return;
        }
        if (mGradiantSpans == null) {
            mGradiantSpans = new OpacitySpan[GRADIANT_COUNT];
            for (int i = 0; i < GRADIANT_COUNT; i++) {
                int alpha = (int) (255f * i / GRADIANT_COUNT);
                mGradiantSpans[GRADIANT_COUNT - i - 1] = new OpacitySpan(alpha);
            }
        }

        for (int i = 0; i < GRADIANT_COUNT; i++) {
            int textIndex = endIndex - i - 1;
            if (textIndex < 0) {
                break;
            }
            spannableStringBuilder.setSpan(mGradiantSpans[GRADIANT_COUNT - i - 1], textIndex, textIndex + 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
    }

    private SpannableStringBuilder handleSpan(SpannableStringBuilder source, int end) {
        return handleSpan(source, end, "");
    }

    private SpannableStringBuilder handleSpan(SpannableStringBuilder source, int end, String endTag) {
        SpannableStringBuilder newSpannable;
        if (TextUtils.isEmpty(endTag)) {
            newSpannable = new SpannableStringBuilder(source.subSequence(0, end));
        } else {
            newSpannable = new SpannableStringBuilder(source.subSequence(0, end)).append(endTag);
        }
        CharacterStyle[] spans = source.getSpans(0, end, CharacterStyle.class);
        if (spans == null) {
            return null;
        }
        for (CharacterStyle span : spans) {
            if (span == null) {
                continue;
            }
            int spanStart = source.getSpanStart(span);
            int spanEnd = source.getSpanEnd(span);
            int flags = source.getSpanFlags(span);

            newSpannable.setSpan(span, spanStart, Math.min(spanEnd, end), flags);
        }

        return newSpannable;
    }

    private void onStopPrinting() {
        if (mPrintingEventListener != null) {
            mPrintingEventListener.onPrintStop(mParsedContentText == null || mCurrentPrintIndex == mParsedContentText.length());
        }
    }

    private void setEndMessageStyle(SpannableStringBuilder span) {
        if (TextUtils.isEmpty(mEndMessage)) {
            return;
        }
        // 设置颜色
        span.setSpan(
                new ForegroundColorSpan(Color.parseColor("#999999")),
                span.length() - mEndMessage.length(),
                span.length(),
                Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
        );
        // 设置字体大小
        span.setSpan(
                new AbsoluteSizeSpan(Utils.dpToPx(getContext(), 13), false),
                span.length() - mEndMessage.length(),
                span.length(),
                Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
        );
    }

    public void onDestroy() {
        LoadIconUtil.check();
        isDestroyed = true;
        mPrintData = null;
    }

    @Override
    public void onDestroy(@NonNull LifecycleOwner l) {
        onDestroy();
    }


    public void setMarkdownStyles(MarkdownStyles markdownStyles) {
        if (mMarkdownParser != null) {
            mMarkdownStyles = markdownStyles;
            mMarkdownParser.updateMarkdownStyles(markdownStyles);
        }
    }

    public void setTextSafely(SpannableStringBuilder spanned) {
        if (mMarkdownParser != null) {
            mMarkdownParser.getMarkwon().setParsedMarkdown(this, spanned);
        }
        if (mPrintData != null && spanned != null) {
            mPrintData.showingText = spanned;
        }
    }

    public void setMaxWidthForMeasure(int maxWidth) {
        this.maxWidth = maxWidth;
    }

    @Override
    public int getViewMaxWidth() {
        return maxWidth;
    }

    @Override
    public String getOriginText() {
        return mOriginText;
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        /* no-op */

    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        /* no-op */
    }

    @Override
    public void afterTextChanged(Editable s) {
        if (mElementClickEventCallback == null) {
            return;
        }
        CharSequence str = getText();
        if (!(str instanceof Spannable)) {
            return;
        }
        Spanned spanned = (Spanned) str;
        if (spanned.length() == 0) {
            return;
        }
        IClickableSpan[] clickableSpans = spanned.getSpans(0, spanned.length(), IClickableSpan.class);
        if (clickableSpans == null || clickableSpans.length == mExposureNodeCount) {
            return;
        }
        mClickableSpans = clickableSpans;
        handleScrollerSpm();
        mExposureNodeCount = clickableSpans.length;
        post(() -> handleSpm(clickableSpans));
    }

    private void handleScrollerSpm() {
        if (initialedScrollerWatcher || mClickableSpans == null) {
            return;
        }
        initialedScrollerWatcher = true;
        View scroller = findScroller(getParent());
        if (scroller instanceof RecyclerView) {
            ((RecyclerView)scroller).addOnScrollListener(new RecyclerView.OnScrollListener() {
                @Override
                public void onScrollStateChanged(RecyclerView recyclerView, int state) {
                    super.onScrollStateChanged(recyclerView, state);
                    if (state == RecyclerView.SCROLL_STATE_IDLE) {
                        handleSpm(mClickableSpans);
                    }
                }
            });
        } else if (scroller != null) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                scroller.setOnScrollChangeListener((v, scrollX, scrollY, oldScrollX, oldScrollY) -> handleSpm(mClickableSpans));
            }

        }
    }

    private View findScroller(ViewParent child) {
        ViewParent parent = child.getParent();
        if (parent instanceof View && (parent instanceof RecyclerView || ((View)parent).isScrollContainer())) {
            return (View) parent;
        } else if (parent == null) {
            return null;
        }
        return findScroller(parent);
    }

    private void handleSpm() {
        if (mClickableSpans == null || mClickableSpans.length == 0) {
            return;
        }
        handleSpm(mClickableSpans);
    }
    private void handleSpm(IClickableSpan[] spans) {
        if (spans == null || spans.length == 0) {
            return;
        }
        Rect rect = new Rect();
        boolean isVisible = getGlobalVisibleRect(rect);
        MDLogger.d(TAG, "updateEventLogList:rect:" + rect + " rect isVisible:" + isVisible);

        int startY = 0;
        int endY = 0;
        if (isVisible) {
            int[] pos = new int[2];
            getLocationOnScreen(pos);
            startY = rect.top - pos[1];
            endY = startY + rect.height();
            MDLogger.d(TAG, "updateEventLogList:location:" + Arrays.toString(pos) + ",startY:" + startY + ",endY:" + endY);
        }
        List<EventModel> models = new ArrayList<>();
        for (IClickableSpan span : spans) {
            if (span instanceof AsyncDrawableSpan && !((AsyncDrawableSpan) span).isClickable()) {
                return;
            }
            boolean visible = (span.getTop() > startY && span.getTop() < endY) // visible Top
                    || span.getBottom() > startY && span.getBottom() < endY; // visible Bottom
            MDLogger.d(TAG, "updateEventLogList:" + span.getClass().getSimpleName() + " span.getTop():" + span.getTop() + ", span.getBottom()" + span.getBottom() + ",visible:" + visible);
            models.add(new EventModel(span.getType(), span.getUrl(), span.getLiteral(), visible));
        }
        if (models.equals( mEventModels)) {
            return;
        }
        this.mEventModels = models;
        if (mElementClickEventCallback != null) {
            mElementClickEventCallback.exposureSpmBehavior(models);
        }
    }

    public int getPrintIndex() {
        return mCurrentPrintIndex;
    }

    public interface SizeChangedListener {
        void onSizeChanged(int width, int height);
    }

    public interface PrintingEventListener {
        void onPrintStart();

        void onPrintStop(boolean printAll);
        void onPrintPaused(int index);

        void onPrintResumed();
    }
    public static class MarkDownPrintData {
        public int chunkSize;
        public int interval;
        public boolean isPrinting;
        public boolean isStopByUser;
        public String originalText;
        public SpannableStringBuilder showingText; // showingData
        public SpannableStringBuilder parsedMarkdownText; // fullData
        public int currentIndex;
        public boolean hasBoundView;

        @Override
        public String toString() {
            return "MarkDownPrintData{" +
                    "chunkSize=" + chunkSize +
                    ", speed=" + interval +
                    ", isPrinting=" + isPrinting +
                    ", showingText='" + showingText + '\'' +
                    ", printingText='" + parsedMarkdownText + '\'' +
                    ", currentIndex=" + currentIndex +
                    ", createdView=" + hasBoundView +
                    '}';
        }
    }

}


================================================
FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/ui/MarkDownPreviewActivity.java
================================================
package com.fluid.afm.ui;

import android.annotation.SuppressLint;
import android.content.pm.ActivityInfo;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.text.TextUtils;
import android.view.View;
import android.view.WindowManager;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.fluid.afm.R;
import com.fluid.afm.TableBlockTitleBlockSpan;
import com.fluid.afm.markdown.MarkdownParserFactory;
import com.fluid.afm.markdown.widget.PrinterMarkDownTextView;
import com.fluid.afm.styles.CodeStyle;
import com.fluid.afm.styles.MarkdownStyles;
import com.fluid.afm.styles.TableStyle;
import com.fluid.afm.utils.MDLogger;

import java.util.ArrayList;
import java.util.List;

import io.noties.markwon.Markwon;
import io.noties.markwon.MarkwonPlugin;
import io.noties.markwon.core.MarkwonTheme;
import io.noties.markwon.ext.tables.TablePlugin;

public class MarkDownPreviewActivity extends AppCompatActivity {
    public static final String TAG = "MarkDownPreviewActivity";
    private String markdownContent;
    private RecyclerView recyclerView;
    private MarkdownContentAdapter adapter;
    private Markwon markwon;
    private final Handler mainHandler = new Handler(Looper.getMainLooper());
    private TableStyle tableStyle;
    private CodeStyle codeStyle;
    private int columnCount = 0;
    private boolean isTable = false;

    @SuppressLint("SetTextI18n")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        initLayout();
        initViews();
        if (getIntentParams()) {
            setContent(markdownContent);
        }
    }

    private void initLayout() {
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
        } else {
            getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
        }
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        getWindow().setStatusBarColor(Color.TRANSPARENT);
        WindowManager.LayoutParams attributes = getWindow().getAttributes();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
            attributes.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
            getWindow().setAttributes(attributes);
        }
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        setContentView(R.layout.activity_magnify_table);
    }

    private void initViews() {
        View back = findViewById(R.id.back);
        recyclerView = findViewById(R.id.recyclerView);

        // 设置RecyclerView
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setHasFixedSize(true);
        recyclerView.setItemViewCacheSize(1);
        recyclerView.setNestedScrollingEnabled(false); // 禁用嵌套滚动,避免冲突

        back.setOnClickListener(v -> onBackPressed());
    }

    private boolean getIntentParams() {
        Bundle launchParam = getIntent().getExtras();
        if (launchParam == null) {
            MDLogger.e(TAG, "Launch params is null");
            return false;
        }
        markdownContent = launchParam.getString("content", "");
        tableStyle = launchParam.getParcelable("tableStyle");
        codeStyle = launchParam.getParcelable("codeStyle");
        columnCount = launchParam.getInt("columnCount", 0);
        isTable = launchParam.getBoolean("isTable", false);
        if (TextUtils.isEmpty(markdownContent) && (!isTable || TableBlockTitleBlockSpan.getCurrentTableBlock() == null)) {
            MDLogger.e(TAG, "Both table_content and code_content are empty");
            return false;
        }

        MDLogger.d(TAG, "markdownContent = " + markdownContent +" TableBlockTitleBlockSpan.getCurrentTableBlock()=" + TableBlockTitleBlockSpan.getCurrentTableBlock());
        return true;
    }

    private void setContent(String content) {
        try {
            PrinterMarkDownTextView textView = null;
            if (markwon == null) {
                textView = new PrinterMarkDownTextView(this);
                MarkdownStyles style = MarkdownStyles.getDefaultStyles();
                if (tableStyle == null) {
                    tableStyle = style.tableStyle();
                } else {
                    style.tableStyle(tableStyle);
                }
                if (codeStyle != null) {
                    codeStyle.drawBorder(false);
                    style.codeStyle(codeStyle);
                }
                TablePlugin tablePlugin = TablePlugin.create(this, true);
                List<MarkwonPlugin> plugins = new ArrayList<>(MarkdownParserFactory.getPlugins(this, textView, tablePlugin));
                MarkwonTheme theme = MarkwonTheme.builderWithDefaults(this).setStyles(style).build(plugins);
                markwon = Markwon.builderWithPlugs(this, plugins).setMarkdownTheme(theme).build();
            }

            if (adapter == null) {
                adapter = new MarkdownContentAdapter(markwon, isTable, columnCount, textView);
                recyclerView.setAdapter(adapter);
            }
            if (TableBlockTitleBlockSpan.getCurrentTableBlock() != null) {
                adapter.setTableBlockNode(TableBlockTitleBlockSpan.getCurrentTableBlock());
            } else {
                adapter.setContent(content);
            }
        } catch (Throwable tr) {
            MDLogger.e(TAG, "Error initializing markwon: " + tr.getMessage(), tr);
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        markwon = null;
        adapter = null;
        recyclerView.setAdapter(null);
        mainHandler.removeCallbacksAndMessages(null);
        TableBlockTitleBlockSpan.setCurrentTableBlock(null);
    }
}




================================================
FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/ui/MarkdownContentAdapter.java
================================================
package com.fluid.afm.ui;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.fluid.afm.R;

import org.commonmark.ext.gfm.tables.TableBlock;

import io.noties.markwon.Markwon;

public class MarkdownContentAdapter extends RecyclerView.Adapter<MarkdownContentAdapter.ViewHolder> {
    private final MarkdownTextAdapter textAdapter;


    public MarkdownContentAdapter(Markwon markwon, boolean isTable, int columnCount, TextView textView) {
        this.textAdapter = new MarkdownTextAdapter(markwon, isTable, columnCount, textView);
    }

    public void setContent(String content) {
        textAdapter.setContent(content);
        notifyDataSetChanged();
    }
    public void setTableBlockNode(TableBlock block) {
        textAdapter.setTableBlockNode( block);
        notifyDataSetChanged();
    }


    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.item_markdown_content, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.horizontalRecyclerView.setLayoutManager(new LinearLayoutManager(holder.itemView.getContext(), LinearLayoutManager.HORIZONTAL, false));
        holder.horizontalRecyclerView.setHasFixedSize(true);
        holder.horizontalRecyclerView.setItemViewCacheSize(1);
        holder.horizontalRecyclerView.setAdapter(textAdapter);
    }

    @Override
    public int getItemCount() {
        return 1;
    }

    static class ViewHolder extends RecyclerView.ViewHolder {
        final RecyclerView horizontalRecyclerView;

        ViewHolder(View itemView) {
            super(itemView);
            horizontalRecyclerView = itemView.findViewById(R.id.horizontalRecyclerView);
        }
    }
} 

================================================
FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/ui/MarkdownTextAdapter.java
================================================
package com.fluid.afm.ui;

import android.text.Spanned;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.recyclerview.widget.RecyclerView;

import com.fluid.afm.R;
import com.fluid.afm.markdown.widget.PrinterMarkDownTextView;

import org.commonmark.ext.gfm.tables.TableBlock;

import io.noties.markwon.Markwon;
import com.fluid.afm.utils.Utils;

public class MarkdownTextAdapter extends RecyclerView.Adapter<MarkdownTextAdapter.ViewHolder> {
    private String content;
    private final Markwon markwon;
    private final boolean isTable;
    private final int columnCount;
    private int tableWidth;
    private final TextView mTextView;
    private Spanned spanned;

    public MarkdownTextAdapter(Markwon markwon, boolean isTable, int columnCount, TextView textView) {
        this.markwon = markwon;
        this.isTable = isTable;
        this.columnCount = columnCount;
        mTextView = textView;
        if (mTextView != null) {
            mTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14);
            int padding = Utils.dpToPx(16);
            mTextView.setPadding(padding, padding, padding, padding);
        }
    }

    public void setContent(String content) {
        this.content = content;
        notifyDataSetChanged();
    }

    public void setTableBlockNode(TableBlock block) {
        spanned = markwon.render(block);
        notifyDataSetChanged();
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View view = mTextView == null ? LayoutInflater.from(parent.getContext())
                .inflate(R.layout.item_markdown_text, parent, false) : mTextView;

        ViewHolder viewHolder = new ViewHolder(view);
        if (isTable) {
            if (tableWidth == 0) {
                if (columnCount >= 6) {
                    int screenW = parent.getContext().getResources().getDisplayMetrics().widthPixels;
                    tableWidth = (int) (screenW / 5.5f) * columnCount;
                } else {
                    tableWidth = ViewGroup.LayoutParams.MATCH_PARENT;
                }
            }
            ViewGroup.LayoutParams params = viewHolder.textView.getLayoutParams();
            if (params == null) {
                params = new ViewGroup.LayoutParams(tableWidth, ViewGroup.LayoutParams.WRAP_CONTENT);
            }
            params.width = tableWidth;
            viewHolder.textView.setMaxWidthForMeasure(tableWidth > 0 ? tableWidth : parent.getMeasuredWidth());
            viewHolder.textView.setLayoutParams(params);
        }
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        if (spanned != null) {
            markwon.setParsedMarkdown(holder.textView, spanned);
        } else if (content != null) {
            markwon.setMarkdown(holder.textView, content);
        }
    }

    @Override
    public int getItemCount() {
        return 1;
    }

    static class ViewHolder extends RecyclerView.ViewHolder {
        final PrinterMarkDownTextView textView;

        ViewHolder(View itemView) {
            super(itemView);
            if (itemView instanceof TextView) {
                textView = (PrinterMarkDownTextView) itemView;
            } else {
                textView = itemView.findViewById(R.id.mk_textView);
            }
        }
    }
} 

================================================
FILE: Android/AntFluid/fluid-markdown/src/main/res/drawable/back.xml
================================================
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:autoMirrored="true" android:height="24dp" android:tint="#000000" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp">
      
    <path android:fillColor="@android:color/white" android:pathData="M20,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z"/>
    
</vector>


================================================
FILE: Android/AntFluid/fluid-markdown/src/main/res/drawable/bg_shape_ffffffff_12.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <corners android:radius="12dp" />
    <solid android:color="#FFFFFF" />
</shape>

================================================
FILE: Android/AntFluid/fluid-markdown/src/main/res/drawable/default_placeholderdefault.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <size
        android:width="638px"
        android:height="360px" />
    <solid android:color="#ccc" />
    <corners android:radius="6dp" />
</shape>

================================================
FILE: Android/AntFluid/fluid-markdown/src/main/res/drawable/ic_triangle.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="100dp"
    android:height="50dp"
    android:viewportWidth="24"
    android:viewportHeight="24">
    <path
        android:fillColor="#FFFFFF"
        android:pathData="M12,0 L0,24 L24,24 Z" />
</vector>

================================================
FILE: Android/AntFluid/fluid-markdown/src/main/res/layout/activity_magnify_table.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/rl_root"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    android:background="@color/white"
    android:orientation="vertical"
    tools:ignore="ResAuto">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <ImageView
            android:id="@+id/back"
            android:layout_width="24dp"
            android:layout_height="24dp"
            android:layout_marginLeft="16dp"
            android:layout_marginTop="12dp"
            android:layout_marginBottom="12dp"
            android:contentDescription="@string/back"
            android:src="@drawable/back"/>
    </LinearLayout>

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:scrollbars="vertical"
        android:overScrollMode="never"
        android:fadeScrollbars="true"
        android:hardwareAccelerated="true" />

</LinearLayout>

================================================
FILE: Android/AntFluid/fluid-markdown/src/main/res/layout/item_markdown_content.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<androidx.recyclerview.widget.RecyclerView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/horizontalRecyclerView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:scrollbars="horizontal"
    android:overScrollMode="never"
    android:fadeScrollbars="true"
    android:hardwareAccelerated="true" /> 

================================================
FILE: Android/AntFluid/fluid-markdown/src/main/res/layout/item_markdown_text.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<com.fluid.afm.markdown.widget.MarkdownTextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/mk_textView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:padding="16dp"
    android:textSize="14sp"
    android:hardwareAccelerated="true" />

================================================
FILE: Android/AntFluid/fluid-markdown/src/main/res/values/colors.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="white">#FFFFFF</color>
</resources>

================================================
FILE: Android/AntFluid/fluid-markdown/src/main/res/values/dimes.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="chat_bubble_paddingH">16dp</dimen>
</resources>

================================================
FILE: Android/AntFluid/fluid-markdown/src/main/res/values/ids.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item type="id" name="markdown_need_animation"/>
</resources>

================================================
FILE: Android/AntFluid/fluid-markdown/src/main/res/values/strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="back">返回</string>
</resources>

================================================
FILE: Android/AntFluid/fluid-markdown/src/main/res/values/themes.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>

    <style name="Theme.Preview" parent="Theme.AppCompat.Light.NoActionBar">
    </style>

</resources>

================================================
FILE: Android/AntFluid/fluid-markdown/src/test/java/com/fluid/afm/ExampleUnitTest.java
================================================
package com.fluid.afm;

import static org.junit.Assert.assertEquals;

import org.junit.Test;

/**
 * Example local unit test, which will execute on the development machine (host).
 *
 * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
 */
public class ExampleUnitTest {
    @Test
    public void addition_isCorrect() {
        assertEquals(4, 2 + 2);
    }
}

================================================
FILE: Android/AntFluid/gradle/libs.versions.toml
================================================
[versions]
agp = "8.9.1"
kotlin = "2.0.21"
coreKtx = "1.16.0"
junit = "4.13.2"
junitVersion = "1.2.1"
espressoCore = "3.6.1"
lifecycleRuntimeKtx = "2.9.1"
activityCompose = "1.10.1"
composeBom = "2024.09.00"
appcompat = "1.6.1"
material = "1.10.0"
recyclerview = "1.4.0"
activity = "1.10.1"
constraintlayout = "2.2.1"

[libraries]
androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
junit = { group = "junit", name = "junit", version.ref = "junit" }
androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" }
androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" }
androidx-lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "lifecycleRuntimeKtx" }
androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activityCompose" }
androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "composeBom" }
androidx-ui = { group = "androidx.compose.ui", name = "ui" }
androidx-ui-graphics = { group = "androidx.compose.ui", name = "ui-graphics" }
androidx-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" }
androidx-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" }
androidx-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" }
androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" }
androidx-material3 = { group = "androidx.compose.material3", name = "material3" }
androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" }
material = { group = "com.google.android.material", name = "mater
Download .txt
gitextract_1cwcjqz8/

├── .gitignore
├── Android/
│   └── AntFluid/
│       ├── .gitignore
│       ├── app-sample/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── com/
│       │       │           └── fluid/
│       │       │               └── markdown/
│       │       │                   └── ExampleInstrumentedTest.kt
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   ├── java/
│       │       │   │   └── com/
│       │       │   │       └── fluid/
│       │       │   │           └── markdown/
│       │       │   │               ├── MainActivity.kt
│       │       │   │               ├── MyImageHandler.java
│       │       │   │               └── demos/
│       │       │   │                   ├── ListActivity.java
│       │       │   │                   ├── MarkdownData.java
│       │       │   │                   ├── MarkdownHolder.java
│       │       │   │                   ├── MarkwonListAdapter.java
│       │       │   │                   └── PrinterActivity.java
│       │       │   └── res/
│       │       │       ├── drawable/
│       │       │       │   ├── baseline_arrow_back_24.xml
│       │       │       │   ├── circle.xml
│       │       │       │   ├── editor_bg.xml
│       │       │       │   ├── ic_launcher_background.xml
│       │       │       │   └── item_bg.xml
│       │       │       ├── drawable-v24/
│       │       │       │   └── ic_launcher_foreground.xml
│       │       │       ├── layout/
│       │       │       │   ├── activity_list.xml
│       │       │       │   ├── activity_printer.xml
│       │       │       │   ├── layout_main.xml
│       │       │       │   └── list_item.xml
│       │       │       ├── mipmap-anydpi-v26/
│       │       │       │   ├── ic_launcher.xml
│       │       │       │   └── ic_launcher_round.xml
│       │       │       ├── values/
│       │       │       │   ├── colors.xml
│       │       │       │   ├── strings.xml
│       │       │       │   └── themes.xml
│       │       │       ├── values-v35/
│       │       │       │   └── themes.xml
│       │       │       ├── values-zh/
│       │       │       │   └── strings.xml
│       │       │       └── xml/
│       │       │           ├── backup_rules.xml
│       │       │           └── data_extraction_rules.xml
│       │       └── test/
│       │           └── java/
│       │               └── com/
│       │                   └── fluid/
│       │                       └── markdown/
│       │                           └── ExampleUnitTest.kt
│       ├── build.gradle
│       ├── fluid-markdown/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── consumer-rules.pro
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── com/
│       │       │           └── fluid/
│       │       │               └── afm/
│       │       │                   └── ExampleInstrumentedTest.java
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   ├── java/
│       │       │   │   └── com/
│       │       │   │       └── fluid/
│       │       │   │           └── afm/
│       │       │   │               ├── AFMInitializer.java
│       │       │   │               ├── markdown/
│       │       │   │               │   ├── ElementClickEventCallback.java
│       │       │   │               │   ├── MarkdownParser.java
│       │       │   │               │   ├── MarkdownParserFactory.java
│       │       │   │               │   ├── code/
│       │       │   │               │   │   └── CodeBlockPlugin.java
│       │       │   │               │   ├── html/
│       │       │   │               │   │   ├── CustomHtmlPlugin.java
│       │       │   │               │   │   ├── CustomIndentSpan.java
│       │       │   │               │   │   ├── CustomUnderlineSpan.java
│       │       │   │               │   │   ├── HtmlMarkTagHandler.java
│       │       │   │               │   │   ├── HtmlParaTagHandler.java
│       │       │   │               │   │   ├── HtmlSpanTagHandler.java
│       │       │   │               │   │   ├── SpanTextClickableSpan.java
│       │       │   │               │   │   └── TextHeightBackgroundSpan.java
│       │       │   │               │   ├── icon/
│       │       │   │               │   │   ├── IconSpan.java
│       │       │   │               │   │   └── IconSpanHandler.java
│       │       │   │               │   ├── iconlink/
│       │       │   │               │   │   ├── IconLinkSpan.java
│       │       │   │               │   │   └── IconLinkSpanHandler.java
│       │       │   │               │   ├── image/
│       │       │   │               │   │   ├── CustomImageSpan.java
│       │       │   │               │   │   ├── FootnoteClickSpan.java
│       │       │   │               │   │   ├── FootnoteSpan.java
│       │       │   │               │   │   └── SuperscriptImageSpan.java
│       │       │   │               │   ├── list/
│       │       │   │               │   │   └── DefinitionListPlugin.java
│       │       │   │               │   ├── model/
│       │       │   │               │   │   └── EventModel.java
│       │       │   │               │   ├── span/
│       │       │   │               │   │   ├── LinkClickSpan.java
│       │       │   │               │   │   └── OpacitySpan.java
│       │       │   │               │   ├── text/
│       │       │   │               │   │   ├── AfmTextPlugin.java
│       │       │   │               │   │   ├── FootnoteInTableSpan.java
│       │       │   │               │   │   └── RoundedBackgroundSpan.java
│       │       │   │               │   └── widget/
│       │       │   │               │       └── PrinterMarkDownTextView.java
│       │       │   │               └── ui/
│       │       │   │                   ├── MarkDownPreviewActivity.java
│       │       │   │                   ├── MarkdownContentAdapter.java
│       │       │   │                   └── MarkdownTextAdapter.java
│       │       │   └── res/
│       │       │       ├── drawable/
│       │       │       │   ├── back.xml
│       │       │       │   ├── bg_shape_ffffffff_12.xml
│       │       │       │   ├── default_placeholderdefault.xml
│       │       │       │   └── ic_triangle.xml
│       │       │       ├── layout/
│       │       │       │   ├── activity_magnify_table.xml
│       │       │       │   ├── item_markdown_content.xml
│       │       │       │   └── item_markdown_text.xml
│       │       │       └── values/
│       │       │           ├── colors.xml
│       │       │           ├── dimes.xml
│       │       │           ├── ids.xml
│       │       │           ├── strings.xml
│       │       │           └── themes.xml
│       │       └── test/
│       │           └── java/
│       │               └── com/
│       │                   └── fluid/
│       │                       └── afm/
│       │                           └── ExampleUnitTest.java
│       ├── gradle/
│       │   ├── libs.versions.toml
│       │   └── wrapper/
│       │       ├── gradle-wrapper.jar
│       │       └── gradle-wrapper.properties
│       ├── gradle.properties
│       ├── gradlew
│       ├── gradlew.bat
│       ├── markwon-core/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── io/
│       │       │           └── noties/
│       │       │               └── markwon/
│       │       │                   └── ExampleInstrumentedTest.kt
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   ├── java/
│       │       │   │   ├── com/
│       │       │   │   │   └── fluid/
│       │       │   │   │       └── afm/
│       │       │   │   │           ├── ContextHolder.java
│       │       │   │   │           ├── StreamOutStateObserver.java
│       │       │   │   │           ├── func/
│       │       │   │   │           │   ├── Callback.java
│       │       │   │   │           │   └── IImageClickCallback.java
│       │       │   │   │           ├── handler/
│       │       │   │   │           │   ├── BackgroundTaskHandler.java
│       │       │   │   │           │   ├── DefaultLogHandler.java
│       │       │   │   │           │   ├── DefaultTaskHandler.java
│       │       │   │   │           │   ├── DefualtImageHandler.java
│       │       │   │   │           │   ├── EventHandlerManager.java
│       │       │   │   │           │   ├── ImageHandler.java
│       │       │   │   │           │   └── LogHandler.java
│       │       │   │   │           ├── icon/
│       │       │   │   │           │   ├── DrawableWrapper.java
│       │       │   │   │           │   ├── LoadIconUtil.java
│       │       │   │   │           │   └── LoadImageCallback.java
│       │       │   │   │           ├── span/
│       │       │   │   │           │   ├── AntUnderlineSupportMulLinesSpan.java
│       │       │   │   │           │   ├── BaseIconTextSpan.java
│       │       │   │   │           │   ├── CodeLanguageSpan.java
│       │       │   │   │           │   ├── HeadingTopOrBottomSpacingSpan.java
│       │       │   │   │           │   ├── IClickableSpan.java
│       │       │   │   │           │   ├── LinkWithIconSpan.java
│       │       │   │   │           │   └── ParagraphSpacingSpan.java
│       │       │   │   │           ├── styles/
│       │       │   │   │           │   ├── BlockQuoteStyle.java
│       │       │   │   │           │   ├── BulletStyle.java
│       │       │   │   │           │   ├── CodeStyle.java
│       │       │   │   │           │   ├── FootnoteStyle.java
│       │       │   │   │           │   ├── HorizonRuleStyle.java
│       │       │   │   │           │   ├── LinkStyle.java
│       │       │   │   │           │   ├── MarkdownStyles.java
│       │       │   │   │           │   ├── OrderStyle.java
│       │       │   │   │           │   ├── ParagraphStyle.java
│       │       │   │   │           │   ├── Shape.java
│       │       │   │   │           │   ├── TableStyle.java
│       │       │   │   │           │   ├── TitleStyle.java
│       │       │   │   │           │   └── UnderlineStyle.java
│       │       │   │   │           └── utils/
│       │       │   │   │               ├── MDLogger.java
│       │       │   │   │               ├── ParseUtil.java
│       │       │   │   │               └── Utils.java
│       │       │   │   └── io/
│       │       │   │       └── noties/
│       │       │   │           └── markwon/
│       │       │   │               ├── AbstractMarkwonPlugin.java
│       │       │   │               ├── BlockHandlerDef.java
│       │       │   │               ├── LinkResolver.java
│       │       │   │               ├── LinkResolverDef.java
│       │       │   │               ├── Markwon.java
│       │       │   │               ├── MarkwonBuilderImpl.java
│       │       │   │               ├── MarkwonConfiguration.java
│       │       │   │               ├── MarkwonImpl.java
│       │       │   │               ├── MarkwonPlugin.java
│       │       │   │               ├── MarkwonReducer.java
│       │       │   │               ├── MarkwonSpansFactory.java
│       │       │   │               ├── MarkwonSpansFactoryImpl.java
│       │       │   │               ├── MarkwonVisitor.java
│       │       │   │               ├── MarkwonVisitorFactory.java
│       │       │   │               ├── MarkwonVisitorImpl.java
│       │       │   │               ├── PrecomputedFutureTextSetterCompat.java
│       │       │   │               ├── PrecomputedTextSetterCompat.java
│       │       │   │               ├── Prop.java
│       │       │   │               ├── RegistryImpl.java
│       │       │   │               ├── RenderProps.java
│       │       │   │               ├── RenderPropsImpl.java
│       │       │   │               ├── SoftBreakAddsNewLinePlugin.java
│       │       │   │               ├── SpanFactory.java
│       │       │   │               ├── SpannableBuilder.java
│       │       │   │               ├── core/
│       │       │   │               │   ├── CorePlugin.java
│       │       │   │               │   ├── CoreProps.java
│       │       │   │               │   ├── MarkwonTheme.java
│       │       │   │               │   ├── SimpleBlockNodeVisitor.java
│       │       │   │               │   ├── factory/
│       │       │   │               │   │   ├── BlockQuoteSpanFactory.java
│       │       │   │               │   │   ├── CodeBlockSpanFactory.java
│       │       │   │               │   │   ├── CodeSpanFactory.java
│       │       │   │               │   │   ├── EmphasisSpanFactory.java
│       │       │   │               │   │   ├── HeadingSpanFactory.java
│       │       │   │               │   │   ├── LinkSpanFactory.java
│       │       │   │               │   │   ├── ListItemSpanFactory.java
│       │       │   │               │   │   ├── StrongEmphasisSpanFactory.java
│       │       │   │               │   │   └── ThematicBreakSpanFactory.java
│       │       │   │               │   └── spans/
│       │       │   │               │       ├── BlockQuoteSpan.java
│       │       │   │               │       ├── BulletListItemSpan.java
│       │       │   │               │       ├── CodeBlockSpan.java
│       │       │   │               │       ├── CodeSpan.java
│       │       │   │               │       ├── CustomTypefaceSpan.java
│       │       │   │               │       ├── EmphasisSpan.java
│       │       │   │               │       ├── HeadingSpan.java
│       │       │   │               │       ├── LastLineSpacingSpan.java
│       │       │   │               │       ├── LinkSpan.java
│       │       │   │               │       ├── ObjectsPool.java
│       │       │   │               │       ├── OrderedListItemSpan.java
│       │       │   │               │       ├── StrongEmphasisSpan.java
│       │       │   │               │       ├── TextLayoutSpan.java
│       │       │   │               │       ├── TextViewSpan.java
│       │       │   │               │       └── ThematicBreakSpan.java
│       │       │   │               ├── image/
│       │       │   │               │   ├── AsyncDrawable.java
│       │       │   │               │   ├── AsyncDrawableLoader.java
│       │       │   │               │   ├── AsyncDrawableLoaderNoOp.java
│       │       │   │               │   ├── AsyncDrawableScheduler.java
│       │       │   │               │   ├── AsyncDrawableSpan.java
│       │       │   │               │   ├── DrawableUtils.java
│       │       │   │               │   ├── ImageProps.java
│       │       │   │               │   ├── ImageSize.java
│       │       │   │               │   ├── ImageSizeResolver.java
│       │       │   │               │   ├── ImageSizeResolverDef.java
│       │       │   │               │   ├── ImageSpanFactory.java
│       │       │   │               │   └── destination/
│       │       │   │               │       ├── ImageDestinationProcessor.java
│       │       │   │               │       ├── ImageDestinationProcessorAssets.java
│       │       │   │               │       └── ImageDestinationProcessorRelativeToAbsolute.java
│       │       │   │               ├── movement/
│       │       │   │               │   └── MovementMethodPlugin.java
│       │       │   │               ├── node/
│       │       │   │               │   └── OiintNode.java
│       │       │   │               ├── syntax/
│       │       │   │               │   ├── SyntaxHighlight.java
│       │       │   │               │   └── SyntaxHighlightNoOp.java
│       │       │   │               └── utils/
│       │       │   │                   ├── ColorUtils.java
│       │       │   │                   ├── Dip.java
│       │       │   │                   ├── DrawableUtils.java
│       │       │   │                   ├── DumpNodes.java
│       │       │   │                   ├── LayoutUtils.java
│       │       │   │                   ├── LeadingMarginUtils.java
│       │       │   │                   ├── NoCopySpannableFactory.java
│       │       │   │                   ├── ParserUtils.java
│       │       │   │                   └── SpanUtils.java
│       │       │   └── res/
│       │       │       └── values/
│       │       │           └── ids.xml
│       │       └── test/
│       │           └── java/
│       │               └── io/
│       │                   └── noties/
│       │                       └── markwon/
│       │                           └── ExampleUnitTest.kt
│       ├── markwon-ext-latex/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── consumer-rules.pro
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── io/
│       │       │           └── noties/
│       │       │               └── markwon/
│       │       │                   └── ext/
│       │       │                       └── latex/
│       │       │                           └── ExampleInstrumentedTest.java
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   └── java/
│       │       │       └── io/
│       │       │           └── noties/
│       │       │               └── markwon/
│       │       │                   └── ext/
│       │       │                       └── latex/
│       │       │                           ├── JLatexAsyncDrawableSpan.java
│       │       │                           ├── JLatexBlockImageSizeResolver.java
│       │       │                           ├── JLatexInlineAsyncDrawableSpan.java
│       │       │                           ├── JLatexMathBlock.java
│       │       │                           ├── JLatexMathBlockParser.java
│       │       │                           ├── JLatexMathBlockParserLegacy.java
│       │       │                           ├── JLatexMathInlineProcessor.java
│       │       │                           ├── JLatexMathNode.java
│       │       │                           ├── JLatexMathPlugin.java
│       │       │                           ├── JLatexMathTheme.java
│       │       │                           └── JLatextAsyncDrawable.java
│       │       └── test/
│       │           └── java/
│       │               └── io/
│       │                   └── noties/
│       │                       └── markwon/
│       │                           └── ext/
│       │                               └── latex/
│       │                                   └── ExampleUnitTest.java
│       ├── markwon-ext-strikethrough/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── consumer-rules.pro
│       │   ├── libs/
│       │   │   └── commonmark-ext-gfm-strikethrough-0.13.0.jar
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── io/
│       │       │           └── noties/
│       │       │               └── markwon/
│       │       │                   └── ext/
│       │       │                       └── strikethrough/
│       │       │                           └── ExampleInstrumentedTest.java
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   └── java/
│       │       │       └── io/
│       │       │           └── noties/
│       │       │               └── markwon/
│       │       │                   └── ext/
│       │       │                       └── strikethrough/
│       │       │                           └── StrikethroughPlugin.java
│       │       └── test/
│       │           └── java/
│       │               └── io/
│       │                   └── noties/
│       │                       └── markwon/
│       │                           └── ext/
│       │                               └── strikethrough/
│       │                                   └── ExampleUnitTest.java
│       ├── markwon-ext-tables/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── consumer-rules.pro
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── io/
│       │       │           └── noties/
│       │       │               └── markwon/
│       │       │                   └── ext/
│       │       │                       └── tables/
│       │       │                           └── ExampleInstrumentedTest.java
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   ├── java/
│       │       │   │   ├── com/
│       │       │   │   │   └── fluid/
│       │       │   │   │       └── afm/
│       │       │   │   │           ├── BaseBlockTitleSpan.java
│       │       │   │   │           ├── CodeBlockLineSpacingSpan.java
│       │       │   │   │           ├── CodeBlockTitleSpan.java
│       │       │   │   │           ├── IMarkdownLayer.java
│       │       │   │   │           ├── MarkdownAwareMovementMethod.java
│       │       │   │   │           ├── TableBlockTitleBlockSpan.java
│       │       │   │   │           ├── TableLineSpacingSpan.java
│       │       │   │   │           └── TopSpacingSpan.java
│       │       │   │   └── io/
│       │       │   │       └── noties/
│       │       │   │           └── markwon/
│       │       │   │               └── ext/
│       │       │   │                   └── tables/
│       │       │   │                       ├── Table.java
│       │       │   │                       ├── TablePlugin.java
│       │       │   │                       ├── TableRowSpan.java
│       │       │   │                       ├── TableRowsScheduler.java
│       │       │   │                       └── TableSpan.java
│       │       │   └── res/
│       │       │       ├── values/
│       │       │       │   ├── ids.xml
│       │       │       │   └── strings.xml
│       │       │       └── values-zh/
│       │       │           └── strings.xml
│       │       └── test/
│       │           └── java/
│       │               └── io/
│       │                   └── noties/
│       │                       └── markwon/
│       │                           └── ext/
│       │                               └── tables/
│       │                                   └── ExampleUnitTest.java
│       ├── markwon-ext-tasklist/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── consumer-rules.pro
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── io/
│       │       │           └── noties/
│       │       │               └── markwon/
│       │       │                   └── ext/
│       │       │                       └── tasklist/
│       │       │                           └── ExampleInstrumentedTest.java
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   └── java/
│       │       │       └── io/
│       │       │           └── noties/
│       │       │               └── markwon/
│       │       │                   └── ext/
│       │       │                       └── tasklist/
│       │       │                           ├── TaskListDrawable.java
│       │       │                           ├── TaskListItem.java
│       │       │                           ├── TaskListPlugin.java
│       │       │                           ├── TaskListPostProcessor.java
│       │       │                           ├── TaskListProps.java
│       │       │                           ├── TaskListSpan.java
│       │       │                           └── TaskListSpanFactory.java
│       │       └── test/
│       │           └── java/
│       │               └── io/
│       │                   └── noties/
│       │                       └── markwon/
│       │                           └── ext/
│       │                               └── tasklist/
│       │                                   └── ExampleUnitTest.java
│       ├── markwon-html/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── consumer-rules.pro
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── io/
│       │       │           └── noties/
│       │       │               └── markwon/
│       │       │                   └── html/
│       │       │                       └── ExampleInstrumentedTest.java
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   └── java/
│       │       │       ├── com/
│       │       │       │   └── fluid/
│       │       │       │       └── afm/
│       │       │       │           ├── spans/
│       │       │       │           │   └── DefinitionListSpan.java
│       │       │       │           └── tag/
│       │       │       │               └── DefinitionListTagHandler.java
│       │       │       └── io/
│       │       │           └── noties/
│       │       │               └── markwon/
│       │       │                   └── html/
│       │       │                       ├── AppendableUtils.java
│       │       │                       ├── CssInlineStyleParser.java
│       │       │                       ├── CssProperty.java
│       │       │                       ├── HtmlEmptyTagReplacement.java
│       │       │                       ├── HtmlPlugin.java
│       │       │                       ├── HtmlTag.java
│       │       │                       ├── HtmlTagImpl.java
│       │       │                       ├── MarkwonHtmlParser.java
│       │       │                       ├── MarkwonHtmlParserImpl.java
│       │       │                       ├── MarkwonHtmlRenderer.java
│       │       │                       ├── MarkwonHtmlRendererImpl.java
│       │       │                       ├── MarkwonHtmlRendererNoOp.java
│       │       │                       ├── TagHandler.java
│       │       │                       ├── TagHandlerNoOp.java
│       │       │                       ├── TrimmingAppender.java
│       │       │                       ├── jsoup/
│       │       │                       │   ├── UncheckedIOException.java
│       │       │                       │   ├── helper/
│       │       │                       │   │   ├── Normalizer.java
│       │       │                       │   │   └── Validate.java
│       │       │                       │   ├── nodes/
│       │       │                       │   │   ├── Attribute.java
│       │       │                       │   │   ├── Attributes.java
│       │       │                       │   │   ├── CommonMarkEntities.java
│       │       │                       │   │   └── DocumentType.java
│       │       │                       │   └── parser/
│       │       │                       │       ├── CharacterReader.java
│       │       │                       │       ├── ParseError.java
│       │       │                       │       ├── ParseErrorList.java
│       │       │                       │       ├── Token.java
│       │       │                       │       ├── Tokeniser.java
│       │       │                       │       └── TokeniserState.java
│       │       │                       ├── span/
│       │       │                       │   ├── SubScriptSpan.java
│       │       │                       │   └── SuperScriptSpan.java
│       │       │                       └── tag/
│       │       │                           ├── BlockquoteHandler.java
│       │       │                           ├── EmphasisHandler.java
│       │       │                           ├── HeadingHandler.java
│       │       │                           ├── ImageHandler.java
│       │       │                           ├── ImageSizeParserImpl.java
│       │       │                           ├── LinkHandler.java
│       │       │                           ├── ListHandler.java
│       │       │                           ├── SimpleTagHandler.java
│       │       │                           ├── StrikeHandler.java
│       │       │                           ├── StrongEmphasisHandler.java
│       │       │                           ├── SubScriptHandler.java
│       │       │                           ├── SuperScriptHandler.java
│       │       │                           └── UnderlineHandler.java
│       │       └── test/
│       │           └── java/
│       │               └── io/
│       │                   └── noties/
│       │                       └── markwon/
│       │                           └── html/
│       │                               └── ExampleUnitTest.java
│       ├── markwon-image/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── consumer-rules.pro
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── io/
│       │       │           └── noties/
│       │       │               └── markwon/
│       │       │                   └── image/
│       │       │                       └── ExampleInstrumentedTest.java
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   └── java/
│       │       │       ├── com/
│       │       │       │   └── fluid/
│       │       │       │       └── afm/
│       │       │       │           └── network/
│       │       │       │               ├── CircleDrawable.java
│       │       │       │               └── ImageLoaderSchemeHandler.java
│       │       │       └── io/
│       │       │           └── noties/
│       │       │               └── markwon/
│       │       │                   └── image/
│       │       │                       ├── AsyncDrawableLoaderBuilder.java
│       │       │                       ├── AsyncDrawableLoaderImpl.java
│       │       │                       ├── DefaultDownScalingMediaDecoder.java
│       │       │                       ├── DefaultMediaDecoder.java
│       │       │                       ├── ImageItem.java
│       │       │                       ├── ImagesPlugin.java
│       │       │                       ├── MediaDecoder.java
│       │       │                       ├── SchemeHandler.java
│       │       │                       ├── data/
│       │       │                       │   ├── DataUri.java
│       │       │                       │   ├── DataUriDecoder.java
│       │       │                       │   ├── DataUriParser.java
│       │       │                       │   └── DataUriSchemeHandler.java
│       │       │                       ├── file/
│       │       │                       │   └── FileSchemeHandler.java
│       │       │                       └── network/
│       │       │                           └── NetworkSchemeHandler.java
│       │       └── test/
│       │           └── java/
│       │               └── io/
│       │                   └── noties/
│       │                       └── markwon/
│       │                           └── image/
│       │                               └── ExampleUnitTest.java
│       ├── markwon-inline-parser/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── consumer-rules.pro
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── io/
│       │       │           └── noties/
│       │       │               └── markwon/
│       │       │                   └── inlineparser/
│       │       │                       └── ExampleInstrumentedTest.java
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   └── java/
│       │       │       ├── com/
│       │       │       │   └── fluid/
│       │       │       │       └── afm/
│       │       │       │           └── inline/
│       │       │       │               └── OiintInlineProcessor.java
│       │       │       └── io/
│       │       │           └── noties/
│       │       │               └── markwon/
│       │       │                   └── inlineparser/
│       │       │                       ├── AutolinkInlineProcessor.java
│       │       │                       ├── BackslashInlineProcessor.java
│       │       │                       ├── BackticksInlineProcessor.java
│       │       │                       ├── BangInlineProcessor.java
│       │       │                       ├── CloseBracketInlineProcessor.java
│       │       │                       ├── EntityInlineProcessor.java
│       │       │                       ├── HtmlInlineProcessor.java
│       │       │                       ├── InlineParserUtils.java
│       │       │                       ├── InlineProcessor.java
│       │       │                       ├── MarkwonInlineParser.java
│       │       │                       ├── MarkwonInlineParserContext.java
│       │       │                       ├── MarkwonInlineParserPlugin.java
│       │       │                       ├── NewLineInlineProcessor.java
│       │       │                       ├── OpenBracketInlineProcessor.java
│       │       │                       └── StaggeredDelimiterProcessor.java
│       │       └── test/
│       │           └── java/
│       │               └── io/
│       │                   └── noties/
│       │                       └── markwon/
│       │                           └── inlineparser/
│       │                               └── ExampleUnitTest.java
│       ├── markwon-syntax-highlight/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   ├── consumer-rules.pro
│       │   ├── libs/
│       │   │   ├── prism4j-2.0.0.jar
│       │   │   └── prism4j-languages-2.0.0.jar
│       │   ├── proguard-rules.pro
│       │   └── src/
│       │       ├── androidTest/
│       │       │   └── java/
│       │       │       └── io/
│       │       │           └── noties/
│       │       │               └── markwon/
│       │       │                   └── syntax/
│       │       │                       └── ExampleInstrumentedTest.java
│       │       ├── main/
│       │       │   ├── AndroidManifest.xml
│       │       │   └── java/
│       │       │       └── io/
│       │       │           └── noties/
│       │       │               └── markwon/
│       │       │                   └── syntax/
│       │       │                       ├── BaseCodeGrammar.java
│       │       │                       ├── FixPrism4j.java
│       │       │                       ├── Prism4jSyntaxHighlight.java
│       │       │                       ├── Prism4jSyntaxVisitor.java
│       │       │                       ├── Prism4jTheme.java
│       │       │                       ├── Prism4jThemeBase.java
│       │       │                       ├── Prism4jThemeDarkula.java
│       │       │                       ├── Prism4jThemeDefault.java
│       │       │                       └── SyntaxHighlightPlugin.java
│       │       └── test/
│       │           └── java/
│       │               └── io/
│       │                   └── noties/
│       │                       └── markwon/
│       │                           └── syntax/
│       │                               └── ExampleUnitTest.java
│       └── settings.gradle
├── CHANGELOG.md
├── CONTRIBUTING.md
├── HarmonyOS/
│   ├── .gitignore
│   ├── AppScope/
│   │   ├── app.json5
│   │   └── resources/
│   │       └── base/
│   │           ├── element/
│   │           │   └── string.json
│   │           └── media/
│   │               └── layered_image.json
│   ├── build-profile.json5
│   ├── code-linter.json5
│   ├── hvigor/
│   │   └── hvigor-config.json5
│   ├── hvigorfile.ts
│   ├── markdown/
│   │   ├── .gitignore
│   │   ├── BuildProfile.ets
│   │   ├── CHANGELOG.md
│   │   ├── Index.ets
│   │   ├── LICENSE
│   │   ├── README.md
│   │   ├── build-profile.json5
│   │   ├── consumer-rules.txt
│   │   ├── hvigorfile.ts
│   │   ├── obfuscation-rules.txt
│   │   ├── oh-package.json5
│   │   └── src/
│   │       ├── main/
│   │       │   ├── cpp/
│   │       │   │   ├── CMakeLists.txt
│   │       │   │   ├── formula-ffi/
│   │       │   │   │   ├── .gitcode/
│   │       │   │   │   │   ├── ISSUE_TEMPLATE/
│   │       │   │   │   │   │   ├── bug.md
│   │       │   │   │   │   │   ├── question.md
│   │       │   │   │   │   │   └── request.md
│   │       │   │   │   │   └── PULL_REQUEST_TEMPLATE.md
│   │       │   │   │   ├── .gitignore
│   │       │   │   │   ├── .gitmodules
│   │       │   │   │   ├── CHANGELOG.md
│   │       │   │   │   ├── LICENSE
│   │       │   │   │   ├── README.OpenSource
│   │       │   │   │   ├── README.md
│   │       │   │   │   ├── build-ohos.sh
│   │       │   │   │   ├── cjpm.toml
│   │       │   │   │   ├── doc/
│   │       │   │   │   │   └── feature_api.md
│   │       │   │   │   ├── ffi/
│   │       │   │   │   │   ├── CMakeLists.txt
│   │       │   │   │   │   ├── ffi/
│   │       │   │   │   │   │   ├── graphic_ohos.cpp
│   │       │   │   │   │   │   ├── graphic_ohos.h
│   │       │   │   │   │   │   ├── graphic_ohos_ffi.cpp
│   │       │   │   │   │   │   ├── graphic_ohos_ffi.h
│   │       │   │   │   │   │   ├── latex_ffi.cpp
│   │       │   │   │   │   │   ├── latex_ffi.h
│   │       │   │   │   │   │   ├── render_ffi.cpp
│   │       │   │   │   │   │   ├── render_ffi.h
│   │       │   │   │   │   │   └── utils.h
│   │       │   │   │   │   ├── latex/
│   │       │   │   │   │   │   ├── .gitignore
│   │       │   │   │   │   │   ├── CMakeLists.txt
│   │       │   │   │   │   │   ├── README.md
│   │       │   │   │   │   │   ├── githooks/
│   │       │   │   │   │   │   │   ├── pre-commit
│   │       │   │   │   │   │   │   └── pre-push
│   │       │   │   │   │   │   ├── readme/
│   │       │   │   │   │   │   │   └── samples.md
│   │       │   │   │   │   │   ├── res/
│   │       │   │   │   │   │   │   ├── RES_README
│   │       │   │   │   │   │   │   ├── SAMPLES.tex
│   │       │   │   │   │   │   │   ├── cyrillic/
│   │       │   │   │   │   │   │   │   ├── cyrillic.map.xml
│   │       │   │   │   │   │   │   │   ├── language_cyrillic.xml
│   │       │   │   │   │   │   │   │   ├── mappings_cyrillic.xml
│   │       │   │   │   │   │   │   │   ├── symbols_cyrillic.xml
│   │       │   │   │   │   │   │   │   ├── wnbx10.xml
│   │       │   │   │   │   │   │   │   ├── wnbxti10.xml
│   │       │   │   │   │   │   │   │   ├── wnr10.xml
│   │       │   │   │   │   │   │   │   ├── wnss10.xml
│   │       │   │   │   │   │   │   │   ├── wnssbx10.xml
│   │       │   │   │   │   │   │   │   ├── wnssi10.xml
│   │       │   │   │   │   │   │   │   ├── wnti10.xml
│   │       │   │   │   │   │   │   │   └── wntt10.xml
│   │       │   │   │   │   │   │   ├── fonts/
│   │       │   │   │   │   │   │   │   └── licences/
│   │       │   │   │   │   │   │   │       ├── Knuth_License.txt
│   │       │   │   │   │   │   │   │       ├── License_for_dsrom.txt
│   │       │   │   │   │   │   │   │       └── OFL.txt
│   │       │   │   │   │   │   │   └── greek/
│   │       │   │   │   │   │   │       ├── fcmbipg.xml
│   │       │   │   │   │   │   │       ├── fcmbpg.xml
│   │       │   │   │   │   │   │       ├── fcmripg.xml
│   │       │   │   │   │   │   │       ├── fcmrpg.xml
│   │       │   │   │   │   │   │       ├── fcsbpg.xml
│   │       │   │   │   │   │   │       ├── fcsropg.xml
│   │       │   │   │   │   │   │       ├── fcsrpg.xml
│   │       │   │   │   │   │   │       ├── fctrpg.xml
│   │       │   │   │   │   │   │       ├── greek.map.xml
│   │       │   │   │   │   │   │       ├── language_greek.xml
│   │       │   │   │   │   │   │       ├── mappings_greek.xml
│   │       │   │   │   │   │   │       └── symbols_greek.xml
│   │       │   │   │   │   │   └── src/
│   │       │   │   │   │   │       ├── atom/
│   │       │   │   │   │   │       │   ├── atom.h
│   │       │   │   │   │   │       │   ├── atom_basic.cpp
│   │       │   │   │   │   │       │   ├── atom_basic.h
│   │       │   │   │   │   │       │   ├── atom_impl.cpp
│   │       │   │   │   │   │       │   ├── atom_impl.h
│   │       │   │   │   │   │       │   ├── box.cpp
│   │       │   │   │   │   │       │   ├── box.h
│   │       │   │   │   │   │       │   └── colors_def.cpp
│   │       │   │   │   │   │       ├── common.h
│   │       │   │   │   │   │       ├── config.h
│   │       │   │   │   │   │       ├── core/
│   │       │   │   │   │   │       │   ├── core.cpp
│   │       │   │   │   │   │       │   ├── core.h
│   │       │   │   │   │   │       │   ├── formula.cpp
│   │       │   │   │   │   │       │   ├── formula.h
│   │       │   │   │   │   │       │   ├── formula_def.cpp
│   │       │   │   │   │   │       │   ├── localized_num.cpp
│   │       │   │   │   │   │       │   ├── macro.cpp
│   │       │   │   │   │   │       │   ├── macro.h
│   │       │   │   │   │   │       │   ├── macro_def.cpp
│   │       │   │   │   │   │       │   ├── macro_impl.cpp
│   │       │   │   │   │   │       │   ├── macro_impl.h
│   │       │   │   │   │   │       │   ├── parser.cpp
│   │       │   │   │   │   │       │   └── parser.h
│   │       │   │   │   │   │       ├── fonts/
│   │       │   │   │   │   │       │   ├── alphabet.cpp
│   │       │   │   │   │   │       │   ├── alphabet.h
│   │       │   │   │   │   │       │   ├── font_info.cpp
│   │       │   │   │   │   │       │   ├── font_info.h
│   │       │   │   │   │   │       │   ├── font_reg.h
│   │       │   │   │   │   │       │   ├── fonts.cpp
│   │       │   │   │   │   │       │   ├── fonts.h
│   │       │   │   │   │   │       │   └── symbol_reg.h
│   │       │   │   │   │   │       ├── graphic/
│   │       │   │   │   │   │       │   ├── graphic.h
│   │       │   │   │   │   │       │   └── graphic_basic.h
│   │       │   │   │   │   │       ├── latex.cpp
│   │       │   │   │   │   │       ├── latex.h
│   │       │   │   │   │   │       ├── platform/
│   │       │   │   │   │   │       │   ├── cairo/
│   │       │   │   │   │   │       │   │   ├── graphic_cairo.cpp
│   │       │   │   │   │   │       │   │   └── graphic_cairo.h
│   │       │   │   │   │   │       │   └── gdi_win/
│   │       │   │   │   │   │       │       ├── graphic_win32.cpp
│   │       │   │   │   │   │       │       └── graphic_win32.h
│   │       │   │   │   │   │       ├── render.cpp
│   │       │   │   │   │   │       ├── render.h
│   │       │   │   │   │   │       ├── res/
│   │       │   │   │   │   │       │   ├── builtin/
│   │       │   │   │   │   │       │   │   ├── formula_mappings.res.cpp
│   │       │   │   │   │   │       │   │   ├── glue.res.cpp
│   │       │   │   │   │   │       │   │   ├── symbol_mapping.res.cpp
│   │       │   │   │   │   │       │   │   ├── tex_param.res.cpp
│   │       │   │   │   │   │       │   │   └── tex_symbols.res.cpp
│   │       │   │   │   │   │       │   ├── font/
│   │       │   │   │   │   │       │   │   ├── README
│   │       │   │   │   │   │       │   │   ├── bi10.def.cpp
│   │       │   │   │   │   │       │   │   ├── bx10.def.cpp
│   │       │   │   │   │   │       │   │   ├── cmbsy10.def.cpp
│   │       │   │   │   │   │       │   │   ├── cmbx10.def.cpp
│   │       │   │   │   │   │       │   │   ├── cmbxti10.def.cpp
│   │       │   │   │   │   │       │   │   ├── cmex10.def.cpp
│   │       │   │   │   │   │       │   │   ├── cmmi10.def.cpp
│   │       │   │   │   │   │       │   │   ├── cmmi10_unchanged.def.cpp
│   │       │   │   │   │   │       │   │   ├── cmmib10.def.cpp
│   │       │   │   │   │   │       │   │   ├── cmmib10_unchanged.def.cpp
│   │       │   │   │   │   │       │   │   ├── cmr10.def.cpp
│   │       │   │   │   │   │       │   │   ├── cmss10.def.cpp
│   │       │   │   │   │   │       │   │   ├── cmssbx10.def.cpp
│   │       │   │   │   │   │       │   │   ├── cmssi10.def.cpp
│   │       │   │   │   │   │       │   │   ├── cmsy10.def.cpp
│   │       │   │   │   │   │       │   │   ├── cmti10.def.cpp
│   │       │   │   │   │   │       │   │   ├── cmti10_unchanged.def.cpp
│   │       │   │   │   │   │       │   │   ├── cmtt10.def.cpp
│   │       │   │   │   │   │       │   │   ├── dsrom10.def.cpp
│   │       │   │   │   │   │       │   │   ├── eufb10.def.cpp
│   │       │   │   │   │   │       │   │   ├── eufm10.def.cpp
│   │       │   │   │   │   │       │   │   ├── i10.def.cpp
│   │       │   │   │   │   │       │   │   ├── moustache.def.cpp
│   │       │   │   │   │   │       │   │   ├── msam10.def.cpp
│   │       │   │   │   │   │       │   │   ├── msbm10.def.cpp
│   │       │   │   │   │   │       │   │   ├── r10.def.cpp
│   │       │   │   │   │   │       │   │   ├── r10_unchanged.def.cpp
│   │       │   │   │   │   │       │   │   ├── rsfs10.def.cpp
│   │       │   │   │   │   │       │   │   ├── sb10.def.cpp
│   │       │   │   │   │   │       │   │   ├── sbi10.def.cpp
│   │       │   │   │   │   │       │   │   ├── si10.def.cpp
│   │       │   │   │   │   │       │   │   ├── special.def.cpp
│   │       │   │   │   │   │       │   │   ├── ss10.def.cpp
│   │       │   │   │   │   │       │   │   ├── stmary10.def.cpp
│   │       │   │   │   │   │       │   │   └── tt10.def.cpp
│   │       │   │   │   │   │       │   ├── font_def.res.h
│   │       │   │   │   │   │       │   ├── parser/
│   │       │   │   │   │   │       │   │   ├── font_parser.cpp
│   │       │   │   │   │   │       │   │   ├── font_parser.h
│   │       │   │   │   │   │       │   │   ├── formula_parser.cpp
│   │       │   │   │   │   │       │   │   └── formula_parser.h
│   │       │   │   │   │   │       │   ├── reg/
│   │       │   │   │   │   │       │   │   ├── builtin_font_reg.cpp
│   │       │   │   │   │   │       │   │   ├── builtin_font_reg.h
│   │       │   │   │   │   │       │   │   ├── builtin_syms_reg.cpp
│   │       │   │   │   │   │       │   │   └── builtin_syms_reg.h
│   │       │   │   │   │   │       │   ├── sym/
│   │       │   │   │   │   │       │   │   ├── amsfonts.def.cpp
│   │       │   │   │   │   │       │   │   ├── amssymb.def.cpp
│   │       │   │   │   │   │       │   │   ├── base.def.cpp
│   │       │   │   │   │   │       │   │   ├── special.def.cpp
│   │       │   │   │   │   │       │   │   └── stmaryrd.def.cpp
│   │       │   │   │   │   │       │   └── symbol_def.res.h
│   │       │   │   │   │   │       ├── samples/
│   │       │   │   │   │   │       │   ├── gtkmm_main.cpp
│   │       │   │   │   │   │       │   ├── mem_check_main.cpp
│   │       │   │   │   │   │       │   ├── samples.h
│   │       │   │   │   │   │       │   └── win32_main.cpp
│   │       │   │   │   │   │       └── xml/
│   │       │   │   │   │   │           ├── tinyxml2.cpp
│   │       │   │   │   │   │           └── tinyxml2.h
│   │       │   │   │   │   └── third_party_bounds_checking_function/
│   │       │   │   │   │       ├── .gitignore
│   │       │   │   │   │       ├── BUILD.gn
│   │       │   │   │   │       ├── CMakeLists.txt
│   │       │   │   │   │       ├── LICENSE
│   │       │   │   │   │       ├── Makefile
│   │       │   │   │   │       ├── OAT.xml
│   │       │   │   │   │       ├── README.OpenSource
│   │       │   │   │   │       ├── README.en.md
│   │       │   │   │   │       ├── README.md
│   │       │   │   │   │       ├── bundle.json
│   │       │   │   │   │       ├── include/
│   │       │   │   │   │       │   ├── securec.h
│   │       │   │   │   │       │   └── securectype.h
│   │       │   │   │   │       ├── libsec_src.gni
│   │       │   │   │   │       └── src/
│   │       │   │   │   │           ├── fscanf_s.c
│   │       │   │   │   │           ├── fwscanf_s.c
│   │       │   │   │   │           ├── gets_s.c
│   │       │   │   │   │           ├── input.inl
│   │       │   │   │   │           ├── memcpy_s.c
│   │       │   │   │   │           ├── memmove_s.c
│   │       │   │   │   │           ├── memset_s.c
│   │       │   │   │   │           ├── output.inl
│   │       │   │   │   │           ├── scanf_s.c
│   │       │   │   │   │           ├── secinput.h
│   │       │   │   │   │           ├── securecutil.c
│   │       │   │   │   │           ├── securecutil.h
│   │       │   │   │   │           ├── secureinput_a.c
│   │       │   │   │   │           ├── secureinput_w.c
│   │       │   │   │   │           ├── secureprintoutput.h
│   │       │   │   │   │           ├── secureprintoutput_a.c
│   │       │   │   │   │           ├── secureprintoutput_w.c
│   │       │   │   │   │           ├── snprintf_s.c
│   │       │   │   │   │           ├── sprintf_s.c
│   │       │   │   │   │           ├── sscanf_s.c
│   │       │   │   │   │           ├── strcat_s.c
│   │       │   │   │   │           ├── strcpy_s.c
│   │       │   │   │   │           ├── strncat_s.c
│   │       │   │   │   │           ├── strncpy_s.c
│   │       │   │   │   │           ├── strtok_s.c
│   │       │   │   │   │           ├── swprintf_s.c
│   │       │   │   │   │           ├── swscanf_s.c
│   │       │   │   │   │           ├── vfscanf_s.c
│   │       │   │   │   │           ├── vfwscanf_s.c
│   │       │   │   │   │           ├── vscanf_s.c
│   │       │   │   │   │           ├── vsnprintf_s.c
│   │       │   │   │   │           ├── vsprintf_s.c
│   │       │   │   │   │           ├── vsscanf_s.c
│   │       │   │   │   │           ├── vswprintf_s.c
│   │       │   │   │   │           ├── vswscanf_s.c
│   │       │   │   │   │           ├── vwscanf_s.c
│   │       │   │   │   │           ├── wcscat_s.c
│   │       │   │   │   │           ├── wcscpy_s.c
│   │       │   │   │   │           ├── wcsncat_s.c
│   │       │   │   │   │           ├── wcsncpy_s.c
│   │       │   │   │   │           ├── wcstok_s.c
│   │       │   │   │   │           ├── wmemcpy_s.c
│   │       │   │   │   │           ├── wmemmove_s.c
│   │       │   │   │   │           └── wscanf_s.c
│   │       │   │   │   ├── src/
│   │       │   │   │   │   ├── ffi.cj
│   │       │   │   │   │   ├── graphic_2d.cj
│   │       │   │   │   │   ├── latex.cj
│   │       │   │   │   │   └── render.cj
│   │       │   │   │   └── test/
│   │       │   │   │       ├── DOC/
│   │       │   │   │       │   └── test.cj
│   │       │   │   │       ├── HLT/
│   │       │   │   │       │   ├── c_test1.cj
│   │       │   │   │       │   ├── c_test10.cj
│   │       │   │   │       │   ├── c_test11.cj
│   │       │   │   │       │   ├── c_test2.cj
│   │       │   │   │       │   ├── c_test222222222.cj
│   │       │   │   │       │   ├── c_test3.cj
│   │       │   │   │       │   ├── c_test4.cj
│   │       │   │   │       │   ├── c_test5.cj
│   │       │   │   │       │   ├── c_test6.cj
│   │       │   │   │       │   ├── c_test7.cj
│   │       │   │   │       │   ├── c_test8.cj
│   │       │   │   │       │   ├── c_test9.cj
│   │       │   │   │       │   ├── fortify_test1.cj
│   │       │   │   │       │   ├── fortify_test2.cj
│   │       │   │   │       │   ├── fortify_test3.cj
│   │       │   │   │       │   ├── fortify_test4.cj
│   │       │   │   │       │   ├── fortify_test5.cj
│   │       │   │   │       │   ├── later_test1.cj
│   │       │   │   │       │   ├── later_test10.cj
│   │       │   │   │       │   ├── later_test11.cj
│   │       │   │   │       │   ├── later_test12.cj
│   │       │   │   │       │   ├── later_test13.cj
│   │       │   │   │       │   ├── later_test14.cj
│   │       │   │   │       │   ├── later_test15.cj
│   │       │   │   │       │   ├── later_test16.cj
│   │       │   │   │       │   ├── later_test17.cj
│   │       │   │   │       │   ├── later_test18.cj
│   │       │   │   │       │   ├── later_test2.cj
│   │       │   │   │       │   ├── later_test3.cj
│   │       │   │   │       │   ├── later_test4.cj
│   │       │   │   │       │   ├── later_test5.cj
│   │       │   │   │       │   ├── later_test6.cj
│   │       │   │   │       │   ├── later_test7.cj
│   │       │   │   │       │   ├── later_test8.cj
│   │       │   │   │       │   ├── later_test9.cj
│   │       │   │   │       │   ├── test1.cj
│   │       │   │   │       │   ├── test2.cj
│   │       │   │   │       │   ├── test3.cj
│   │       │   │   │       │   ├── test4.cj
│   │       │   │   │       │   ├── test5.cj
│   │       │   │   │       │   ├── test6.cj
│   │       │   │   │       │   ├── test7.cj
│   │       │   │   │       │   └── test8.cj
│   │       │   │   │       └── LLT/
│   │       │   │   │           ├── c_test1.cj
│   │       │   │   │           ├── c_test10.cj
│   │       │   │   │           ├── c_test12.cj
│   │       │   │   │           ├── c_test13.cj
│   │       │   │   │           ├── c_test2.cj
│   │       │   │   │           ├── c_test3.cj
│   │       │   │   │           ├── c_test4.cj
│   │       │   │   │           ├── c_test5.cj
│   │       │   │   │           ├── c_test6.cj
│   │       │   │   │           ├── c_test7.cj
│   │       │   │   │           ├── c_test8.cj
│   │       │   │   │           ├── c_test9.cj
│   │       │   │   │           ├── later_test1.cj
│   │       │   │   │           ├── later_test10.cj
│   │       │   │   │           ├── later_test11.cj
│   │       │   │   │           ├── later_test12.cj
│   │       │   │   │           ├── later_test13.cj
│   │       │   │   │           ├── later_test14.cj
│   │       │   │   │           ├── later_test15.cj
│   │       │   │   │           ├── later_test16.cj
│   │       │   │   │           ├── later_test17.cj
│   │       │   │   │           ├── later_test18.cj
│   │       │   │   │           ├── later_test2.cj
│   │       │   │   │           ├── later_test3.cj
│   │       │   │   │           ├── later_test4.cj
│   │       │   │   │           ├── later_test5.cj
│   │       │   │   │           ├── later_test6.cj
│   │       │   │   │           ├── later_test7.cj
│   │       │   │   │           ├── later_test8.cj
│   │       │   │   │           ├── later_test9.cj
│   │       │   │   │           ├── test1.cj
│   │       │   │   │           ├── test2.cj
│   │       │   │   │           ├── test3.cj
│   │       │   │   │           ├── test4.cj
│   │       │   │   │           ├── test5.cj
│   │       │   │   │           ├── test6.cj
│   │       │   │   │           ├── test7.cj
│   │       │   │   │           ├── test8.cj
│   │       │   │   │           └── test9.cj
│   │       │   │   ├── napi_init.cpp
│   │       │   │   └── types/
│   │       │   │       └── liblatexentry/
│   │       │   │           ├── Index.d.ts
│   │       │   │           └── oh-package.json5
│   │       │   ├── ets/
│   │       │   │   ├── engine/
│   │       │   │   │   ├── base.ets
│   │       │   │   │   ├── engine.ets
│   │       │   │   │   ├── index.ets
│   │       │   │   │   ├── plugin.ets
│   │       │   │   │   └── service.ets
│   │       │   │   ├── index.ets
│   │       │   │   ├── markdown.ets
│   │       │   │   ├── render/
│   │       │   │   │   ├── component/
│   │       │   │   │   │   ├── builder.ets
│   │       │   │   │   │   ├── code.ets
│   │       │   │   │   │   ├── content-box.ets
│   │       │   │   │   │   ├── embed.ets
│   │       │   │   │   │   ├── fragment.ets
│   │       │   │   │   │   ├── image-gallery.ets
│   │       │   │   │   │   ├── index.ets
│   │       │   │   │   │   ├── table.ets
│   │       │   │   │   │   └── text.ets
│   │       │   │   │   ├── index.ets
│   │       │   │   │   ├── service.ets
│   │       │   │   │   ├── styled/
│   │       │   │   │   │   ├── build-in.ets
│   │       │   │   │   │   ├── index.ets
│   │       │   │   │   │   ├── styled-controller.ets
│   │       │   │   │   │   ├── styled-embed.ets
│   │       │   │   │   │   ├── styled-object.ets
│   │       │   │   │   │   ├── styled-value.ets
│   │       │   │   │   │   └── styled.ets
│   │       │   │   │   └── typing/
│   │       │   │   │       ├── controller.ets
│   │       │   │   │       ├── index.ets
│   │       │   │   │       └── timer.ets
│   │       │   │   ├── service/
│   │       │   │   │   ├── ast/
│   │       │   │   │   │   ├── index.ets
│   │       │   │   │   │   ├── markdown-it/
│   │       │   │   │   │   │   ├── index.ets
│   │       │   │   │   │   │   ├── plugin/
│   │       │   │   │   │   │   │   ├── index.ets
│   │       │   │   │   │   │   │   ├── markdown-it-emoji/
│   │       │   │   │   │   │   │   │   ├── index.ets
│   │       │   │   │   │   │   │   │   ├── markdown-it-emoji-bare.js
│   │       │   │   │   │   │   │   │   ├── markdown-it-emoji-light.js
│   │       │   │   │   │   │   │   │   └── markdown-it-emoji.js
│   │       │   │   │   │   │   │   ├── markdown-it-footnote/
│   │       │   │   │   │   │   │   │   ├── index.ets
│   │       │   │   │   │   │   │   │   └── markdown-it-footnote.js
│   │       │   │   │   │   │   │   ├── markdown-it-sub/
│   │       │   │   │   │   │   │   │   ├── index.ets
│   │       │   │   │   │   │   │   │   └── markdown-it-sub.js
│   │       │   │   │   │   │   │   ├── markdown-it-sup/
│   │       │   │   │   │   │   │   │   ├── index.ets
│   │       │   │   │   │   │   │   │   └── markdown-it-sup.js
│   │       │   │   │   │   │   │   ├── markdown-it-task-lists/
│   │       │   │   │   │   │   │   │   ├── index.ets
│   │       │   │   │   │   │   │   │   └── markdown-it-task-lists.js
│   │       │   │   │   │   │   │   └── vscode-markdown-it-katex/
│   │       │   │   │   │   │   │       ├── index.ets
│   │       │   │   │   │   │   │       └── vscode-markdown-it-katex.js
│   │       │   │   │   │   │   └── src/
│   │       │   │   │   │   │       ├── markdown-it.js
│   │       │   │   │   │   │       ├── token.ets
│   │       │   │   │   │   │       └── types.ets
│   │       │   │   │   │   ├── node/
│   │       │   │   │   │   │   ├── index.ets
│   │       │   │   │   │   │   ├── models.ets
│   │       │   │   │   │   │   ├── plugin/
│   │       │   │   │   │   │   │   ├── build-in.ets
│   │       │   │   │   │   │   │   ├── index.ets
│   │       │   │   │   │   │   │   └── plugin.ets
│   │       │   │   │   │   │   └── program.ets
│   │       │   │   │   │   └── service.ets
│   │       │   │   │   ├── code/
│   │       │   │   │   │   ├── highlightjs/
│   │       │   │   │   │   │   ├── index.ets
│   │       │   │   │   │   │   └── src/
│   │       │   │   │   │   │       ├── highlight.js
│   │       │   │   │   │   │       ├── index.ets
│   │       │   │   │   │   │       └── types.ets
│   │       │   │   │   │   ├── index.ets
│   │       │   │   │   │   ├── service.ets
│   │       │   │   │   │   └── style.ets
│   │       │   │   │   ├── css/
│   │       │   │   │   │   ├── csstree/
│   │       │   │   │   │   │   ├── csstree.rollup.esm.js
│   │       │   │   │   │   │   ├── index.d.ts
│   │       │   │   │   │   │   ├── index.js
│   │       │   │   │   │   │   └── version.js
│   │       │   │   │   │   ├── index.ets
│   │       │   │   │   │   ├── service.ets
│   │       │   │   │   │   └── styled.ets
│   │       │   │   │   ├── ctx/
│   │       │   │   │   │   ├── index.ets
│   │       │   │   │   │   └── service.ets
│   │       │   │   │   ├── event/
│   │       │   │   │   │   ├── index.ets
│   │       │   │   │   │   └── service.ets
│   │       │   │   │   ├── file/
│   │       │   │   │   │   ├── index.ets
│   │       │   │   │   │   └── service.ets
│   │       │   │   │   ├── html/
│   │       │   │   │   │   ├── dom-serializer/
│   │       │   │   │   │   │   ├── index.ets
│   │       │   │   │   │   │   └── src/
│   │       │   │   │   │   │       ├── foreignNames.d.ts
│   │       │   │   │   │   │       ├── foreignNames.js
│   │       │   │   │   │   │       ├── index.d.ts
│   │       │   │   │   │   │       └── index.js
│   │       │   │   │   │   ├── domelementtype/
│   │       │   │   │   │   │   ├── index.ets
│   │       │   │   │   │   │   └── src/
│   │       │   │   │   │   │       ├── index.d.ts
│   │       │   │   │   │   │       └── index.js
│   │       │   │   │   │   ├── domhandler/
│   │       │   │   │   │   │   ├── index.ets
│   │       │   │   │   │   │   └── src/
│   │       │   │   │   │   │       ├── index.d.ts
│   │       │   │   │   │   │       ├── index.js
│   │       │   │   │   │   │       ├── node.d.ts
│   │       │   │   │   │   │       └── node.js
│   │       │   │   │   │   ├── domutils/
│   │       │   │   │   │   │   ├── index.ets
│   │       │   │   │   │   │   └── src/
│   │       │   │   │   │   │       ├── feeds.d.ts
│   │       │   │   │   │   │       ├── feeds.js
│   │       │   │   │   │   │       ├── helpers.d.ts
│   │       │   │   │   │   │       ├── helpers.js
│   │       │   │   │   │   │       ├── index.d.ts
│   │       │   │   │   │   │       ├── index.js
│   │       │   │   │   │   │       ├── legacy.d.ts
│   │       │   │   │   │   │       ├── legacy.js
│   │       │   │   │   │   │       ├── manipulation.d.ts
│   │       │   │   │   │   │       ├── manipulation.js
│   │       │   │   │   │   │       ├── querying.d.ts
│   │       │   │   │   │   │       ├── querying.js
│   │       │   │   │   │   │       ├── stringify.d.ts
│   │       │   │   │   │   │       ├── stringify.js
│   │       │   │   │   │   │       ├── traversal.d.ts
│   │       │   │   │   │   │       └── traversal.js
│   │       │   │   │   │   ├── entities/
│   │       │   │   │   │   │   ├── index.ets
│   │       │   │   │   │   │   └── src/
│   │       │   │   │   │   │       ├── decode-codepoint.d.ts
│   │       │   │   │   │   │       ├── decode-codepoint.js
│   │       │   │   │   │   │       ├── decode.d.ts
│   │       │   │   │   │   │       ├── decode.js
│   │       │   │   │   │   │       ├── encode.d.ts
│   │       │   │   │   │   │       ├── encode.js
│   │       │   │   │   │   │       ├── escape.d.ts
│   │       │   │   │   │   │       ├── escape.js
│   │       │   │   │   │   │       ├── generated/
│   │       │   │   │   │   │       │   ├── decode-data-html.d.ts
│   │       │   │   │   │   │       │   ├── decode-data-html.js
│   │       │   │   │   │   │       │   ├── decode-data-xml.d.ts
│   │       │   │   │   │   │       │   ├── decode-data-xml.js
│   │       │   │   │   │   │       │   ├── encode-html.d.ts
│   │       │   │   │   │   │       │   └── encode-html.js
│   │       │   │   │   │   │       ├── index.d.ts
│   │       │   │   │   │   │       └── index.js
│   │       │   │   │   │   ├── htmlparser2/
│   │       │   │   │   │   │   ├── index.ets
│   │       │   │   │   │   │   └── src/
│   │       │   │   │   │   │       ├── Parser.d.ts
│   │       │   │   │   │   │       ├── Parser.js
│   │       │   │   │   │   │       ├── Tokenizer.d.ts
│   │       │   │   │   │   │       ├── Tokenizer.js
│   │       │   │   │   │   │       ├── index.d.ts
│   │       │   │   │   │   │       └── index.js
│   │       │   │   │   │   ├── index.ets
│   │       │   │   │   │   ├── service.ets
│   │       │   │   │   │   └── styled.ets
│   │       │   │   │   ├── image/
│   │       │   │   │   │   ├── index.ets
│   │       │   │   │   │   └── service.ets
│   │       │   │   │   ├── index.ets
│   │       │   │   │   └── math/
│   │       │   │   │       ├── index.ets
│   │       │   │   │       └── service.ets
│   │       │   │   ├── theme/
│   │       │   │   │   ├── index.ets
│   │       │   │   │   ├── service.ets
│   │       │   │   │   ├── styling.ets
│   │       │   │   │   └── theme.ets
│   │       │   │   └── util/
│   │       │   │       ├── color.ets
│   │       │   │       ├── component.ets
│   │       │   │       ├── crypto.ets
│   │       │   │       ├── dom.ets
│   │       │   │       ├── error.ets
│   │       │   │       ├── event.ets
│   │       │   │       ├── index.ets
│   │       │   │       ├── layout.ets
│   │       │   │       ├── log.ets
│   │       │   │       └── uuid/
│   │       │   │           ├── index.ets
│   │       │   │           └── src/
│   │       │   │               ├── index.js
│   │       │   │               ├── max.js
│   │       │   │               ├── md5.js
│   │       │   │               ├── native.js
│   │       │   │               ├── nil.js
│   │       │   │               ├── parse.js
│   │       │   │               ├── regex.js
│   │       │   │               ├── rng.js
│   │       │   │               ├── sha1.js
│   │       │   │               ├── stringify.js
│   │       │   │               ├── types.js
│   │       │   │               ├── uuid-bin.js
│   │       │   │               ├── v1.js
│   │       │   │               ├── v1ToV6.js
│   │       │   │               ├── v3.js
│   │       │   │               ├── v35.js
│   │       │   │               ├── v4.js
│   │       │   │               ├── v5.js
│   │       │   │               ├── v6.js
│   │       │   │               ├── v6ToV1.js
│   │       │   │               ├── v7.js
│   │       │   │               ├── validate.js
│   │       │   │               └── version.js
│   │       │   ├── module.json5
│   │       │   └── resources/
│   │       │       ├── base/
│   │       │       │   └── element/
│   │       │       │       └── string.json
│   │       │       ├── en_US/
│   │       │       │   └── element/
│   │       │       │       └── string.json
│   │       │       ├── resfile/
│   │       │       │   └── res/
│   │       │       │       ├── cyrillic/
│   │       │       │       │   ├── cyrillic.map.xml
│   │       │       │       │   ├── language_cyrillic.xml
│   │       │       │       │   ├── mappings_cyrillic.xml
│   │       │       │       │   ├── symbols_cyrillic.xml
│   │       │       │       │   ├── wnbx10.xml
│   │       │       │       │   ├── wnbxti10.xml
│   │       │       │       │   ├── wnr10.xml
│   │       │       │       │   ├── wnss10.xml
│   │       │       │       │   ├── wnssbx10.xml
│   │       │       │       │   ├── wnssi10.xml
│   │       │       │       │   ├── wnti10.xml
│   │       │       │       │   └── wntt10.xml
│   │       │       │       ├── fonts/
│   │       │       │       │   └── licences/
│   │       │       │       │       ├── Knuth_License.txt
│   │       │       │       │       ├── License_for_dsrom.txt
│   │       │       │       │       └── OFL.txt
│   │       │       │       └── greek/
│   │       │       │           ├── fcmbipg.xml
│   │       │       │           ├── fcmbpg.xml
│   │       │       │           ├── fcmripg.xml
│   │       │       │           ├── fcmrpg.xml
│   │       │       │           ├── fcsbpg.xml
│   │       │       │           ├── fcsropg.xml
│   │       │       │           ├── fcsrpg.xml
│   │       │       │           ├── fctrpg.xml
│   │       │       │           ├── greek.map.xml
│   │       │       │           ├── language_greek.xml
│   │       │       │           ├── mappings_greek.xml
│   │       │       │           └── symbols_greek.xml
│   │       │       └── zh_CN/
│   │       │           └── element/
│   │       │               └── string.json
│   │       ├── ohosTest/
│   │       │   ├── ets/
│   │       │   │   └── test/
│   │       │   │       ├── Ability.test.ets
│   │       │   │       └── List.test.ets
│   │       │   └── module.json5
│   │       └── test/
│   │           ├── List.test.ets
│   │           └── LocalUnit.test.ets
│   ├── oh-package.json5
│   └── playground/
│       ├── .gitignore
│       ├── build-profile.json5
│       ├── hvigorfile.ts
│       ├── obfuscation-rules.txt
│       ├── oh-package.json5
│       └── src/
│           ├── main/
│           │   ├── ets/
│           │   │   ├── pages/
│           │   │   │   ├── board.ets
│           │   │   │   ├── feature-detail.ets
│           │   │   │   ├── feature-list.ets
│           │   │   │   ├── index.ets
│           │   │   │   └── shared/
│           │   │   │       ├── feature.ets
│           │   │   │       ├── index.ets
│           │   │   │       └── navigation.ets
│           │   │   ├── playgroundability/
│           │   │   │   └── PlaygroundAbility.ets
│           │   │   └── playgroundbackupability/
│           │   │       └── PlaygroundBackupAbility.ets
│           │   ├── module.json5
│           │   └── resources/
│           │       ├── base/
│           │       │   ├── element/
│           │       │   │   ├── color.json
│           │       │   │   ├── float.json
│           │       │   │   └── string.json
│           │       │   ├── media/
│           │       │   │   └── layered_image.json
│           │       │   └── profile/
│           │       │       ├── backup_config.json
│           │       │       └── main_pages.json
│           │       ├── dark/
│           │       │   └── element/
│           │       │       └── color.json
│           │       └── rawfile/
│           │           └── feature/
│           │               ├── cmark-gfm-bench/
│           │               │   ├── block-bq-flat.md
│           │               │   ├── block-bq-nested.md
│           │               │   ├── block-code.md
│           │               │   ├── block-fences.md
│           │               │   ├── block-heading.md
│           │               │   ├── block-hr.md
│           │               │   ├── block-html.md
│           │               │   ├── block-lheading.md
│           │               │   ├── block-list-flat.md
│           │               │   ├── block-list-nested.md
│           │               │   ├── block-ref-flat.md
│           │               │   ├── block-ref-nested.md
│           │               │   ├── inline-autolink.md
│           │               │   ├── inline-backticks.md
│           │               │   ├── inline-em-flat.md
│           │               │   ├── inline-em-nested.md
│           │               │   ├── inline-em-worst.md
│           │               │   ├── inline-entity.md
│           │               │   ├── inline-escape.md
│           │               │   ├── inline-html.md
│           │               │   ├── inline-links-flat.md
│           │               │   ├── inline-links-nested.md
│           │               │   ├── inline-newlines.md
│           │               │   ├── lorem1.md
│           │               │   └── rawtabs.md
│           │               ├── markdown-ant/
│           │               │   ├── html-tag-a.md
│           │               │   ├── html-tag-mark.md
│           │               │   ├── html-tag-sub.md
│           │               │   ├── html-tag-sup.md
│           │               │   └── html-tag-u.md
│           │               └── markdown-it/
│           │                   ├── code.md
│           │                   ├── emoji.md
│           │                   ├── emph.md
│           │                   ├── footnote.md
│           │                   ├── heading.md
│           │                   ├── image.md
│           │                   ├── line-break.md
│           │                   ├── link.md
│           │                   ├── list.md
│           │                   ├── math.md
│           │                   ├── paragraph.md
│           │                   ├── quote.md
│           │                   ├── strike-through.md
│           │                   ├── strong.md
│           │                   ├── sub.md
│           │                   ├── sup.md
│           │                   ├── table.md
│           │                   ├── task.md
│           │                   └── thematic-break.md
│           ├── mock/
│           │   └── mock-config.json5
│           ├── ohosTest/
│           │   ├── ets/
│           │   │   └── test/
│           │   │       ├── Ability.test.ets
│           │   │       └── List.test.ets
│           │   └── module.json5
│           └── test/
│               ├── List.test.ets
│               └── LocalUnit.test.ets
├── INSTALL.md
├── LICENSE
├── README.md
└── iOS/
    ├── AntMarkdown/
    │   ├── .ruby-version
    │   ├── .travis.yml
    │   ├── AntMarkdown.xcodeproj/
    │   │   └── project.pbxproj
    │   ├── Makefile
    │   ├── Resources/
    │   │   ├── AntMarkdown.bundle/
    │   │   │   └── Images.xcassets/
    │   │   │       └── Contents.json
    │   │   └── mathFonts.bundle/
    │   │       ├── xits-math.otf
    │   │       └── xits-math.plist
    │   ├── Scripts/
    │   │   └── inject.ini
    │   ├── Sources/
    │   │   ├── External/
    │   │   │   ├── CocoaMarkdown/
    │   │   │   │   ├── CMAttributeRun.h
    │   │   │   │   ├── CMAttributeRun.m
    │   │   │   │   ├── CMAttributedStringRenderer.h
    │   │   │   │   ├── CMAttributedStringRenderer.m
    │   │   │   │   ├── CMAttributedStringRenderer_Private.h
    │   │   │   │   ├── CMBlockTextAttachment.h
    │   │   │   │   ├── CMBlockTextAttachment.m
    │   │   │   │   ├── CMCascadingAttributeStack.h
    │   │   │   │   ├── CMCascadingAttributeStack.m
    │   │   │   │   ├── CMDocument+AttributedStringAdditions.h
    │   │   │   │   ├── CMDocument+AttributedStringAdditions.m
    │   │   │   │   ├── CMDocument+HTMLAdditions.h
    │   │   │   │   ├── CMDocument+HTMLAdditions.m
    │   │   │   │   ├── CMDocument.h
    │   │   │   │   ├── CMDocument.m
    │   │   │   │   ├── CMDocument_Private.h
    │   │   │   │   ├── CMHTMLElement.h
    │   │   │   │   ├── CMHTMLElement.m
    │   │   │   │   ├── CMHTMLElementTransformer.h
    │   │   │   │   ├── CMHTMLRenderer.h
    │   │   │   │   ├── CMHTMLRenderer.m
    │   │   │   │   ├── CMHTMLScriptTransformer.h
    │   │   │   │   ├── CMHTMLScriptTransformer.m
    │   │   │   │   ├── CMHTMLScriptTransformer_Private.h
    │   │   │   │   ├── CMHTMLStrikethroughTransformer.h
    │   │   │   │   ├── CMHTMLStrikethroughTransformer.m
    │   │   │   │   ├── CMHTMLSubscriptTransformer.h
    │   │   │   │   ├── CMHTMLSubscriptTransformer.m
    │   │   │   │   ├── CMHTMLSuperscriptTransformer.h
    │   │   │   │   ├── CMHTMLSuperscriptTransformer.m
    │   │   │   │   ├── CMHTMLUnderlineTransformer.h
    │   │   │   │   ├── CMHTMLUnderlineTransformer.m
    │   │   │   │   ├── CMHTMLUtilities.h
    │   │   │   │   ├── CMHTMLUtilities.m
    │   │   │   │   ├── CMHorizontalRuleAttachment.h
    │   │   │   │   ├── CMHorizontalRuleAttachment.m
    │   │   │   │   ├── CMImageTextAttachment.h
    │   │   │   │   ├── CMImageTextAttachment.m
    │   │   │   │   ├── CMInlineTextAttachment.h
    │   │   │   │   ├── CMInlineTextAttachment.m
    │   │   │   │   ├── CMIterator.h
    │   │   │   │   ├── CMIterator.m
    │   │   │   │   ├── CMNode+Table.h
    │   │   │   │   ├── CMNode+Table.m
    │   │   │   │   ├── CMNode.h
    │   │   │   │   ├── CMNode.m
    │   │   │   │   ├── CMNode_Private.h
    │   │   │   │   ├── CMParser.h
    │   │   │   │   ├── CMParser.m
    │   │   │   │   ├── CMPlatformDefines.h
    │   │   │   │   ├── CMStack.h
    │   │   │   │   ├── CMStack.m
    │   │   │   │   ├── CMTaskCheckAttachment+Private.h
    │   │   │   │   ├── CMTaskCheckAttachment.h
    │   │   │   │   ├── CMTaskCheckAttachment.m
    │   │   │   │   ├── CMTextAttributes.h
    │   │   │   │   ├── CMTextAttributes.m
    │   │   │   │   ├── CocoaMarkdown.h
    │   │   │   │   └── Info.plist
    │   │   │   ├── Ono/
    │   │   │   │   ├── ONOXMLDocument.h
    │   │   │   │   ├── ONOXMLDocument.m
    │   │   │   │   └── Ono.h
    │   │   │   ├── cmark-gfm/
    │   │   │   │   ├── cmark-gfm_export.h
    │   │   │   │   ├── cmark-gfm_version.h
    │   │   │   │   ├── config.h
    │   │   │   │   ├── extensions/
    │   │   │   │   │   ├── CMakeLists.txt
    │   │   │   │   │   ├── autolink.c
    │   │   │   │   │   ├── autolink.h
    │   │   │   │   │   ├── cmark-gfm-core-extensions.h
    │   │   │   │   │   ├── core-extensions.c
    │   │   │   │   │   ├── emoji.c
    │   │   │   │   │   ├── emoji.h
    │   │   │   │   │   ├── ext_scanners.c
    │   │   │   │   │   ├── ext_scanners.h
    │   │   │   │   │   ├── ext_scanners.re
    │   │   │   │   │   ├── math_mark.c
    │   │   │   │   │   ├── math_mark.h
    │   │   │   │   │   ├── strikethrough.c
    │   │   │   │   │   ├── strikethrough.h
    │   │   │   │   │   ├── table.c
    │   │   │   │   │   ├── table.h
    │   │   │   │   │   ├── tagfilter.c
    │   │   │   │   │   ├── tagfilter.h
    │   │   │   │   │   ├── tasklist.c
    │   │   │   │   │   └── tasklist.h
    │   │   │   │   └── src/
    │   │   │   │       ├── CMakeLists.txt
    │   │   │   │       ├── arena.c
    │   │   │   │       ├── blocks.c
    │   │   │   │       ├── buffer.c
    │   │   │   │       ├── buffer.h
    │   │   │   │       ├── case_fold_switch.inc
    │   │   │   │       ├── chunk.h
    │   │   │   │       ├── cmark-gfm-extension_api.h
    │   │   │   │       ├── cmark-gfm.h
    │   │   │   │       ├── cmark-gfm_version.h.in
    │   │   │   │       ├── cmark.c
    │   │   │   │       ├── cmark_ctype.c
    │   │   │   │       ├── cmark_ctype.h
    │   │   │   │       ├── commonmark.c
    │   │   │   │       ├── config.h.in
    │   │   │   │       ├── entities.inc
    │   │   │   │       ├── footnotes.c
    │   │   │   │       ├── footnotes.h
    │   │   │   │       ├── houdini.h
    │   │   │   │       ├── houdini_href_e.c
    │   │   │   │       ├── houdini_html_e.c
    │   │   │   │       ├── houdini_html_u.c
    │   │   │   │       ├── html.c
    │   │   │   │       ├── html.h
    │   │   │   │       ├── inlines.c
    │   │   │   │       ├── inlines.h
    │   │   │   │       ├── iterator.c
    │   │   │   │       ├── iterator.h
    │   │   │   │       ├── latex.c
    │   │   │   │       ├── libcmark-gfm.pc.in
    │   │   │   │       ├── linked_list.c
    │   │   │   │       ├── man.c
    │   │   │   │       ├── map.c
    │   │   │   │       ├── map.h
    │   │   │   │       ├── node.c
    │   │   │   │       ├── node.h
    │   │   │   │       ├── parser.h
    │   │   │   │       ├── plaintext.c
    │   │   │   │       ├── plugin.c
    │   │   │   │       ├── plugin.h
    │   │   │   │       ├── references.c
    │   │   │   │       ├── references.h
    │   │   │   │       ├── registry.c
    │   │   │   │       ├── registry.h
    │   │   │   │       ├── render.c
    │   │   │   │       ├── render.h
    │   │   │   │       ├── scanners.c
    │   │   │   │       ├── scanners.h
    │   │   │   │       ├── scanners.re
    │   │   │   │       ├── syntax_extension.c
    │   │   │   │       ├── syntax_extension.h
    │   │   │   │       ├── utf8.c
    │   │   │   │       ├── utf8.h
    │   │   │   │       └── xml.c
    │   │   │   └── iosMath/
    │   │   │       ├── IosMath.h
    │   │   │       ├── lib/
    │   │   │       │   ├── MTMathAtomFactory.h
    │   │   │       │   ├── MTMathAtomFactory.m
    │   │   │       │   ├── MTMathList.h
    │   │   │       │   ├── MTMathList.m
    │   │   │       │   ├── MTMathListBuilder.h
    │   │   │       │   ├── MTMathListBuilder.m
    │   │   │       │   ├── MTMathListIndex.h
    │   │   │       │   ├── MTMathListIndex.m
    │   │   │       │   ├── MTUnicode.h
    │   │   │       │   └── MTUnicode.m
    │   │   │       └── render/
    │   │   │           ├── MTConfig.h
    │   │   │           ├── MTFont.h
    │   │   │           ├── MTFont.m
    │   │   │           ├── MTFontManager.h
    │   │   │           ├── MTFontManager.m
    │   │   │           ├── MTLabel.h
    │   │   │           ├── MTLabel.m
    │   │   │           ├── MTMathListDisplay.h
    │   │   │           ├── MTMathListDisplay.m
    │   │   │           ├── MTMathUILabel.h
    │   │   │           ├── MTMathUILabel.m
    │   │   │           ├── NSBezierPath+addLineToPoint.h
    │   │   │           ├── NSBezierPath+addLineToPoint.m
    │   │   │           ├── NSColor+HexString.h
    │   │   │           ├── NSColor+HexString.m
    │   │   │           ├── NSView+backgroundColor.h
    │   │   │           ├── NSView+backgroundColor.m
    │   │   │           ├── UIColor+HexString.h
    │   │   │           ├── UIColor+HexString.m
    │   │   │           └── internal/
    │   │   │               ├── MTFont+Internal.h
    │   │   │               ├── MTFontMathTable.h
    │   │   │               ├── MTFontMathTable.m
    │   │   │               ├── MTMathListDisplayInternal.h
    │   │   │               ├── MTTypesetter.h
    │   │   │               └── MTTypesetter.m
    │   │   └── Public/
    │   │       ├── AMAttributedStringRenderer.h
    │   │       ├── AMAttributedStringRenderer.m
    │   │       ├── AMBlockMathAttachment.h
    │   │       ├── AMBlockMathAttachment.m
    │   │       ├── AMCodeHighlighter.h
    │   │       ├── AMCodeHighlighter.m
    │   │       ├── AMCodeViewAttachment.h
    │   │       ├── AMCodeViewAttachment.m
    │   │       ├── AMDrawable.h
    │   │       ├── AMDrawable.m
    │   │       ├── AMEmojiManager.h
    │   │       ├── AMEmojiManager.m
    │   │       ├── AMGradient.h
    │   │       ├── AMGradient.m
    │   │       ├── AMGradientLayer.h
    │   │       ├── AMGradientLayer.m
    │   │       ├── AMGradientView.h
    │   │       ├── AMGradientView.m
    │   │       ├── AMHTMLTransformer.h
    │   │       ├── AMHTMLTransformer.m
    │   │       ├── AMIconAttachment.h
    │   │       ├── AMIconAttachment.m
    │   │       ├── AMIconLinkAttachment.h
    │   │       ├── AMIconLinkAttachment.m
    │   │       ├── AMImageTextAttachment.h
    │   │       ├── AMImageTextAttachment.m
    │   │       ├── AMInlineMathAttachment.h
    │   │       ├── AMInlineMathAttachment.m
    │   │       ├── AMLayoutManager+Quote.h
    │   │       ├── AMLayoutManager+Quote.m
    │   │       ├── AMLayoutManager.h
    │   │       ├── AMLayoutManager.m
    │   │       ├── AMMarkDownTableViewBlowUpControllerViewController.h
    │   │       ├── AMMarkDownTableViewBlowUpControllerViewController.m
    │   │       ├── AMMarkdownCodeView.h
    │   │       ├── AMMarkdownCodeView.m
    │   │       ├── AMMarkdownTableLayout.h
    │   │       ├── AMMarkdownTableLayout.m
    │   │       ├── AMMarkdownTableView.h
    │   │       ├── AMMarkdownTableView.m
    │   │       ├── AMTableViewAttachment.h
    │   │       ├── AMTableViewAttachment.m
    │   │       ├── AMTextBackground.h
    │   │       ├── AMTextBackground.m
    │   │       ├── AMTextStyles.h
    │   │       ├── AMTextStyles.m
    │   │       ├── AMUnderline.h
    │   │       ├── AMUnderline.m
    │   │       ├── AMUtils.h
    │   │       ├── AMUtils.m
    │   │       ├── AMViewAttachment.h
    │   │       ├── AMViewAttachment.m
    │   │       ├── AntMarkdown.h
    │   │       ├── NSMutableAttributedString+AntMarkdown.h
    │   │       ├── NSMutableAttributedString+AntMarkdown.m
    │   │       ├── NSString+AntMarkdown.h
    │   │       ├── NSString+AntMarkdown.m
    │   │       ├── UILabel+AntMarkdown.h
    │   │       ├── UILabel+AntMarkdown.m
    │   │       ├── UITextView+AntMarkdown.h
    │   │       └── UITextView+AntMarkdown.m
    │   ├── SupportingFiles/
    │   │   ├── AntMarkdown-Framework.plist
    │   │   ├── AntMarkdown-Info.plist
    │   │   ├── AntMarkdown-Prefix.pch
    │   │   └── en.lproj/
    │   │       └── InfoPlist.strings
    │   └── project.yml
    ├── FluidMarkdown/
    │   ├── AppDelegate.h
    │   ├── AppDelegate.m
    │   ├── Assets.xcassets/
    │   │   ├── AccentColor.colorset/
    │   │   │   └── Contents.json
    │   │   ├── AppIcon.appiconset/
    │   │   │   └── Contents.json
    │   │   └── Contents.json
    │   ├── Base.lproj/
    │   │   ├── LaunchScreen.storyboard
    │   │   └── Main.storyboard
    │   ├── Example/
    │   │   ├── AIChatViewController.h
    │   │   ├── AIChatViewController.m
    │   │   ├── MenuViewController.h
    │   │   ├── MenuViewController.m
    │   │   ├── StreamPreviewViewController.h
    │   │   ├── StreamPreviewViewController.m
    │   │   ├── ToastView.h
    │   │   └── ToastView.m
    │   ├── Info.plist
    │   ├── SceneDelegate.h
    │   ├── SceneDelegate.m
    │   ├── Sources/
    │   │   ├── API/
    │   │   │   └── AMXMarkdownWidget.h
    │   │   ├── Markdown/
    │   │   │   ├── AMTextStyles+CardUIPlugins.h
    │   │   │   ├── AMTextStyles+CardUIPlugins.m
    │   │   │   ├── AMXFootnodeBuilder.h
    │   │   │   ├── AMXFootnodeBuilder.m
    │   │   │   ├── AMXMarkdownCodeView.h
    │   │   │   ├── AMXMarkdownCodeView.m
    │   │   │   ├── AMXMarkdownCodeViewAttachment.h
    │   │   │   ├── AMXMarkdownCodeViewAttachment.m
    │   │   │   ├── AMXMarkdownCustomRenderEventModel.h
    │   │   │   ├── AMXMarkdownCustomRenderEventModel.m
    │   │   │   ├── AMXMarkdownHelper.h
    │   │   │   ├── AMXMarkdownHelper.m
    │   │   │   ├── AMXMarkdownImageAttachmentBuilder.h
    │   │   │   ├── AMXMarkdownImageAttachmentBuilder.m
    │   │   │   ├── AMXMarkdownImageTextAttachment.h
    │   │   │   ├── AMXMarkdownImageTextAttachment.m
    │   │   │   ├── AMXMarkdownLogModel.h
    │   │   │   ├── AMXMarkdownLogModel.m
    │   │   │   ├── AMXMarkdownTextView.h
    │   │   │   ├── AMXMarkdownTextView.m
    │   │   │   ├── AMXMarkdownTimer.h
    │   │   │   └── AMXMarkdownTimer.m
    │   │   ├── Style/
    │   │   │   ├── AMXMarkdownStyle.h
    │   │   │   ├── AMXMarkdownStyle.m
    │   │   │   ├── AMXRenderService.h
    │   │   │   └── AMXRenderService.m
    │   │   └── Util/
    │   │       ├── AMXMarkdownDefine.h
    │   │       ├── AMXMarkdownUtil.h
    │   │       └── AMXMarkdownUtil.m
    │   ├── ViewController.h
    │   ├── ViewController.m
    │   └── main.m
    ├── FluidMarkdown.xcodeproj/
    │   ├── project.pbxproj
    │   └── project.xcworkspace/
    │       └── contents.xcworkspacedata
    ├── FluidMarkdown.xcworkspace/
    │   └── contents.xcworkspacedata
    └── Resources/
        ├── AntMarkdown.bundle/
        │   └── Images.xcassets/
        │       └── Contents.json
        ├── data1.txt
        ├── data2.txt
        ├── data3.txt
        └── mathFonts.bundle/
            ├── xits-math.otf
            └── xits-math.plist
Download .txt
Showing preview only (434K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (5266 symbols across 510 files)

FILE: Android/AntFluid/app-sample/src/main/java/com/fluid/markdown/MyImageHandler.java
  class MyImageHandler (line 23) | public class MyImageHandler implements ImageHandler {
    method loadImage (line 24) | @Override
    method loadDrawableResource (line 42) | private static Drawable loadDrawableResource(Context context, String u...
    method getResourceIdByName (line 68) | private static int getResourceIdByName(String packageName, String clas...
    method loadImage (line 89) | @Override
    method loadImageSync (line 106) | @Override
    method loadImageSync (line 119) | @Override

FILE: Android/AntFluid/app-sample/src/main/java/com/fluid/markdown/demos/ListActivity.java
  class ListActivity (line 13) | public class ListActivity extends AppCompatActivity {
    method onCreate (line 16) | @Override

FILE: Android/AntFluid/app-sample/src/main/java/com/fluid/markdown/demos/MarkdownData.java
  class MarkdownData (line 5) | public class MarkdownData {
    method MarkdownData (line 9) | public MarkdownData(String content) {

FILE: Android/AntFluid/app-sample/src/main/java/com/fluid/markdown/demos/MarkdownHolder.java
  class MarkdownHolder (line 13) | public class MarkdownHolder extends RecyclerView.ViewHolder {
    method MarkdownHolder (line 16) | public MarkdownHolder(@NonNull View itemView) {
    method bind (line 24) | public void bind(MarkdownData markdownData) {

FILE: Android/AntFluid/app-sample/src/main/java/com/fluid/markdown/demos/MarkwonListAdapter.java
  class MarkwonListAdapter (line 15) | public class MarkwonListAdapter extends RecyclerView.Adapter<MarkdownHol...
    method onCreateViewHolder (line 18) | @NonNull
    method getItemCount (line 26) | @Override
    method onBindViewHolder (line 31) | @Override
    method addData (line 36) | public void addData(MarkdownData markdownData) {

FILE: Android/AntFluid/app-sample/src/main/java/com/fluid/markdown/demos/PrinterActivity.java
  class PrinterActivity (line 19) | public class PrinterActivity extends AppCompatActivity {
    method onCreate (line 24) | @Override

FILE: Android/AntFluid/fluid-markdown/src/androidTest/java/com/fluid/afm/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 18) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 20) | @Test

FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/AFMInitializer.java
  class AFMInitializer (line 12) | public class AFMInitializer {
    method init (line 13) | public static void init(Context context,

FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/ElementClickEventCallback.java
  type ElementClickEventCallback (line 11) | public interface ElementClickEventCallback {
    method onLinkClicked (line 17) | default boolean onLinkClicked(Map<String, Object> params) { return fal...
    method onFootnoteClicked (line 18) | default void onFootnoteClicked(String index) { }
    method onImageClicked (line 20) | default void onImageClicked(String url, String description) {}
    method onTextClickableSpanClicked (line 21) | default boolean onTextClickableSpanClicked(View widget, String link, S...
    method exposureSpmBehavior (line 23) | default void exposureSpmBehavior(List<EventModel> models) {}

FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/MarkdownParser.java
  class MarkdownParser (line 32) | public class MarkdownParser {
    method MarkdownParser (line 42) | public MarkdownParser(Context context, List<AbstractMarkwonPlugin> plu...
    method updateMarkdownStyles (line 48) | public void updateMarkdownStyles(MarkdownStyles styles) {
    method updateTextViewStyle (line 63) | private void updateTextViewStyle(MarkdownStyles styles) {
    method setPrintingState (line 83) | public void setPrintingState(boolean isPrinting) {
    method init (line 93) | private void init(final Context context, List<AbstractMarkwonPlugin> c...
    method getDefaultPlugins (line 114) | private ArrayList<AbstractMarkwonPlugin> getDefaultPlugins(final Conte...
    method getTextView (line 142) | public TextView getTextView() {
    method setTextSetter (line 146) | public void setTextSetter(Markwon.TextSetter setter) {
    method getMarkwon (line 150) | public Markwon getMarkwon() {

FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/MarkdownParserFactory.java
  class MarkdownParserFactory (line 53) | public class MarkdownParserFactory {
    method create (line 56) | public static MarkdownParser create(Context context, PrinterMarkDownTe...
    method bindMarkdownParser (line 60) | public static void bindMarkdownParser(Context context, PrinterMarkDown...
    method create (line 64) | public static MarkdownParser create(Context context, PrinterMarkDownTe...
    method getPlugins (line 69) | public static ArrayList<AbstractMarkwonPlugin> getPlugins(Context cont...
    method getDefaultPlugins (line 78) | public static ArrayList<AbstractMarkwonPlugin> getDefaultPlugins(Conte...
    method createJLatexMathPlugin (line 96) | public static AbstractMarkwonPlugin createJLatexMathPlugin(Context con...
    method createTaskListPlugin (line 118) | public static AbstractMarkwonPlugin createTaskListPlugin(Context conte...
    method createSyntaxHighlightPlugin (line 122) | public static AbstractMarkwonPlugin createSyntaxHighlightPlugin() {
    method createStrikethroughPlugin (line 126) | public static AbstractMarkwonPlugin createStrikethroughPlugin() {
    method definitationPlugin (line 130) | public static AbstractMarkwonPlugin definitationPlugin() {
    method linkPlugin (line 134) | public static AbstractMarkwonPlugin linkPlugin(ElementClickEventCallba...
    method imagePlugin (line 149) | public static ImagesPlugin imagePlugin(Context context, ElementClickEv...
    method htmlPlugin (line 167) | public static AbstractMarkwonPlugin htmlPlugin(Context context, TextVi...
    method printStreamPlugin (line 176) | public static AbstractMarkwonPlugin printStreamPlugin(Context context,...

FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/code/CodeBlockPlugin.java
  class CodeBlockPlugin (line 22) | public class CodeBlockPlugin extends AbstractMarkwonPlugin {
    method CodeBlockPlugin (line 28) | CodeBlockPlugin(@NonNull Context context, boolean showCodeBlockHeader) {
    method processMarkdown (line 32) | @NonNull
    method configureSpansFactory (line 38) | @Override
    method configureVisitor (line 51) | @Override
    method create (line 56) | public static CodeBlockPlugin create(Context context, boolean showCode...
  class BlockHandlerNoAdditionalNewLines (line 61) | class BlockHandlerNoAdditionalNewLines implements MarkwonVisitor.BlockHa...
    method BlockHandlerNoAdditionalNewLines (line 63) | public BlockHandlerNoAdditionalNewLines() {
    method blockStart (line 66) | @Override
    method blockEnd (line 72) | @Override

FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/html/CustomHtmlPlugin.java
  class CustomHtmlPlugin (line 18) | public class CustomHtmlPlugin extends HtmlPlugin {
    method CustomHtmlPlugin (line 21) | CustomHtmlPlugin() {
    method create (line 25) | public static CustomHtmlPlugin create() {
    method processMarkdown (line 29) | @NonNull
    method beforeSetText (line 39) | @Override
    method modifyHighlightData (line 60) | private String modifyHighlightData(String markdown) {
    method appendPoiAndRelatedEntityData (line 106) | private String appendPoiAndRelatedEntityData(String markdown) {
    method handleFormulaCompat (line 147) | private String handleFormulaCompat(String markdown) {

FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/html/CustomIndentSpan.java
  class CustomIndentSpan (line 8) | public class CustomIndentSpan implements LeadingMarginSpan {
    method CustomIndentSpan (line 12) | public CustomIndentSpan(int indent) {
    method CustomIndentSpan (line 16) | public CustomIndentSpan(int indent, int firstLineIndent) {
    method getLeadingMargin (line 22) | @Override
    method drawLeadingMargin (line 27) | @Override

FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/html/CustomUnderlineSpan.java
  class CustomUnderlineSpan (line 10) | public class CustomUnderlineSpan extends ReplacementSpan {
    method CustomUnderlineSpan (line 16) | public CustomUnderlineSpan(int color, float thickness) {
    method getSize (line 21) | @Override
    method draw (line 26) | @Override

FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/html/HtmlMarkTagHandler.java
  class HtmlMarkTagHandler (line 30) | public class HtmlMarkTagHandler extends SimpleTagHandler {
    method HtmlMarkTagHandler (line 37) | public HtmlMarkTagHandler() {
    method getSpans (line 40) | @Override
    method supportedTags (line 125) | @NonNull

FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/html/HtmlParaTagHandler.java
  class HtmlParaTagHandler (line 24) | public class HtmlParaTagHandler extends SimpleTagHandler {
    method HtmlParaTagHandler (line 31) | public HtmlParaTagHandler(Context context) {
    method getSpans (line 35) | @Nullable
    method supportedTags (line 100) | @NonNull

FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/html/HtmlSpanTagHandler.java
  class HtmlSpanTagHandler (line 33) | public class HtmlSpanTagHandler extends TagHandler {
    method HtmlSpanTagHandler (line 47) | public HtmlSpanTagHandler(Context context, ElementClickEventCallback c...
    method handleInner (line 52) | private void handleInner(@NonNull MarkwonVisitor visitor,
    method handle (line 62) | @Override
    method handleSpans (line 69) | public void handleSpans(@NonNull MarkwonVisitor visitor,
    method supportedTags (line 142) | @NonNull
    method setClassPoiSpans (line 152) | private void setClassPoiSpans(@NonNull MarkwonVisitor visitor, @NonNul...
    method setClassRelatedEntitySpans (line 190) | private void setClassRelatedEntitySpans(@NonNull MarkwonVisitor visito...
    method getPoiSuperscriptDrawable (line 225) | private Drawable getPoiSuperscriptDrawable() {
    method getRelatedEntitySuperscriptDrawable (line 232) | private Drawable getRelatedEntitySuperscriptDrawable() {

FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/html/SpanTextClickableSpan.java
  class SpanTextClickableSpan (line 12) | public class SpanTextClickableSpan extends URLSpan {
    method SpanTextClickableSpan (line 20) | public SpanTextClickableSpan(ClickableTextType type, String url, Strin...
    method updateDrawState (line 28) | @Override
    method onClick (line 34) | @Override
    type ClickableTextType (line 45) | public enum ClickableTextType {

FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/html/TextHeightBackgroundSpan.java
  class TextHeightBackgroundSpan (line 11) | public class TextHeightBackgroundSpan extends ReplacementSpan {
    method TextHeightBackgroundSpan (line 15) | public TextHeightBackgroundSpan(int backgroundColor) {
    method getSize (line 19) | @Override
    method draw (line 24) | @Override

FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/icon/IconSpan.java
  class IconSpan (line 18) | public class IconSpan extends ReplacementSpan implements View.OnAttachSt...
    method IconSpan (line 25) | public IconSpan(TextView textView, String imageUrl) {
    method getSize (line 31) | @Override
    method fetchImage (line 46) | private void fetchImage(int size) {
    method draw (line 56) | @Override
    method onViewAttachedToWindow (line 67) | @Override
    method onViewDetachedFromWindow (line 72) | @Override

FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/icon/IconSpanHandler.java
  class IconSpanHandler (line 14) | public class IconSpanHandler extends TagHandler {
    method IconSpanHandler (line 17) | public IconSpanHandler(TextView textView) {
    method handle (line 21) | @Override
    method supportedTags (line 33) | @Override

FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/iconlink/IconLinkSpan.java
  class IconLinkSpan (line 22) | public class IconLinkSpan extends ReplacementSpan implements LineHeightS...
    method IconLinkSpan (line 49) | public IconLinkSpan(TextView textView, String imageUrl, int background...
    method getSize (line 59) | @Override
    method fetchImage (line 96) | private void fetchImage(int size) {
    method draw (line 106) | @Override
    method chooseHeight (line 156) | @Override
    method updateDrawState (line 175) | @Override
    method onViewAttachedToWindow (line 180) | @Override
    method onViewDetachedFromWindow (line 185) | @Override
    method getUrl (line 193) | @Override
    method getType (line 198) | @Override
    method getTop (line 203) | @Override
    method getBottom (line 208) | @Override

FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/iconlink/IconLinkSpanHandler.java
  class IconLinkSpanHandler (line 29) | public class IconLinkSpanHandler extends TagHandler {
    method IconLinkSpanHandler (line 33) | public IconLinkSpanHandler(TextView textView, @Nullable ElementClickEv...
    method handle (line 38) | @Override
    method supportedTags (line 95) | @Override

FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/image/CustomImageSpan.java
  class CustomImageSpan (line 8) | public class CustomImageSpan extends SuperscriptImageSpan {
    method CustomImageSpan (line 10) | public CustomImageSpan(Drawable drawable) {
    method draw (line 14) | @Override
    method isSelf (line 21) | private static boolean isSelf(int start, int end, CharSequence text, O...

FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/image/FootnoteClickSpan.java
  class FootnoteClickSpan (line 11) | public class FootnoteClickSpan extends ClickableSpan {
    method FootnoteClickSpan (line 15) | public FootnoteClickSpan(String indexSequence, ElementClickEventCallba...
    method onClick (line 20) | @SuppressLint("ClickableViewAccessibility")

FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/image/FootnoteSpan.java
  class FootnoteSpan (line 15) | public class FootnoteSpan extends ReplacementSpan {
    method FootnoteSpan (line 21) | public FootnoteSpan(String indexSequence, FootnoteStyle style) {
    method getSize (line 26) | @Override
    method draw (line 48) | @Override

FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/image/SuperscriptImageSpan.java
  class SuperscriptImageSpan (line 12) | public class SuperscriptImageSpan extends ImageSpan {
    method SuperscriptImageSpan (line 16) | public SuperscriptImageSpan(@NonNull Drawable drawable) {
    method SuperscriptImageSpan (line 20) | public SuperscriptImageSpan(Drawable drawable, int verticalAlignment) {
    method draw (line 24) | @Override

FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/list/DefinitionListPlugin.java
  class DefinitionListPlugin (line 14) | public class DefinitionListPlugin extends AbstractMarkwonPlugin {
    method processMarkdown (line 18) | @Override
    method hasDefinitionList (line 35) | private boolean hasDefinitionList(String markdown) {
    method processDefinitionList (line 66) | private String processDefinitionList(String markdown, long startTime) {
    method findDefinitionListEnd (line 102) | private int findDefinitionListEnd(String[] lines, int startIndex) {
    method isDefinitionListLine (line 139) | private boolean isDefinitionListLine(String line) {
    method isOtherMarkdownFormat (line 147) | private boolean isOtherMarkdownFormat(String line) {
    method findDefinitionListStart (line 152) | private int findDefinitionListStart(String[] lines, int startIndex) {
    method processDefinitionListSection (line 165) | private void processDefinitionListSection(String[] lines, int start, i...
    method isMarkdownHeader (line 192) | private boolean isMarkdownHeader(String line) {
    method isMarkdownList (line 196) | private boolean isMarkdownList(String line) {
    method isCodeBlock (line 200) | private boolean isCodeBlock(String line) {
    method isHorizontalRule (line 204) | private boolean isHorizontalRule(String line) {
    method hasMarkdownTable (line 208) | private boolean hasMarkdownTable(String markdown) {
    method create (line 222) | public static DefinitionListPlugin create() {

FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/model/EventModel.java
  class EventModel (line 7) | public class EventModel {
    method EventModel (line 13) | public EventModel(String type, String url, String content, boolean vis...
    method toString (line 20) | @NonNull
    method equals (line 31) | @Override

FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/span/LinkClickSpan.java
  class LinkClickSpan (line 26) | public class LinkClickSpan extends URLSpan implements IClickableSpan, Li...
    method LinkClickSpan (line 38) | public LinkClickSpan(String url, RenderProps props, MarkwonTheme theme...
    method onClick (line 51) | @Override
    method updateDrawState (line 64) | @Override
    method getUrl (line 70) | @Override
    method getType (line 75) | @Override
    method getTop (line 80) | @Override
    method getBottom (line 85) | @Override
    method drawBackground (line 90) | @Override

FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/span/OpacitySpan.java
  class OpacitySpan (line 7) | public class OpacitySpan extends CharacterStyle
    method OpacitySpan (line 12) | public OpacitySpan(int opacity) {
    method updateDrawState (line 16) | @Override

FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/text/AfmTextPlugin.java
  class AfmTextPlugin (line 30) | public class AfmTextPlugin extends AbstractMarkwonPlugin {
    method AfmTextPlugin (line 36) | public AfmTextPlugin(Context context) {
    method setCustomClickListener (line 41) | public AfmTextPlugin setCustomClickListener(ElementClickEventCallback ...
    method configureVisitor (line 46) | public void configureVisitor(@NonNull MarkwonVisitor.Builder builder) {
    method getEmoji (line 98) | private String getEmoji(String emojiCode) {
    method processMarkdown (line 106) | @androidx.annotation.NonNull

FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/text/FootnoteInTableSpan.java
  class FootnoteInTableSpan (line 10) | public class FootnoteInTableSpan extends ReplacementSpan {
    method FootnoteInTableSpan (line 13) | public FootnoteInTableSpan(String index) {
    method getSize (line 17) | @Override
    method draw (line 22) | @Override

FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/text/RoundedBackgroundSpan.java
  class RoundedBackgroundSpan (line 14) | public class RoundedBackgroundSpan extends ReplacementSpan {
    method RoundedBackgroundSpan (line 22) | public RoundedBackgroundSpan(MarkwonTheme theme, float cornerRadius) {
    method getSize (line 31) | @Override
    method draw (line 36) | @Override
    method isSelf (line 72) | private static boolean isSelf(int start, int end, CharSequence text, O...
    method measureTextWidth (line 78) | private float measureTextWidth(Paint paint, CharSequence text, int sta...

FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/widget/PrinterMarkDownTextView.java
  class PrinterMarkDownTextView (line 47) | public class PrinterMarkDownTextView extends AppCompatTextView implement...
    method PrinterMarkDownTextView (line 79) | public PrinterMarkDownTextView(Context context) {
    method PrinterMarkDownTextView (line 83) | public PrinterMarkDownTextView(Context context, AttributeSet attrs) {
    method PrinterMarkDownTextView (line 87) | public PrinterMarkDownTextView(Context context, AttributeSet attrs, in...
    method init (line 106) | public void init(@NonNull MarkdownStyles styles, ElementClickEventCall...
    method setPrintParams (line 112) | public void setPrintParams(int interval, int chunkSize) {
    method handleExposureSpm (line 121) | public void handleExposureSpm() {
    method setMarkdownText (line 125) | public void setMarkdownText(@NonNull String markdown) {
    method startPrinting (line 135) | public void startPrinting(String content) {
    method isStarted (line 139) | public boolean isStarted() {
    method startPrinting (line 143) | public void startPrinting(String content, int startIndex) {
    method appendPrinting (line 178) | public void appendPrinting(String content) {
    method appendPrinting (line 182) | public void appendPrinting(String content, boolean append) {
    method setPrintData (line 203) | public void setPrintData(MarkDownPrintData printData) {
    method getPrintData (line 207) | public MarkDownPrintData getPrintData() {
    method stopPrinting (line 211) | public void stopPrinting(String endMessage) {
    method restore (line 245) | public void restore(MarkDownPrintData markDownData) {
    method setSizeChangedListener (line 269) | public void setSizeChangedListener(SizeChangedListener listener) {
    method setPrintingEventListener (line 273) | public void setPrintingEventListener(PrintingEventListener listener) {
    method pause (line 277) | public void pause() {
    method resume (line 290) | public void resume() {
    method resume (line 294) | public void resume(int index) {
    method onMeasure (line 313) | @Override
    method printing (line 328) | private void printing(int start, int chunkSize) {
    method clearGradient (line 363) | private void clearGradient() {
    method gradiantColorAnimateText (line 373) | private void gradiantColorAnimateText(int endIndex, SpannableStringBui...
    method handleSpan (line 394) | private SpannableStringBuilder handleSpan(SpannableStringBuilder sourc...
    method handleSpan (line 398) | private SpannableStringBuilder handleSpan(SpannableStringBuilder sourc...
    method onStopPrinting (line 423) | private void onStopPrinting() {
    method setEndMessageStyle (line 429) | private void setEndMessageStyle(SpannableStringBuilder span) {
    method onDestroy (line 449) | public void onDestroy() {
    method onDestroy (line 455) | @Override
    method setMarkdownStyles (line 461) | public void setMarkdownStyles(MarkdownStyles markdownStyles) {
    method setTextSafely (line 468) | public void setTextSafely(SpannableStringBuilder spanned) {
    method setMaxWidthForMeasure (line 477) | public void setMaxWidthForMeasure(int maxWidth) {
    method getViewMaxWidth (line 481) | @Override
    method getOriginText (line 486) | @Override
    method beforeTextChanged (line 491) | @Override
    method onTextChanged (line 497) | @Override
    method afterTextChanged (line 502) | @Override
    method handleScrollerSpm (line 525) | private void handleScrollerSpm() {
    method findScroller (line 549) | private View findScroller(ViewParent child) {
    method handleSpm (line 559) | private void handleSpm() {
    method handleSpm (line 565) | private void handleSpm(IClickableSpan[] spans) {
    method getPrintIndex (line 601) | public int getPrintIndex() {
    type SizeChangedListener (line 605) | public interface SizeChangedListener {
      method onSizeChanged (line 606) | void onSizeChanged(int width, int height);
    type PrintingEventListener (line 609) | public interface PrintingEventListener {
      method onPrintStart (line 610) | void onPrintStart();
      method onPrintStop (line 612) | void onPrintStop(boolean printAll);
      method onPrintPaused (line 613) | void onPrintPaused(int index);
      method onPrintResumed (line 615) | void onPrintResumed();
    class MarkDownPrintData (line 617) | public static class MarkDownPrintData {
      method toString (line 628) | @Override

FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/ui/MarkDownPreviewActivity.java
  class MarkDownPreviewActivity (line 35) | public class MarkDownPreviewActivity extends AppCompatActivity {
    method onCreate (line 47) | @SuppressLint("SetTextI18n")
    method initLayout (line 58) | private void initLayout() {
    method initViews (line 78) | private void initViews() {
    method getIntentParams (line 91) | private boolean getIntentParams() {
    method setContent (line 111) | private void setContent(String content) {
    method onDestroy (line 146) | @Override

FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/ui/MarkdownContentAdapter.java
  class MarkdownContentAdapter (line 17) | public class MarkdownContentAdapter extends RecyclerView.Adapter<Markdow...
    method MarkdownContentAdapter (line 21) | public MarkdownContentAdapter(Markwon markwon, boolean isTable, int co...
    method setContent (line 25) | public void setContent(String content) {
    method setTableBlockNode (line 29) | public void setTableBlockNode(TableBlock block) {
    method onCreateViewHolder (line 35) | @Override
    method onBindViewHolder (line 42) | @Override
    method getItemCount (line 50) | @Override
    class ViewHolder (line 55) | static class ViewHolder extends RecyclerView.ViewHolder {
      method ViewHolder (line 58) | ViewHolder(View itemView) {

FILE: Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/ui/MarkdownTextAdapter.java
  class MarkdownTextAdapter (line 20) | public class MarkdownTextAdapter extends RecyclerView.Adapter<MarkdownTe...
    method MarkdownTextAdapter (line 29) | public MarkdownTextAdapter(Markwon markwon, boolean isTable, int colum...
    method setContent (line 41) | public void setContent(String content) {
    method setTableBlockNode (line 46) | public void setTableBlockNode(TableBlock block) {
    method onCreateViewHolder (line 51) | @Override
    method onBindViewHolder (line 78) | @Override
    method getItemCount (line 87) | @Override
    class ViewHolder (line 92) | static class ViewHolder extends RecyclerView.ViewHolder {
      method ViewHolder (line 95) | ViewHolder(View itemView) {

FILE: Android/AntFluid/fluid-markdown/src/test/java/com/fluid/afm/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test

FILE: Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/ContextHolder.java
  class ContextHolder (line 6) | public class ContextHolder {
    method setContext (line 11) | public static void setContext(Context context) {
    method getContext (line 15) | public static Context getContext() {

FILE: Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/StreamOutStateObserver.java
  type StreamOutStateObserver (line 3) | public interface StreamOutStateObserver {
    method onStreamOutStateChanged (line 5) | void onStreamOutStateChanged(boolean isStreamingOutput);

FILE: Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/func/Callback.java
  type Callback (line 3) | public interface Callback<T> {
    method onSuccess (line 10) | void onSuccess(T t);
    method onFail (line 15) | void onFail();

FILE: Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/func/IImageClickCallback.java
  type IImageClickCallback (line 4) | public interface IImageClickCallback {
    method imageClicked (line 5) | void imageClicked(String url, String description);

FILE: Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/handler/BackgroundTaskHandler.java
  type BackgroundTaskHandler (line 5) | public interface BackgroundTaskHandler {
    method execute (line 6) | void execute(Runnable runnable);
    method acquireNormalThreadPoolExecutor (line 7) | ThreadPoolExecutor acquireNormalThreadPoolExecutor();

FILE: Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/handler/DefaultLogHandler.java
  class DefaultLogHandler (line 5) | public class DefaultLogHandler implements LogHandler {
    method i (line 7) | public void i(String tag, String msg) {
    method e (line 11) | public void e(String tag, String msg) {
    method e (line 15) | public void e(String tag, Throwable tr) {
    method e (line 19) | public void e(String tag, String msg, Throwable tr) {
    method d (line 23) | public void d(String tag, String msg) {
    method v (line 27) | public void v(String tag, String msg) {
    method w (line 31) | public void w(String tag, String msg) {
    method w (line 35) | public void w(String tag, Throwable tr) {

FILE: Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/handler/DefaultTaskHandler.java
  class DefaultTaskHandler (line 9) | public class DefaultTaskHandler implements BackgroundTaskHandler{
    method execute (line 12) | @Override
    method acquireNormalThreadPoolExecutor (line 17) | @Override

FILE: Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/handler/DefualtImageHandler.java
  class DefualtImageHandler (line 17) | public class DefualtImageHandler implements ImageHandler {
    method loadImage (line 18) | @Override
    method loadImage (line 30) | @Override
    method loadImageSync (line 47) | @Override
    method loadImageSync (line 65) | @Override

FILE: Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/handler/EventHandlerManager.java
  class EventHandlerManager (line 3) | public class EventHandlerManager {
    method getBackgroundTaskHandler (line 8) | public static BackgroundTaskHandler getBackgroundTaskHandler() {
    method setBackgroundTaskHandler (line 15) | public static void setBackgroundTaskHandler(BackgroundTaskHandler back...
    method getLogHandler (line 19) | public static LogHandler getLogHandler() {
    method setLogHandler (line 26) | public static void setLogHandler(LogHandler logHandler) {
    method getImageHandler (line 30) | public static ImageHandler getImageHandler() {
    method setImageHandler (line 37) | public static void setImageHandler(ImageHandler imageHandler) {
    class TaskHandlerInstanceHolder (line 42) | private static class TaskHandlerInstanceHolder {
    class LogHandlerInstanceHolder (line 46) | private static class LogHandlerInstanceHolder {
    class ImageHandlerInstanceHolder (line 50) | private static class ImageHandlerInstanceHolder {

FILE: Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/handler/ImageHandler.java
  type ImageHandler (line 8) | public interface ImageHandler {
    method loadImage (line 9) | void loadImage(Context context, String url, final Callback<Drawable> c...
    method loadImage (line 11) | void loadImage(Context context, String url, int width, int height, fin...
    method loadImageSync (line 13) | Drawable loadImageSync(Context context, String url);
    method loadImageSync (line 15) | public Drawable loadImageSync(Context context, String raw, int width, ...

FILE: Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/handler/LogHandler.java
  type LogHandler (line 3) | public interface LogHandler {
    method i (line 4) | void i(String tag, String msg);
    method e (line 5) | void e(String tag, String msg);
    method e (line 6) | void e(String tag, Throwable tr);
    method e (line 7) | void e(String tag, String msg, Throwable tr);
    method d (line 8) | void d(String tag, String msg);
    method v (line 9) | void v(String tag, String msg);
    method w (line 10) | void w(String tag, String msg);
    method w (line 11) | void w(String tag, Throwable tr);

FILE: Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/icon/DrawableWrapper.java
  class DrawableWrapper (line 20) | public class DrawableWrapper {
    method DrawableWrapper (line 28) | public DrawableWrapper(Data data) {
    method getDrawable (line 32) | public Drawable getDrawable() {
    method load (line 36) | public void load(Context context, LoadImageCallback callback) {
    method onLoadSuccess (line 50) | public void onLoadSuccess(Drawable drawable) {
    method onLoadFailed (line 76) | public void onLoadFailed() {
    method cancel (line 81) | public void cancel(LoadImageCallback callback) {
    class Data (line 88) | public static class Data {
      method Data (line 94) | public Data(String url, int width, int height, boolean round) {
      method equals (line 101) | @Override
      method hashCode (line 109) | @Override
    class IconCallback (line 115) | private static class IconCallback implements Callback<Drawable> {
      method IconCallback (line 118) | public IconCallback(DrawableWrapper drawableWrapper) {
      method onSuccess (line 122) | @Override
      method onFail (line 129) | @Override

FILE: Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/icon/LoadIconUtil.java
  class LoadIconUtil (line 10) | public class LoadIconUtil {
    method getIcon (line 15) | public static DrawableWrapper getIcon(String url, int width, int heigh...
    method getIcon (line 28) | public static DrawableWrapper getIcon(String url, int width, int heigh...
    method check (line 41) | public static void check() {

FILE: Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/icon/LoadImageCallback.java
  class LoadImageCallback (line 11) | public class LoadImageCallback implements Callback<Drawable> {
    method LoadImageCallback (line 14) | public LoadImageCallback(TextView textView) {
    method onSuccess (line 18) | @Override
    method onFail (line 32) | @Override

FILE: Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/span/AntUnderlineSupportMulLinesSpan.java
  class AntUnderlineSupportMulLinesSpan (line 9) | public class AntUnderlineSupportMulLinesSpan extends ReplacementSpan {
    method AntUnderlineSupportMulLinesSpan (line 13) | public AntUnderlineSupportMulLinesSpan(int color, float thickness) {
    method getColor (line 18) | public int getColor() {
    method getThickness (line 22) | public float getThickness() {
    method getSize (line 26) | @Override
    method draw (line 31) | @Override

FILE: Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/span/BaseIconTextSpan.java
  class BaseIconTextSpan (line 15) | public abstract class BaseIconTextSpan extends MetricAffectingSpan imple...
    method BaseIconTextSpan (line 26) | public BaseIconTextSpan(TextView textView) {
    method updateMeasureState (line 30) | @Override
    method updateDrawState (line 35) | @Override
    method handleStyle (line 40) | private void handleStyle(TextPaint paint) {
    method fetchImage (line 48) | private void fetchImage() {
    method getImageUrl (line 65) | protected abstract String getImageUrl();
    method getIconSize (line 66) | protected int getIconSize() {
    method applyStyle (line 70) | protected abstract void applyStyle(TextPaint paint);

FILE: Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/span/CodeLanguageSpan.java
  class CodeLanguageSpan (line 3) | public class CodeLanguageSpan {
    method CodeLanguageSpan (line 6) | public CodeLanguageSpan(String language) {
    method getLanguage (line 10) | public String getLanguage() {

FILE: Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/span/HeadingTopOrBottomSpacingSpan.java
  class HeadingTopOrBottomSpacingSpan (line 13) | public class HeadingTopOrBottomSpacingSpan implements LineHeightSpan {
    method create (line 15) | @NonNull
    method HeadingTopOrBottomSpacingSpan (line 22) | public HeadingTopOrBottomSpacingSpan(@Px int spacing) {
    method chooseHeight (line 26) | @Override
    method selfEnd (line 42) | private static boolean selfEnd(int end, CharSequence text, Object span) {

FILE: Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/span/IClickableSpan.java
  type IClickableSpan (line 3) | public interface IClickableSpan {
    method getUrl (line 4) | String getUrl();
    method getType (line 5) | String getType();
    method getTop (line 7) | int getTop();
    method getBottom (line 8) | int getBottom();
    method getLiteral (line 9) | default String getLiteral() {

FILE: Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/span/LinkWithIconSpan.java
  class LinkWithIconSpan (line 20) | public class LinkWithIconSpan extends ReplacementSpan {
    method LinkWithIconSpan (line 32) | public LinkWithIconSpan(@NonNull MarkwonTheme theme) {
    method getSize (line 36) | @Override
    method applyStyle (line 47) | private void applyStyle(Paint paint) {
    method fetchImage (line 59) | private void fetchImage() {
    method draw (line 75) | @Override

FILE: Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/span/ParagraphSpacingSpan.java
  class ParagraphSpacingSpan (line 15) | public class ParagraphSpacingSpan implements LineHeightSpan {
    method create (line 17) | @NonNull
    method ParagraphSpacingSpan (line 24) | public ParagraphSpacingSpan(@Px int spacing) {
    method chooseHeight (line 28) | @Override
    method selfEnd (line 43) | private static boolean selfEnd(int end, CharSequence text, Object span) {

FILE: Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/styles/BlockQuoteStyle.java
  class BlockQuoteStyle (line 6) | public class BlockQuoteStyle {
    method create (line 19) | public static BlockQuoteStyle create() {
    method create (line 23) | public static BlockQuoteStyle create(int lineWidth, int lineColor, int...
    method lineWidth (line 27) | public BlockQuoteStyle lineWidth(int lineWidth) {
    method lineWidth (line 32) | public int lineWidth() {
    method lineColor (line 36) | public BlockQuoteStyle lineColor(int lineColor) {
    method lineColor (line 41) | public int lineColor() {
    method lineCornerRadius (line 45) | public BlockQuoteStyle lineCornerRadius(int lineCornerRadius) {
    method lineCornerRadius (line 50) | public int lineCornerRadius() {
    method lineMargin (line 54) | public BlockQuoteStyle lineMargin(int lineMargin) {
    method lineMargin (line 59) | public int lineMargin() {
    method bottomMargin (line 63) | public BlockQuoteStyle bottomMargin(int bottomMargin) {
    method bottomMargin (line 68) | public int bottomMargin() {
    method leftMargin (line 72) | public BlockQuoteStyle leftMargin(int leftMargin) {
    method leftMargin (line 77) | public int leftMargin() {
    method fontSize (line 81) | public BlockQuoteStyle fontSize(float fontSize) {
    method fontSize (line 86) | public float fontSize() {
    method fontColor (line 90) | public BlockQuoteStyle fontColor(int fontColor) {
    method fontColor (line 95) | public int fontColor() {
    method paragraphSpacing (line 99) | public BlockQuoteStyle paragraphSpacing(int paragraphSpacing) {
    method paragraphSpacing (line 104) | public int paragraphSpacing() {

FILE: Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/styles/BulletStyle.java
  class BulletStyle (line 4) | public class BulletStyle {
    method create (line 8) | public static BulletStyle create() {
    method setShape (line 12) | public BulletStyle setShape(Shape shape) {
    method leadingSpacing (line 17) | public BulletStyle leadingSpacing(int leadingSpacing) {
    method leading (line 22) | public BulletStyle leading(int leading) {
    method shape (line 27) | public Shape shape() {
    method leadingSpacing (line 31) | public int leadingSpacing() {
    method leading (line 35) | public int leading() {

FILE: Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/styles/CodeStyle.java
  class CodeStyle (line 12) | public class CodeStyle implements Parcelable {
    method CodeStyle (line 35) | public CodeStyle() {
    method CodeStyle (line 39) | protected CodeStyle(Parcel in) {
    method createFromParcel (line 61) | @Override
    method newArray (line 66) | @Override
    method create (line 72) | public static CodeStyle create() {
    method inlineBackgroundColor (line 76) | public int inlineBackgroundColor() {
    method inlineCodeBackgroundColor (line 80) | public CodeStyle inlineCodeBackgroundColor(int inlineBackgroundColor) {
    method inlineBackgroundRadius (line 85) | public int inlineBackgroundRadius() {
    method inlineCodeBackgroundRadius (line 89) | public CodeStyle inlineCodeBackgroundRadius(int inlineBackgroundRadius) {
    method isLightIcon (line 94) | public boolean isLightIcon() {
    method lightIcon (line 98) | public CodeStyle lightIcon(boolean lightIcon) {
    method inlineFontColor (line 103) | public CodeStyle inlineFontColor(int color) {
    method inlineFontColor (line 108) | public int inlineFontColor() {
    method inlinePaddingVertical (line 112) | public CodeStyle inlinePaddingVertical(int padding) {
    method inlinePaddingVertical (line 117) | public int inlinePaddingVertical() {
    method inlinePaddingHorizontal (line 121) | public CodeStyle inlinePaddingHorizontal(int padding) {
    method inlinePaddingHorizontal (line 126) | public int inlinePaddingHorizontal() {
    method codeFontColor (line 130) | public CodeStyle codeFontColor(int color) {
    method codeFontColor (line 135) | public int codeFontColor() {
    method codeFontSize (line 139) | public CodeStyle codeFontSize(int size) {
    method codeFontSize (line 144) | public int codeFontSize() {
    method codeBackgroundColor (line 148) | public CodeStyle codeBackgroundColor(int color) {
    method codeBackgroundColor (line 153) | public int codeBackgroundColor() {
    method codeBackgroundRadius (line 157) | public CodeStyle codeBackgroundRadius(int radius) {
    method codeBackgroundRadius (line 162) | public int codeBackgroundRadius() {
    method titleFontColor (line 166) | public CodeStyle titleFontColor(int color) {
    method titleFontColor (line 171) | public int titleFontColor() {
    method titleFontSize (line 175) | public CodeStyle titleFontSize(int size) {
    method titleFontSize (line 180) | public int titleFontSize() {
    method drawBorder (line 184) | public CodeStyle drawBorder(boolean drawBorder) {
    method isDrawBorder (line 189) | public boolean isDrawBorder() {
    method borderColor (line 193) | public CodeStyle borderColor(int color) {
    method borderColor (line 198) | public int borderColor() {
    method borderWidth (line 202) | public CodeStyle borderWidth(int width) {
    method borderWidth (line 210) | public int borderWidth() {
    method titleBackgroundColor (line 214) | public CodeStyle titleBackgroundColor(int color) {
    method titleBackgroundColor (line 219) | public int titleBackgroundColor() {
    method codeTypeface (line 223) | public CodeStyle codeTypeface(Typeface typeface) {
    method codeTypeface (line 228) | public Typeface codeTypeface() {
    method inlineFontSize (line 232) | public CodeStyle inlineFontSize(int size) {
    method inlineFontSize (line 237) | public int inlineFontSize() {
    method blockLeading (line 241) | public CodeStyle blockLeading(int leading) {
    method blockLeading (line 246) | public int blockLeading() {
    method isShowTitle (line 250) | public boolean isShowTitle() {
    method setShowTitle (line 254) | public void setShowTitle(boolean showTitle) {
    method describeContents (line 258) | @Override
    method writeToParcel (line 263) | @Override

FILE: Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/styles/FootnoteStyle.java
  class FootnoteStyle (line 9) | public class FootnoteStyle {
    method create (line 20) | public static FootnoteStyle create() {
    method create (line 24) | public static FootnoteStyle create(int textColor, int backgroundColor) {
    method backgroundColor (line 28) | public FootnoteStyle backgroundColor(int backgroundColor) {
    method backgroundColor (line 33) | public int backgroundColor() {
    method fontSize (line 37) | public float fontSize() {
    method size (line 41) | public FootnoteStyle size(float size) {
    method size (line 46) | public float size() {
    method fontSize (line 50) | public FootnoteStyle fontSize(float fontSize) {
    method textColor (line 55) | public FootnoteStyle textColor(int textColor) {
    method textColor (line 60) | public int textColor() {
    method isBold (line 64) | public FootnoteStyle isBold(boolean bold) {
    method isBold (line 69) | public boolean isBold() {
    method style (line 74) | public FootnoteStyle style(@Style int style) {
    method style (line 79) | @Style
    method radius (line 84) | public FootnoteStyle radius(float radius) {
    method radius (line 89) | public float radius() {

FILE: Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/styles/HorizonRuleStyle.java
  class HorizonRuleStyle (line 5) | public class HorizonRuleStyle {
    method create (line 17) | public static HorizonRuleStyle create() {
    method create (line 21) | public static HorizonRuleStyle create(int height, int color, int parag...
    method setHeight (line 30) | public HorizonRuleStyle setHeight(int height) {
    method setColor (line 35) | public HorizonRuleStyle setColor(int color) {
    method paragraphSpacing (line 40) | public HorizonRuleStyle paragraphSpacing(int paragraphSpacing) {
    method paragraphSpacingBefore (line 45) | public HorizonRuleStyle paragraphSpacingBefore(int paragraphSpacingBef...
    method paragraphSpacingBefore (line 50) | public int paragraphSpacingBefore() {
    method getHeight (line 54) | public int getHeight() {
    method getColor (line 58) | public int getColor() {
    method paragraph (line 62) | public ParagraphStyle paragraph() {
    method apply (line 66) | public void apply(Paint paint) {

FILE: Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/styles/LinkStyle.java
  class LinkStyle (line 3) | public class LinkStyle {
    method create (line 11) | public static LinkStyle create() {
    method create (line 15) | public static LinkStyle create(int fontColor, int space, String icon, ...
    method fontColor (line 25) | public LinkStyle fontColor(int fontColor) {
    method fontColor (line 30) | public int fontColor() {
    method space (line 34) | public LinkStyle space(int space) {
    method space (line 39) | public int space() {
    method icon (line 43) | public LinkStyle icon(String icon) {
    method icon (line 48) | public String icon() {
    method underline (line 52) | public LinkStyle underline(boolean underline) {
    method underline (line 57) | public boolean underline( ) {
    method isBold (line 61) | public LinkStyle isBold(boolean bold) {
    method isBold (line 66) | public boolean isBold() {

FILE: Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/styles/MarkdownStyles.java
  class MarkdownStyles (line 12) | public class MarkdownStyles {
    method MarkdownStyles (line 81) | public MarkdownStyles() {
    method paragraphStyle (line 84) | public MarkdownStyles paragraphStyle(ParagraphStyle paragraph) {
    method horizonRuleStyle (line 89) | public MarkdownStyles horizonRuleStyle(HorizonRuleStyle horizonRule) {
    method tableStyle (line 94) | public MarkdownStyles tableStyle(TableStyle table) {
    method setTitleStyles (line 99) | public MarkdownStyles setTitleStyles(TitleStyle[] titleStyles) {
    method setTitleStyle (line 103) | public MarkdownStyles setTitleStyle(int level, TitleStyle style) {
    method getOrderStylesMap (line 115) | public Map<Integer, OrderStyle> getOrderStylesMap() {
    method setOrderStyles (line 119) | public MarkdownStyles setOrderStyles(Map<Integer, OrderStyle> orderSty...
    method getBaseOrderStyle (line 124) | public OrderStyle getBaseOrderStyle() {
    method setBaseOrderStyle (line 128) | public MarkdownStyles setBaseOrderStyle(OrderStyle baseOrder) {
    method setBulletStyles (line 133) | public MarkdownStyles setBulletStyles(Map<Integer, BulletStyle> bullet...
    method getBaseBulletStyle (line 138) | public BulletStyle getBaseBulletStyle() {
    method getBulletStylesMap (line 142) | public Map<Integer, BulletStyle> getBulletStylesMap() {
    method baseBulletStyle (line 146) | public MarkdownStyles baseBulletStyle(BulletStyle base) {
    method getFootnoteStyle (line 151) | public FootnoteStyle getFootnoteStyle() {
    method footnoteStyle (line 155) | public MarkdownStyles footnoteStyle(FootnoteStyle footnote) {
    method codeStyle (line 160) | public CodeStyle codeStyle() {
    method codeStyle (line 163) | public MarkdownStyles codeStyle(CodeStyle style) {
    method underlineStyle (line 167) | public UnderlineStyle underlineStyle() {
    method underlineStyle (line 170) | public MarkdownStyles underlineStyle(UnderlineStyle style) {
    method blockQuoteStyle (line 175) | public BlockQuoteStyle blockQuoteStyle() {
    method blockQuoteStyle (line 179) | public MarkdownStyles blockQuoteStyle(BlockQuoteStyle blockQuote) {
    method titleStyles (line 184) | public TitleStyle[] titleStyles() {
    method paragraphStyle (line 188) | public ParagraphStyle paragraphStyle() {
    method horizonRuleStyle (line 192) | public HorizonRuleStyle horizonRuleStyle() {
    method linkStyle (line 196) | public LinkStyle linkStyle() {
    method linkStyle (line 200) | public MarkdownStyles linkStyle(LinkStyle link) {
    method tableStyle (line 205) | public TableStyle tableStyle() {
    method getDefaultStyles (line 209) | public static MarkdownStyles getDefaultStyles() {

FILE: Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/styles/OrderStyle.java
  class OrderStyle (line 24) | public class OrderStyle {
    method create (line 33) | public static OrderStyle create() {
    method orderFontColor (line 40) | public OrderStyle orderFontColor(int fontColor) {
    method orderFontColor (line 45) | public int orderFontColor() {
    method orderFontSize (line 49) | public OrderStyle orderFontSize(float fontSize) {
    method orderFontSize (line 54) | public float orderFontSize() {
    method setShape (line 58) | public OrderStyle setShape(Shape shape) {
    method shape (line 63) | public Shape shape() {
    method leading (line 67) | public OrderStyle leading(int leading) {
    method leading (line 72) | public int leading() {
    method leadingSpacing (line 76) | public OrderStyle leadingSpacing(int leadingSpacing) {
    method leadingSpacing (line 81) | public int leadingSpacing() {
    method isBold (line 85) | public OrderStyle isBold(boolean bold) {
    method isBold (line 90) | public boolean isBold() {

FILE: Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/styles/ParagraphStyle.java
  class ParagraphStyle (line 4) | public class ParagraphStyle {
    method create (line 10) | public static ParagraphStyle create() {
    method fontSize (line 14) | public ParagraphStyle fontSize(float fontSize) {
    method fontSize (line 19) | public float fontSize() {
    method fontColor (line 23) | public ParagraphStyle fontColor(int fontColor) {
    method fontColor (line 28) | public int fontColor() {
    method lineHeight (line 32) | public ParagraphStyle lineHeight(int lineHeight) {
    method lineHeight (line 37) | public int lineHeight() {
    method paragraphSpacing (line 41) | public ParagraphStyle paragraphSpacing(int paragraphSpacing) {
    method paragraphSpacing (line 46) | public int paragraphSpacing() {

FILE: Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/styles/Shape.java
  class Shape (line 10) | public class Shape {
    method create (line 23) | public static Shape create(int type, int size, int color) {
    method create (line 31) | public static Shape create(int type, int size, String icon) {
    method setType (line 39) | public Shape setType(int type) {
    method setSize (line 44) | public Shape setSize(int size) {
    method setColor (line 51) | public Shape setColor(int color) {
    method setIcon (line 56) | public Shape setIcon(String icon) {
    method setBorderRadius (line 61) | public Shape setBorderRadius(int borderRadius) {
    method setLineWidth (line 65) | public Shape setLineWidth(int lineWidth) {
    method type (line 70) | public int type() {
    method size (line 74) | public int size() {
    method color (line 78) | public int color() {
    method icon (line 82) | public String icon() {
    method radius (line 86) | public int radius() {
    method lineWidth (line 90) | public int lineWidth() {

FILE: Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/styles/TableStyle.java
  class TableStyle (line 16) | public class TableStyle implements Parcelable {
    method TableStyle (line 41) | public TableStyle() {
    method create (line 49) | public static TableStyle create() {
    method maxWidth (line 64) | public TableStyle maxWidth(int maxWidth) {
    method maxHeight (line 69) | public TableStyle maxHeight(int maxHeight) {
    method titleFontSize (line 74) | public TableStyle titleFontSize(float size) {
    method titleBackgroundColor (line 79) | public TableStyle titleBackgroundColor(int color) {
    method headerFontSize (line 84) | public TableStyle headerFontSize(float size) {
    method headerBackgroundColor (line 89) | public TableStyle headerBackgroundColor(int color) {
    method bodyFontSize (line 94) | public TableStyle bodyFontSize(float size) {
    method bodyBackgroundColor (line 99) | public TableStyle bodyBackgroundColor(int color) {
    method cellTopBottomPadding (line 104) | public TableStyle cellTopBottomPadding(int rowTopBottomPadding) {
    method columnDefaultMaxWidth (line 109) | public TableStyle columnDefaultMaxWidth(float columnDefaultMaxWidth) {
    method columnFirstMaxWidth (line 114) | public TableStyle columnFirstMaxWidth(float columnFirstMaxWidth) {
    method drawBorder (line 119) | public TableStyle drawBorder(boolean drawBorder) {
    method borderColor (line 124) | public TableStyle borderColor(int borderColor) {
    method borderWidth (line 129) | public TableStyle borderWidth(int borderWidth) {
    method tableBlockRadius (line 137) | public TableStyle tableBlockRadius(int tableBlockRadius) {
    method fontColor (line 142) | public TableStyle fontColor(int color) {
    method titleFontColor (line 147) | public TableStyle titleFontColor(int color) {
    method cellLeftRightPadding (line 152) | public int cellLeftRightPadding() {
    method cellLeftRightPadding (line 156) | public TableStyle cellLeftRightPadding(int cellLeftRightPadding) {
    method titleBackgroundRadius (line 161) | public TableStyle titleBackgroundRadius(int headerBackgroundRadius) {
    method maxWidth (line 166) | public int maxWidth() {
    method maxHeight (line 170) | public int maxHeight() {
    method title (line 174) | public TableCell title() {
    method header (line 178) | public TableCell header() {
    method body (line 182) | public TableCell body() {
    method cellTopBottomPadding (line 186) | public int cellTopBottomPadding() {
    method rowLeftRightPadding (line 190) | public int rowLeftRightPadding() {
    method columnDefaultMaxWidth (line 194) | public float columnDefaultMaxWidth() {
    method columnFirstMaxWidth (line 198) | public float columnFirstMaxWidth() {
    method drawBorder (line 202) | public boolean drawBorder() {
    method borderColor (line 206) | public int borderColor() {
    method borderWidth (line 210) | public int borderWidth() {
    method tableBlockRadius (line 214) | public int tableBlockRadius() {
    method getTextColor (line 218) | public int getTextColor() {
    method titleBackgroundRadius (line 222) | public int titleBackgroundRadius() {
    method titleBarHeight (line 225) | public int titleBarHeight() {
    method titleBarHeight (line 228) | public TableStyle titleBarHeight(int titleBarHeight) {
    method applyTableBorderStyle (line 233) | public void applyTableBorderStyle(@NonNull Paint paint) {
    method applyTableEvenRowStyle (line 249) | public void applyTableEvenRowStyle(@NonNull Paint paint) {
    method applyTableTextStyle (line 255) | public void applyTableTextStyle(@NonNull TextPaint textPaint, boolean ...
    method applyTableHeaderRowStyle (line 266) | public void applyTableHeaderRowStyle(@NonNull Paint paint) {
    method applyTableOddRowStyle (line 278) | public void applyTableOddRowStyle(@NonNull Paint paint) {
    method handleBodyStyle (line 282) | private void handleBodyStyle(@NonNull Paint paint) {
    method describeContents (line 293) | @Override
    method writeToParcel (line 298) | @Override
    method TableStyle (line 320) | protected TableStyle(Parcel in) {
    method createFromParcel (line 345) | @Override
    method newArray (line 350) | @Override
    class TableCell (line 356) | public static class TableCell {
      method TableCell (line 361) | public TableCell() {
      method backgroundColor (line 365) | public int backgroundColor() {
      method fontSize (line 369) | public float fontSize() {
      method fontColor (line 373) | public int fontColor() {
      method TableCell (line 377) | public TableCell(int backgroundColor, float fontSize) {

FILE: Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/styles/TitleStyle.java
  class TitleStyle (line 6) | public class TitleStyle {
    method create (line 18) | public static TitleStyle create(float fontSize) {
    method TitleStyle (line 21) | public TitleStyle() {
    method TitleStyle (line 25) | public TitleStyle(float fontSize) {
    method fontSize (line 30) | public TitleStyle fontSize(float fontSize) {
    method icon (line 35) | public TitleStyle icon(String icon) {
    method sizeType (line 40) | public TitleStyle sizeType(int sizeType) {
    method paragraphSpacing (line 44) | public TitleStyle paragraphSpacing(int paragraphSpacing) {
    method paragraphSpacingBefore (line 49) | public TitleStyle paragraphSpacingBefore(int paragraphSpacingBefore) {
    method paragraphSpacingBefore (line 54) | public int paragraphSpacingBefore() {
    method setTypeface (line 57) | public TitleStyle setTypeface(Typeface typeface) {
    method icon (line 62) | public String icon() {
    method paragraph (line 66) | public ParagraphStyle paragraph() {
    method apply (line 70) | public void apply(TextPaint paint) {

FILE: Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/styles/UnderlineStyle.java
  class UnderlineStyle (line 5) | public class UnderlineStyle {
    method create (line 9) | public static UnderlineStyle create(int height, int color) {
    method getHeight (line 13) | public int getHeight() {
    method getColor (line 17) | public int getColor() {
    method setHeight (line 21) | public UnderlineStyle setHeight(int height) {
    method setColor (line 26) | public UnderlineStyle setColor(int color) {

FILE: Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/utils/MDLogger.java
  class MDLogger (line 5) | public class MDLogger {
    method i (line 8) | public static void i(String tag, String msg) {
    method e (line 12) | public static void e(String tag, String msg) {
    method e (line 16) | public static void e(String tag, Throwable tr) {
    method e (line 20) | public static void e(String tag, String msg, Throwable tr) {
    method d (line 24) | public static void d(String tag, String msg) {
    method v (line 28) | public static void v(String tag, String msg) {
    method w (line 32) | public static void w(String tag, String msg) {
    method w (line 36) | public static void w(String tag, Throwable tr) {

FILE: Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/utils/ParseUtil.java
  class ParseUtil (line 9) | public class ParseUtil {
    method parseColor (line 11) | public static Integer parseColor(String color) {
    method parseColor (line 15) | public static Integer parseColor(String color, Integer defaultValue) {
    method parseFloat (line 27) | public static float parseFloat(String str, float def) {
    method parseInt (line 36) | public static int parseInt(String str, int def) {
    method parseDp (line 45) | public static int parseDp(String str) {
    method parseDp (line 49) | public static int parseDp(String str, int def) {
    method parseDp (line 53) | public static int parseDp(Context context, String str, int def) {
    method parsePercent (line 72) | public static float parsePercent(String str, float def) {
    method parseColorWithRGBA (line 82) | public static int parseColorWithRGBA(String str) {

FILE: Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/utils/Utils.java
  class Utils (line 22) | public class Utils {
    method dpToPx (line 33) | public static int dpToPx(float dp) {
    method dpToPx (line 37) | public static int dpToPx(Context context, float dp) {
    method rpxToPx (line 46) | public static float rpxToPx(float rpx) {
    method rpxToPx (line 50) | public static float rpxToPx(float rpx, Context context) {
    method isNumeric (line 56) | public static boolean isNumeric(String str) {
    method runOnUiThread (line 60) | public static boolean runOnUiThread(View view, Runnable runnable) {
    method loadImageSync (line 78) | public static Drawable loadImageSync(Context context, String url, Draw...
    method loadImageSync (line 82) | public static Drawable loadImageSync(Context context, String url, int ...
    method getScreenWidth (line 87) | public static int getScreenWidth() {
    method getScreenWidth (line 91) | public static int getScreenWidth(Context context) {
    method getScreenHeight (line 98) | public static int getScreenHeight() {
    method getScreenHeight (line 102) | public static int getScreenHeight(Context context) {
    method acquireNormalThreadPoolExecutor (line 109) | public static ThreadPoolExecutor acquireNormalThreadPoolExecutor() {
    method getDensity (line 113) | public static float getDensity(Context context) {
    method loadImageAsyn (line 120) | public static void loadImageAsyn(Context context, final String url, fi...
    method loadImageAsyn (line 124) | public static void loadImageAsyn(Context context, final String url, in...
    method getResources (line 128) | public static Resources getResources() {
    method isInTableNode (line 132) | public static boolean isInTableNode(@NonNull Node node) {
    method isInTableNode (line 135) | private static boolean isInTableNode(@NonNull Node node, int depth) {

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/AbstractMarkwonPlugin.java
  class AbstractMarkwonPlugin (line 20) | public abstract class AbstractMarkwonPlugin implements MarkwonPlugin {
    method configure (line 22) | @Override
    method configureParser (line 27) | @Override
    method configureTheme (line 32) | @Override
    method configureConfiguration (line 37) | @Override
    method configureVisitor (line 42) | @Override
    method configureSpansFactory (line 47) | @Override
    method processMarkdown (line 52) | @NonNull
    method beforeRender (line 58) | @Override
    method afterRender (line 63) | @Override
    method beforeSetText (line 68) | @Override
    method afterSetText (line 73) | @Override

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/BlockHandlerDef.java
  class BlockHandlerDef (line 10) | public class BlockHandlerDef implements MarkwonVisitor.BlockHandler {
    method blockStart (line 11) | @Override
    method blockEnd (line 16) | @Override

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/LinkResolver.java
  type LinkResolver (line 12) | public interface LinkResolver {
    method resolve (line 13) | void resolve(@NonNull View view, @NonNull String link);

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/LinkResolverDef.java
  class LinkResolverDef (line 14) | public class LinkResolverDef implements LinkResolver {
    method resolve (line 19) | @Override
    method parseLink (line 35) | @NonNull

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/Markwon.java
  class Markwon (line 26) | public abstract class Markwon {
    method create (line 36) | @NonNull
    method builder (line 50) | @NonNull
    method builderWithPlugs (line 56) | @NonNull
    method builderNoCore (line 66) | @NonNull
    method parse (line 79) | @NonNull
    method render (line 94) | @NonNull
    method toMarkdown (line 106) | @NonNull
    method setMarkdown (line 109) | public abstract void setMarkdown(@NonNull TextView textView, @NonNull ...
    method setParsedMarkdown (line 111) | public abstract void setParsedMarkdown(@NonNull TextView textView, @No...
    method hasPlugin (line 124) | public abstract boolean hasPlugin(@NonNull Class<? extends MarkwonPlug...
    method getPlugin (line 126) | @Nullable
    method requirePlugin (line 132) | @NonNull
    method getPlugins (line 139) | @NonNull
    method configuration (line 142) | @NonNull
    type TextSetter (line 152) | public interface TextSetter {
      method setText (line 161) | void setText(
    type Builder (line 176) | public interface Builder {
      method bufferType (line 184) | @NonNull
      method textSetter (line 191) | @NonNull
      method usePlugin (line 194) | @NonNull
      method usePlugins (line 197) | @NonNull
      method fallbackToRawInputWhenEmpty (line 208) | @NonNull
      method setMarkdownTheme (line 211) | Builder setMarkdownTheme(MarkwonTheme theme);
      method build (line 212) | @NonNull

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/MarkwonBuilderImpl.java
  class MarkwonBuilderImpl (line 20) | class MarkwonBuilderImpl implements Markwon.Builder {
    method MarkwonBuilderImpl (line 34) | MarkwonBuilderImpl(@NonNull Context context) {
    method MarkwonBuilderImpl (line 39) | MarkwonBuilderImpl(@NonNull Context context, List<MarkwonPlugin> plugi...
    method bufferType (line 48) | @NonNull
    method textSetter (line 55) | @NonNull
    method usePlugin (line 62) | @NonNull
    method usePlugins (line 69) | @NonNull
    method fallbackToRawInputWhenEmpty (line 88) | @NonNull
    method setMarkdownTheme (line 95) | @Override
    method build (line 101) | @NonNull
    method preparePlugins (line 146) | @NonNull

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/MarkwonConfiguration.java
  class MarkwonConfiguration (line 16) | public class MarkwonConfiguration {
    method builder (line 18) | @NonNull
    method MarkwonConfiguration (line 34) | private MarkwonConfiguration(@NonNull Builder builder) {
    method theme (line 44) | @NonNull
    method asyncDrawableLoader (line 49) | @NonNull
    method syntaxHighlight (line 54) | @NonNull
    method linkResolver (line 59) | @NonNull
    method imageDestinationProcessor (line 67) | @NonNull
    method imageSizeResolver (line 72) | @NonNull
    method spansFactory (line 80) | @NonNull
    class Builder (line 85) | @SuppressWarnings({"unused", "UnusedReturnValue"})
      method Builder (line 97) | Builder() {
      method asyncDrawableLoader (line 103) | @NonNull
      method syntaxHighlight (line 109) | @NonNull
      method linkResolver (line 115) | @NonNull
      method imageDestinationProcessor (line 124) | @NonNull
      method imageSizeResolver (line 133) | @NonNull
      method build (line 139) | @NonNull

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/MarkwonImpl.java
  class MarkwonImpl (line 21) | class MarkwonImpl extends Markwon {
    method MarkwonImpl (line 36) | MarkwonImpl(
    method parse (line 54) | @NonNull
    method render (line 66) | @NonNull
    method toMarkdown (line 94) | @NonNull
    method setMarkdown (line 111) | @Override
    method setParsedMarkdown (line 116) | @Override
    method hasPlugin (line 145) | @Override
    method getPlugin (line 150) | @Nullable
    method requirePlugin (line 163) | @NonNull
    method getPlugins (line 174) | @NonNull
    method configuration (line 180) | @NonNull

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/MarkwonPlugin.java
  type MarkwonPlugin (line 25) | public interface MarkwonPlugin {
    type Action (line 31) | interface Action<P extends MarkwonPlugin> {
      method apply (line 32) | void apply(@NonNull P p);
    type Registry (line 39) | interface Registry {
      method require (line 41) | @NonNull
      method require (line 44) | <P extends MarkwonPlugin> void require(
    method configure (line 54) | void configure(@NonNull Registry registry);
    method configureParser (line 60) | void configureParser(@NonNull Parser.Builder builder);
    method configureTheme (line 68) | void configureTheme(@NonNull MarkwonTheme.Builder builder);
    method configureConfiguration (line 76) | void configureConfiguration(@NonNull MarkwonConfiguration.Builder buil...
    method configureVisitor (line 84) | void configureVisitor(@NonNull MarkwonVisitor.Builder builder);
    method configureSpansFactory (line 92) | void configureSpansFactory(@NonNull MarkwonSpansFactory.Builder builder);
    method processMarkdown (line 101) | @NonNull
    method beforeRender (line 110) | void beforeRender(@NonNull Node node);
    method afterRender (line 121) | void afterRender(@NonNull Node node, @NonNull MarkwonVisitor visitor);
    method beforeSetText (line 134) | void beforeSetText(@NonNull TextView textView, @NonNull Spanned markdo...
    method afterSetText (line 148) | void afterSetText(@NonNull TextView textView);

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/MarkwonReducer.java
  class MarkwonReducer (line 15) | public abstract class MarkwonReducer {
    method directChildren (line 21) | @NonNull
    method reduce (line 26) | @NonNull
    class DirectChildren (line 30) | static class DirectChildren extends MarkwonReducer {
      method reduce (line 32) | @NonNull

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/MarkwonSpansFactory.java
  type MarkwonSpansFactory (line 14) | public interface MarkwonSpansFactory {
    method get (line 25) | @Nullable
    method require (line 28) | @NonNull
    type Builder (line 32) | interface Builder {
      method setFactory (line 34) | @NonNull
      method addFactory (line 47) | @NonNull
      method appendFactory (line 58) | @NonNull
      method prependFactory (line 67) | @NonNull
      method getFactory (line 73) | @Nullable
      method requireFactory (line 84) | @NonNull
      method build (line 87) | @NonNull

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/MarkwonSpansFactoryImpl.java
  class MarkwonSpansFactoryImpl (line 17) | class MarkwonSpansFactoryImpl implements MarkwonSpansFactory {
    method MarkwonSpansFactoryImpl (line 21) | MarkwonSpansFactoryImpl(@NonNull Map<Class<? extends Node>, SpanFactor...
    method get (line 25) | @Nullable
    method require (line 31) | @NonNull
    class BuilderImpl (line 41) | static class BuilderImpl implements Builder {
      method setFactory (line 46) | @NonNull
      method addFactory (line 57) | @NonNull
      method appendFactory (line 64) | @NonNull
      method prependFactory (line 82) | @NonNull
      method getFactory (line 103) | @Nullable
      method requireFactory (line 109) | @NonNull
      method build (line 119) | @NonNull
    class CompositeSpanFactory (line 126) | static class CompositeSpanFactory implements SpanFactory {
      method CompositeSpanFactory (line 130) | CompositeSpanFactory(@NonNull SpanFactory first, @NonNull SpanFactor...
      method getSpans (line 136) | @Nullable

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/MarkwonVisitor.java
  type MarkwonVisitor (line 17) | public interface MarkwonVisitor extends Visitor {
    type NodeVisitor (line 22) | interface NodeVisitor<N extends Node> {
      method visit (line 23) | void visit(@NonNull MarkwonVisitor visitor, @NonNull N n);
    type BlockHandler (line 32) | interface BlockHandler {
      method blockStart (line 34) | void blockStart(@NonNull MarkwonVisitor visitor, @NonNull Node node);
      method blockEnd (line 36) | void blockEnd(@NonNull MarkwonVisitor visitor, @NonNull Node node);
    type Builder (line 39) | interface Builder {
      method on (line 46) | @NonNull
      method blockHandler (line 55) | @SuppressWarnings("UnusedReturnValue")
      method build (line 59) | @NonNull
    method configuration (line 63) | @NonNull
    method renderProps (line 66) | @NonNull
    method builder (line 69) | @NonNull
    method visitChildren (line 77) | void visitChildren(@NonNull Node node);
    method hasNext (line 85) | boolean hasNext(@NonNull Node node);
    method ensureNewLine (line 91) | void ensureNewLine();
    method forceNewLine (line 96) | void forceNewLine();
    method length (line 103) | int length();
    method clear (line 108) | void clear();
    method setSpans (line 117) | void setSpans(int start, @Nullable Object spans);
    method setSpansForNode (line 128) | <N extends Node> void setSpansForNode(@NonNull N node, int start);
    method setSpansForNode (line 136) | <N extends Node> void setSpansForNode(@NonNull Class<N> node, int start);
    method setSpansForNodeOptional (line 149) | <N extends Node> void setSpansForNodeOptional(@NonNull N node, int sta...
    method setSpansForNodeOptional (line 157) | @SuppressWarnings("unused")
    method blockStart (line 163) | void blockStart(@NonNull Node node);
    method blockEnd (line 168) | void blockEnd(@NonNull Node node);

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/MarkwonVisitorFactory.java
  class MarkwonVisitorFactory (line 8) | abstract class MarkwonVisitorFactory {
    method create (line 10) | @NonNull
    method create (line 13) | @NonNull

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/MarkwonVisitorImpl.java
  class MarkwonVisitorImpl (line 38) | class MarkwonVisitorImpl implements MarkwonVisitor {
    method MarkwonVisitorImpl (line 51) | MarkwonVisitorImpl(
    method visit (line 64) | @Override
    method visit (line 69) | @Override
    method visit (line 74) | @Override
    method visit (line 79) | @Override
    method visit (line 84) | @Override
    method visit (line 89) | @Override
    method visit (line 94) | @Override
    method visit (line 99) | @Override
    method visit (line 104) | @Override
    method visit (line 109) | @Override
    method visit (line 114) | @Override
    method visit (line 119) | @Override
    method visit (line 124) | @Override
    method visit (line 129) | @Override
    method visit (line 134) | @Override
    method visit (line 139) | @Override
    method visit (line 144) | @Override
    method visit (line 149) | @Override
    method visit (line 154) | @Override
    method visit (line 159) | @Override
    method visit (line 164) | @Override
    method visit (line 169) | @Override
    method visit (line 174) | @Override
    method visit (line 179) | private void visit(@NonNull Node node) {
    method configuration (line 189) | @NonNull
    method renderProps (line 195) | @NonNull
    method builder (line 201) | @NonNull
    method visitChildren (line 207) | @Override
    method hasNext (line 219) | @Override
    method ensureNewLine (line 224) | @Override
    method forceNewLine (line 232) | @Override
    method length (line 237) | @Override
    method setSpans (line 242) | @Override
    method clear (line 247) | @Override
    method setSpansForNode (line 253) | @Override
    method setSpansForNode (line 258) | @Override
    method setSpansForNodeOptional (line 263) | @Override
    method setSpansForNodeOptional (line 268) | @Override
    method blockStart (line 276) | @Override
    method blockEnd (line 281) | @Override
    class BuilderImpl (line 286) | static class BuilderImpl implements Builder {
      method on (line 291) | @NonNull
      method blockHandler (line 309) | @NonNull
      method build (line 316) | @NonNull

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/PrecomputedFutureTextSetterCompat.java
  class PrecomputedFutureTextSetterCompat (line 21) | public class PrecomputedFutureTextSetterCompat implements Markwon.TextSe...
    method create (line 27) | @NonNull
    method create (line 32) | @NonNull
    method PrecomputedFutureTextSetterCompat (line 40) | @SuppressWarnings("WeakerAccess")
    method setText (line 45) | @Override

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/PrecomputedTextSetterCompat.java
  class PrecomputedTextSetterCompat (line 22) | public class PrecomputedTextSetterCompat implements Markwon.TextSetter {
    method create (line 27) | @NonNull
    method PrecomputedTextSetterCompat (line 34) | @SuppressWarnings("WeakerAccess")
    method setText (line 39) | @Override
    method precomputedText (line 71) | @Nullable
    method applyText (line 104) | private static void applyText(

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/Prop.java
  class Prop (line 14) | public class Prop<T> {
    method of (line 16) | @SuppressWarnings("unused")
    method of (line 22) | @NonNull
    method Prop (line 29) | Prop(@NonNull String name) {
    method name (line 33) | @NonNull
    method get (line 38) | @Nullable
    method get (line 43) | @NonNull
    method require (line 48) | @NonNull
    method set (line 57) | public void set(@NonNull RenderProps props, @Nullable T value) {
    method clear (line 61) | public void clear(@NonNull RenderProps props) {
    method equals (line 65) | @Override
    method hashCode (line 75) | @Override
    method toString (line 80) | @Override

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/RegistryImpl.java
  class RegistryImpl (line 14) | class RegistryImpl implements MarkwonPlugin.Registry {
    method RegistryImpl (line 20) | RegistryImpl(@NonNull List<MarkwonPlugin> origin) {
    method require (line 26) | @NonNull
    method require (line 32) | @Override
    method process (line 39) | @NonNull
    method configure (line 47) | private void configure(@NonNull MarkwonPlugin plugin) {
    method get (line 81) | @NonNull
    method find (line 104) | @Nullable

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/RenderProps.java
  type RenderProps (line 9) | public interface RenderProps {
    method get (line 11) | @Nullable
    method get (line 14) | @NonNull
    method set (line 17) | <T> void set(@NonNull Prop<T> prop, @Nullable T value);
    method clear (line 19) | <T> void clear(@NonNull Prop<T> prop);
    method clearAll (line 21) | void clearAll();

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/RenderPropsImpl.java
  class RenderPropsImpl (line 12) | class RenderPropsImpl implements RenderProps {
    method get (line 16) | @Nullable
    method get (line 23) | @NonNull
    method set (line 34) | @Override
    method clear (line 43) | @Override
    method clearAll (line 48) | @Override

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/SoftBreakAddsNewLinePlugin.java
  class SoftBreakAddsNewLinePlugin (line 10) | public class SoftBreakAddsNewLinePlugin extends AbstractMarkwonPlugin {
    method create (line 12) | @NonNull
    method configureVisitor (line 17) | @Override

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/SpanFactory.java
  type SpanFactory (line 9) | public interface SpanFactory {
    method getSpans (line 11) | @Nullable

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/SpannableBuilder.java
  class SpannableBuilder (line 31) | @SuppressWarnings({"WeakerAccess", "unused"})
    method setSpans (line 37) | public static void setSpans(@NonNull SpannableBuilder builder, @Nullab...
    method isPositionValid (line 53) | @VisibleForTesting
    method SpannableBuilder (line 66) | public SpannableBuilder() {
    method SpannableBuilder (line 70) | public SpannableBuilder(@NonNull CharSequence cs) {
    method append (line 81) | @NonNull
    method append (line 87) | @NonNull
    method append (line 94) | @NonNull
    method append (line 108) | @NonNull
    method append (line 120) | @NonNull
    method append (line 128) | @NonNull
    method setSpan (line 136) | @NonNull
    method setSpan (line 141) | @NonNull
    method setSpan (line 146) | @NonNull
    method length (line 152) | @Override
    method charAt (line 157) | @Override
    method subSequence (line 165) | @Override
    method getSpans (line 220) | @NonNull
    method lastChar (line 260) | public char lastChar() {
    method removeFromEnd (line 264) | @NonNull
    method toString (line 291) | @Override
    method text (line 297) | @NonNull
    method spannableStringBuilder (line 310) | @NonNull
    method clear (line 356) | public void clear() {
    method copySpans (line 361) | private void copySpans(final int index, @Nullable CharSequence cs) {
    class Span (line 407) | public static class Span {
      method Span (line 414) | Span(@NonNull Object what, int start, int end, int flags) {
    class SpannableStringBuilderReversed (line 425) | static class SpannableStringBuilderReversed extends SpannableStringBui...
      method SpannableStringBuilderReversed (line 426) | SpannableStringBuilderReversed(CharSequence text) {
    method setSpansInternal (line 434) | private static void setSpansInternal(

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/core/CorePlugin.java
  class CorePlugin (line 80) | public class CorePlugin extends AbstractMarkwonPlugin {
    type OnTextAddedListener (line 86) | public interface OnTextAddedListener {
      method onTextAdded (line 106) | void onTextAdded(@NonNull MarkwonVisitor visitor, @NonNull String te...
    method create (line 109) | @NonNull
    method enabledBlockTypes (line 118) | @NonNull
    method CorePlugin (line 138) | protected CorePlugin(Context context) {
    method hasExplicitMovementMethod (line 145) | @SuppressWarnings("UnusedReturnValue")
    method addOnTextAddedListener (line 158) | @SuppressWarnings("UnusedReturnValue")
    method configureTheme (line 165) | @Override
    method configureVisitor (line 170) | @Override
    method configureSpansFactory (line 191) | @Override
    method beforeSetText (line 210) | @Override
    method afterSetText (line 222) | @Override
    method text (line 233) | private void text(@NonNull MarkwonVisitor.Builder builder) {
    method strongEmphasis (line 254) | private static void strongEmphasis(@NonNull MarkwonVisitor.Builder bui...
    method emphasis (line 265) | private static void emphasis(@NonNull MarkwonVisitor.Builder builder) {
    method blockQuote (line 276) | private static void blockQuote(@NonNull MarkwonVisitor.Builder builder) {
    method code (line 301) | private static void code(@NonNull MarkwonVisitor.Builder builder) {
    method fencedCodeBlock (line 315) | private static void fencedCodeBlock(@NonNull MarkwonVisitor.Builder bu...
    method handleCodeBlockLeftMargin (line 333) | private static void handleCodeBlockLeftMargin(int length, MarkwonVisit...
    method indentedCodeBlock (line 355) | private static void indentedCodeBlock(@NonNull MarkwonVisitor.Builder ...
    method image (line 367) | private static void image(MarkwonVisitor.Builder builder) {
    method clear (line 414) | private static void clear() {
    method visitCodeBlock (line 419) | @VisibleForTesting
    method bulletList (line 449) | private static void bulletList(@NonNull MarkwonVisitor.Builder builder) {
    method orderedList (line 453) | private static void orderedList(@NonNull MarkwonVisitor.Builder builde...
    method listItem (line 457) | private static void listItem(@NonNull MarkwonVisitor.Builder builder) {
    method getListItemSpanAndResetCodeBlockLeftMargin (line 493) | private static void getListItemSpanAndResetCodeBlockLeftMargin(int len...
    method listLevel (line 513) | private static int listLevel(@NonNull Node node) {
    method thematicBreak (line 528) | private static void thematicBreak(@NonNull MarkwonVisitor.Builder buil...
    method heading (line 543) | private static void heading(@NonNull MarkwonVisitor.Builder builder) {
    method softLineBreak (line 578) | private static void softLineBreak(@NonNull MarkwonVisitor.Builder buil...
    method hardLineBreak (line 582) | private static void hardLineBreak(@NonNull MarkwonVisitor.Builder buil...
    method paragraph (line 586) | private static void paragraph(Context context, @NonNull MarkwonVisitor...
    method ensureParagraphBreakHeight (line 632) | private static int ensureParagraphBreakHeight(Context context, @NonNul...
    method isInTightList (line 653) | private static boolean isInTightList(@NonNull Paragraph paragraph) {
    method link (line 665) | private static void link(@NonNull MarkwonVisitor.Builder builder) {

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/core/CoreProps.java
  class CoreProps (line 8) | public abstract class CoreProps {
    type ListItemType (line 33) | public enum ListItemType {
    method CoreProps (line 38) | private CoreProps() {

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/core/MarkwonTheme.java
  class MarkwonTheme (line 49) | @SuppressWarnings("WeakerAccess")
    method emptyBuilder (line 83) | @SuppressWarnings("unused")
    method builder (line 98) | @NonNull
    method builderWithDefaults (line 111) | @NonNull
    method MarkwonTheme (line 116) | protected MarkwonTheme(@NonNull Builder builder) {
    method updateStyles (line 121) | public void updateStyles(MarkdownStyles styles) {
    method underlineStyle (line 137) | public UnderlineStyle underlineStyle() {
    method blockQuoteStyle (line 141) | public BlockQuoteStyle blockQuoteStyle() {
    method linkStyle (line 145) | public LinkStyle linkStyle() {
    method footnoteStyle (line 149) | public FootnoteStyle footnoteStyle() {
    method codeStyle (line 153) | public CodeStyle codeStyle() {
    method getTextView (line 157) | public TextView getTextView() {
    method applyLinkStyle (line 161) | public void applyLinkStyle(@NonNull TextPaint paint, int textColor, bo...
    method applyLinkStyle (line 187) | public void applyLinkStyle(@NonNull TextPaint paint) {
    method applyLinkStyle (line 197) | public void applyLinkStyle(@NonNull Paint paint) {
    method applyBlockQuoteStyle (line 211) | public void applyBlockQuoteStyle(@NonNull Paint paint) {
    method getCodeBlockMargin (line 220) | public int getCodeBlockMargin() {
    method getInlineCodeTextColor (line 224) | public int getInlineCodeTextColor() {
    method applyInlineCodeTextStyle (line 231) | public void applyInlineCodeTextStyle(@NonNull Paint paint) {
    method applyCodeBlockTextStyle (line 241) | public void applyCodeBlockTextStyle(@NonNull Paint paint) {
    method applyCodeBackgroundColor (line 282) | public void applyCodeBackgroundColor(@NonNull Paint paint) {
    method applyInlineCodeBackgroundColor (line 286) | public void applyInlineCodeBackgroundColor(@NonNull Paint paint) {
    method getCodeBackgroundRadius (line 290) | public int getCodeBackgroundRadius() {
    method getCodeBlockBackgroundColor (line 297) | public int getCodeBlockBackgroundColor(@NonNull Paint paint) {
    method applyThematicBreakStyle (line 301) | public void applyThematicBreakStyle(@NonNull Paint paint) {
    method getParagraphBreakHeight (line 312) | public int getParagraphBreakHeight() {
    method getTitleStyle (line 316) | public TitleStyle getTitleStyle(int level) {
    method getTitleStyles (line 320) | public TitleStyle getTitleStyles(int level) {
    method getBulletStyle (line 324) | public BulletStyle getBulletStyle(int level) {
    method getTableStyle (line 335) | public TableStyle getTableStyle() {
    method orderBean (line 339) | public OrderStyle orderBean(int level) {
    method getLinkStyles (line 350) | public LinkStyle getLinkStyles() {
    method getHorizonRule (line 354) | public HorizonRuleStyle getHorizonRule() {
    class Builder (line 358) | @SuppressWarnings("unused")
      method Builder (line 364) | Builder() {
      method Builder (line 367) | Builder(@NonNull MarkwonTheme theme) {
      method setTextView (line 386) | public Builder setTextView(TextView textView) {
      method setStyles (line 391) | public Builder setStyles(MarkdownStyles productStyles) {
      method build (line 396) | @NonNull

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/core/SimpleBlockNodeVisitor.java
  class SimpleBlockNodeVisitor (line 16) | public class SimpleBlockNodeVisitor implements MarkwonVisitor.NodeVisito...
    method visit (line 17) | @Override

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/core/factory/BlockQuoteSpanFactory.java
  class BlockQuoteSpanFactory (line 11) | public class BlockQuoteSpanFactory implements SpanFactory {
    method getSpans (line 12) | @Nullable

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/core/factory/CodeBlockSpanFactory.java
  class CodeBlockSpanFactory (line 11) | public class CodeBlockSpanFactory implements SpanFactory {
    method getSpans (line 12) | @Nullable

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/core/factory/CodeSpanFactory.java
  class CodeSpanFactory (line 11) | public class CodeSpanFactory implements SpanFactory {
    method getSpans (line 12) | @Nullable

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/core/factory/EmphasisSpanFactory.java
  class EmphasisSpanFactory (line 11) | public class EmphasisSpanFactory implements SpanFactory {
    method getSpans (line 12) | @Nullable

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/core/factory/HeadingSpanFactory.java
  class HeadingSpanFactory (line 12) | public class HeadingSpanFactory implements SpanFactory {
    method getSpans (line 13) | @Nullable

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/core/factory/LinkSpanFactory.java
  class LinkSpanFactory (line 12) | public class LinkSpanFactory implements SpanFactory {
    method getSpans (line 13) | @Nullable

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/core/factory/ListItemSpanFactory.java
  class ListItemSpanFactory (line 13) | public class ListItemSpanFactory implements SpanFactory {
    method getSpans (line 15) | @Nullable

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/core/factory/StrongEmphasisSpanFactory.java
  class StrongEmphasisSpanFactory (line 11) | public class StrongEmphasisSpanFactory implements SpanFactory {
    method getSpans (line 12) | @Nullable

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/core/factory/ThematicBreakSpanFactory.java
  class ThematicBreakSpanFactory (line 11) | public class ThematicBreakSpanFactory implements SpanFactory {
    method getSpans (line 12) | @Nullable

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/core/spans/BlockQuoteSpan.java
  class BlockQuoteSpan (line 17) | public class BlockQuoteSpan implements LeadingMarginSpan {
    method BlockQuoteSpan (line 29) | public BlockQuoteSpan(@NonNull MarkwonTheme theme) {
    method applyStyles (line 34) | private void applyStyles() {
    method getLeadingMargin (line 43) | @Override
    method drawLeadingMargin (line 48) | @Override
    method selfEnd (line 113) | private static boolean selfEnd(int end, CharSequence text, Object span) {

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/core/spans/BulletListItemSpan.java
  class BulletListItemSpan (line 26) | public class BulletListItemSpan extends BaseIconTextSpan {
    method BulletListItemSpan (line 48) | public BulletListItemSpan(
    method getImageUrl (line 57) | @Override
    method applyStyle (line 65) | @Override
    method applyStyleInner (line 70) | private void applyStyleInner(Paint p) {
    method getLeadingMarginIfUsed (line 82) | public int getLeadingMarginIfUsed() {
    method getLeadingMargin (line 86) | @Override
    method validShape (line 109) | private boolean validShape() {
    method drawLeadingMargin (line 120) | @Override
    method getSpotSize (line 239) | private int getSpotSize(int textLineHeight) {

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/core/spans/CodeBlockSpan.java
  class CodeBlockSpan (line 25) | public class CodeBlockSpan extends MetricAffectingSpan implements Leadin...
    method CodeBlockSpan (line 36) | public CodeBlockSpan(@NonNull MarkwonTheme theme) {
    method setListItemSpan (line 42) | public void setListItemSpan(BulletListItemSpan bulletListItemSpan,
    method updateMeasureState (line 48) | @Override
    method updateDrawState (line 53) | @Override
    method apply (line 58) | private void apply(TextPaint p) {
    method getLeadingMargin (line 62) | @Override
    method drawLeadingMargin (line 77) | @Override
    method drawRectWithTopRound (line 152) | private void drawRectWithTopRound(Canvas canvas, Paint paint,
    method drawRectWithBottomRound (line 161) | private void drawRectWithBottomRound(Canvas canvas, Paint paint,
    method selfEnd (line 170) | private boolean selfEnd(int end, CharSequence text, Object span) {

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/core/spans/CodeSpan.java
  class CodeSpan (line 13) | public class CodeSpan extends MetricAffectingSpan {
    method CodeSpan (line 17) | public CodeSpan(@NonNull MarkwonTheme theme) {
    method updateMeasureState (line 21) | @Override
    method updateDrawState (line 26) | @Override
    method apply (line 32) | private void apply(TextPaint p) {

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/core/spans/CustomTypefaceSpan.java
  class CustomTypefaceSpan (line 19) | public class CustomTypefaceSpan extends MetricAffectingSpan {
    method create (line 21) | @NonNull
    method create (line 36) | @NonNull
    method CustomTypefaceSpan (line 49) | @Deprecated
    method CustomTypefaceSpan (line 55) | CustomTypefaceSpan(@NonNull Typeface typeface, boolean mergeStyles) {
    method updateMeasureState (line 61) | @Override
    method updateDrawState (line 66) | @Override
    method updatePaint (line 71) | private void updatePaint(@NonNull TextPaint paint) {

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/core/spans/EmphasisSpan.java
  class EmphasisSpan (line 6) | public class EmphasisSpan extends MetricAffectingSpan {
    method updateMeasureState (line 8) | @Override
    method updateDrawState (line 13) | @Override

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/core/spans/HeadingSpan.java
  class HeadingSpan (line 20) | public class HeadingSpan extends BaseIconTextSpan {
    method HeadingSpan (line 26) | public HeadingSpan(@NonNull MarkwonTheme theme, @IntRange(from = 1, to...
    method getImageUrl (line 33) | @Override
    method applyStyle (line 41) | @Override
    method getLeadingMargin (line 47) | @Override
    method drawLeadingMargin (line 56) | @Override
    method getLevel (line 69) | public int getLevel() {

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/core/spans/LastLineSpacingSpan.java
  class LastLineSpacingSpan (line 13) | public class LastLineSpacingSpan implements LineHeightSpan {
    method create (line 15) | @NonNull
    method LastLineSpacingSpan (line 22) | public LastLineSpacingSpan(@Px int spacing) {
    method chooseHeight (line 26) | @Override
    method selfEnd (line 35) | private static boolean selfEnd(int end, CharSequence text, Object span) {

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/core/spans/LinkSpan.java
  class LinkSpan (line 12) | public class LinkSpan extends URLSpan {
    method LinkSpan (line 18) | public LinkSpan(
    method onClick (line 28) | @Override
    method updateDrawState (line 33) | @Override
    method getLink (line 41) | @NonNull

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/core/spans/ObjectsPool.java
  class ObjectsPool (line 7) | abstract class ObjectsPool {
    method rect (line 19) | static Rect rect() {
    method rectF (line 23) | static RectF rectF() {
    method paint (line 27) | static Paint paint() {
    method ObjectsPool (line 31) | private ObjectsPool() {

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/core/spans/OrderedListItemSpan.java
  class OrderedListItemSpan (line 22) | public class OrderedListItemSpan extends BaseIconTextSpan implements Lea...
    method measure (line 44) | public static void measure(@NonNull TextView textView, @NonNull CharSe...
    method OrderedListItemSpan (line 78) | public OrderedListItemSpan(
    method getLeadingMarginIfUsed (line 96) | public int getLeadingMarginIfUsed() {
    method getProductLeading (line 100) | public int getProductLeading() {
    method getLeadingMargin (line 120) | @Override
    method applyListItemStyle (line 126) | private void applyListItemStyle(@NonNull Paint paint) {
    method drawLeadingMargin (line 134) | @Override
    method getImageUrl (line 244) | @Override
    method applyStyle (line 252) | @Override

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/core/spans/StrongEmphasisSpan.java
  class StrongEmphasisSpan (line 6) | public class StrongEmphasisSpan extends MetricAffectingSpan {
    method updateMeasureState (line 8) | @Override
    method updateDrawState (line 13) | @Override

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/core/spans/TextLayoutSpan.java
  class TextLayoutSpan (line 15) | public class TextLayoutSpan {
    method layoutOf (line 20) | @Nullable
    method layoutOf (line 28) | @Nullable
    method applyTo (line 40) | public static void applyTo(@NonNull Spannable spannable, @NonNull Layo...
    method TextLayoutSpan (line 61) | @SuppressWarnings("WeakerAccess")
    method layout (line 66) | @Nullable

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/core/spans/TextViewSpan.java
  class TextViewSpan (line 17) | public class TextViewSpan {
    method textViewOf (line 19) | @Nullable
    method textViewOf (line 27) | @Nullable
    method applyTo (line 35) | public static void applyTo(@NonNull Spannable spannable, @NonNull Text...
    method TextViewSpan (line 56) | public TextViewSpan(@NonNull TextView textView) {
    method textView (line 60) | @Nullable

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/core/spans/ThematicBreakSpan.java
  class ThematicBreakSpan (line 18) | public class ThematicBreakSpan implements LeadingMarginSpan, LineHeightS...
    method ThematicBreakSpan (line 26) | public ThematicBreakSpan(@NonNull MarkwonTheme theme) {
    method getLeadingMargin (line 31) | @Override
    method drawLeadingMargin (line 36) | @Override
    method chooseHeight (line 70) | @Override
    method selfStart (line 92) | private static boolean selfStart(int start, CharSequence text, Object ...

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/image/AsyncDrawable.java
  class AsyncDrawable (line 16) | public class AsyncDrawable extends Drawable {
    method AsyncDrawable (line 44) | public AsyncDrawable(
    method getDestination (line 64) | @NonNull
    method getPlaceholder (line 69) | public Drawable getPlaceholder(){
    method getImageSize (line 76) | @SuppressWarnings("WeakerAccess")
    method getImageSizeResolver (line 85) | @SuppressWarnings("unused")
    method hasKnownDimensions (line 94) | @SuppressWarnings({"unused", "WeakerAccess"})
    method getLastKnownCanvasWidth (line 103) | public int getLastKnownCanvasWidth() {
    method getLastKnowTextSize (line 111) | @SuppressWarnings("WeakerAccess")
    method getResult (line 116) | public Drawable getResult() {
    method hasResult (line 120) | public boolean hasResult() {
    method isAttached (line 124) | public boolean isAttached() {
    method setCallback2 (line 128) | public void setCallback2(@Nullable Callback cb) {
    method setPlaceholderResult (line 198) | @SuppressWarnings("WeakerAccess")
    method setResult (line 254) | public void setResult(@NonNull Drawable result) {
    method clearResult (line 276) | public void clearResult() {
    method initBounds (line 289) | private void initBounds() {
    method noDimensionsBounds (line 326) | @NonNull
    method initWithKnownDimensions (line 349) | @SuppressWarnings("WeakerAccess")
    method draw (line 360) | @Override
    method setAlpha (line 367) | @Override
    method setColorFilter (line 372) | @Override
    method getOpacity (line 377) | @Override
    method getIntrinsicWidth (line 388) | @Override
    method getIntrinsicHeight (line 400) | @Override
    method resolveBounds (line 415) | @NonNull
    method toString (line 424) | @NonNull
    class WrappedCallback (line 439) | private class WrappedCallback implements Callback {
      method WrappedCallback (line 443) | WrappedCallback(@NonNull Callback callback) {
      method invalidateDrawable (line 447) | @Override
      method scheduleDrawable (line 452) | @Override
      method unscheduleDrawable (line 457) | @Override

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/image/AsyncDrawableLoader.java
  class AsyncDrawableLoader (line 8) | public abstract class AsyncDrawableLoader {
    method noOp (line 13) | @NonNull
    method load (line 21) | public abstract void load(@NonNull AsyncDrawable drawable);
    method cancel (line 26) | public abstract void cancel(@NonNull AsyncDrawable drawable);
    method placeholder (line 28) | @Nullable

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/image/AsyncDrawableLoaderNoOp.java
  class AsyncDrawableLoaderNoOp (line 8) | class AsyncDrawableLoaderNoOp extends AsyncDrawableLoader {
    method load (line 9) | @Override
    method cancel (line 14) | @Override
    method placeholder (line 19) | @Nullable

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/image/AsyncDrawableScheduler.java
  class AsyncDrawableScheduler (line 16) | public abstract class AsyncDrawableScheduler {
    method schedule (line 18) | public static void schedule(@NonNull final TextView textView) {
    method unschedule (line 73) | public static void unschedule(@NonNull TextView view) {
    method extractSpans (line 91) | @Nullable
    method AsyncDrawableScheduler (line 110) | private AsyncDrawableScheduler() {
    class DrawableCallbackImpl (line 113) | private static class DrawableCallbackImpl implements Drawable.Callback {
      type Invalidator (line 117) | interface Invalidator {
        method invalidate (line 118) | void invalidate();
      method DrawableCallbackImpl (line 126) | DrawableCallbackImpl(
      method invalidateDrawable (line 135) | @Override
      method scheduleDrawable (line 165) | @Override
      method unscheduleDrawable (line 171) | @Override
    class TextViewInvalidator (line 177) | private static class TextViewInvalidator implements DrawableCallbackIm...
      method TextViewInvalidator (line 181) | TextViewInvalidator(@NonNull TextView textView) {
      method invalidate (line 185) | @Override
      method run (line 191) | @Override

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/image/AsyncDrawableSpan.java
  class AsyncDrawableSpan (line 28) | @SuppressWarnings("WeakerAccess")
    method getLiteral (line 31) | @Override
    method AsyncDrawableSpan (line 56) | public AsyncDrawableSpan(
    method AsyncDrawableSpan (line 73) | public AsyncDrawableSpan(
    method getUrl (line 89) | @Override
    method getType (line 94) | @Override
    method getTop (line 99) | @Override
    method getBottom (line 104) | @Override
    method click (line 109) | public void click() {
    method isClickable (line 115) | public boolean isClickable() {
    method getSize (line 119) | @Override
    method chooseHeight (line 157) | @Override
    method draw (line 188) | @Override
    method getDrawable (line 249) | @NonNull
    method textCenterY (line 254) | private static float textCenterY(int top, int bottom, @NonNull Paint p...

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/image/DrawableUtils.java
  class DrawableUtils (line 12) | public abstract class DrawableUtils {
    method intrinsicBounds (line 14) | @NonNull
    method applyIntrinsicBounds (line 20) | public static void applyIntrinsicBounds(@NonNull Drawable drawable) {
    method applyIntrinsicBoundsIfEmpty (line 24) | public static void applyIntrinsicBoundsIfEmpty(@NonNull Drawable drawa...
    method DrawableUtils (line 30) | private DrawableUtils() {

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/image/ImageProps.java
  class ImageProps (line 8) | public abstract class ImageProps {
    method ImageProps (line 18) | private ImageProps() {

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/image/ImageSize.java
  class ImageSize (line 8) | @SuppressWarnings("WeakerAccess")
    class Dimension (line 11) | public static class Dimension {
      method Dimension (line 16) | public Dimension(float value, @Nullable String unit) {
      method toString (line 21) | @Override
    method ImageSize (line 33) | public ImageSize(@Nullable Dimension width, @Nullable Dimension height) {
    method toString (line 38) | @Override

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/image/ImageSizeResolver.java
  class ImageSizeResolver (line 12) | public abstract class ImageSizeResolver {
    method resolveImageSize (line 17) | @NonNull

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/image/ImageSizeResolverDef.java
  class ImageSizeResolverDef (line 13) | @SuppressWarnings({"WeakerAccess", "unused"})
    method resolveImageSize (line 24) | @NonNull
    method resolveImageSize (line 35) | @NonNull
    method dpToPx (line 126) | private int dpToPx(Context context, float dp){
    method resolveAbsolute (line 134) | protected int resolveAbsolute(@NonNull ImageSize.Dimension dimension, ...

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/image/ImageSpanFactory.java
  class ImageSpanFactory (line 16) | public class ImageSpanFactory implements SpanFactory {
    method ImageSpanFactory (line 24) | public ImageSpanFactory(){
    method getSpans (line 26) | @Nullable
    method setImageCallback (line 54) | public void setImageCallback(IImageClickCallback clickCallback) {
    method isIsStreamOutput (line 58) | private boolean isIsStreamOutput() {
    method onStreamOutStateChanged (line 62) | public void onStreamOutStateChanged(boolean isStreamingOutput) {

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/image/destination/ImageDestinationProcessor.java
  class ImageDestinationProcessor (line 10) | public abstract class ImageDestinationProcessor {
    method process (line 11) | @NonNull
    method noOp (line 14) | @NonNull
    class NoOp (line 19) | private static class NoOp extends ImageDestinationProcessor {
      method process (line 21) | @NonNull

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/image/destination/ImageDestinationProcessorAssets.java
  class ImageDestinationProcessorAssets (line 20) | public class ImageDestinationProcessorAssets extends ImageDestinationPro...
    method create (line 22) | @NonNull
    method ImageDestinationProcessorAssets (line 35) | public ImageDestinationProcessorAssets() {
    method ImageDestinationProcessorAssets (line 39) | public ImageDestinationProcessorAssets(@Nullable ImageDestinationProce...
    method process (line 43) | @NonNull

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/image/destination/ImageDestinationProcessorRelativeToAbsolute.java
  class ImageDestinationProcessorRelativeToAbsolute (line 12) | public class ImageDestinationProcessorRelativeToAbsolute extends ImageDe...
    method create (line 14) | @NonNull
    method create (line 19) | public static ImageDestinationProcessorRelativeToAbsolute create(@NonN...
    method ImageDestinationProcessorRelativeToAbsolute (line 25) | public ImageDestinationProcessorRelativeToAbsolute(@NonNull String bas...
    method ImageDestinationProcessorRelativeToAbsolute (line 29) | public ImageDestinationProcessorRelativeToAbsolute(@NonNull URL base) {
    method process (line 33) | @NonNull
    method obtain (line 50) | @Nullable

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/movement/MovementMethodPlugin.java
  class MovementMethodPlugin (line 17) | public class MovementMethodPlugin extends AbstractMarkwonPlugin {
    method create (line 27) | @NonNull
    method link (line 36) | @NonNull
    method none (line 47) | @NonNull
    method create (line 52) | @NonNull
    method MovementMethodPlugin (line 63) | @SuppressWarnings("WeakerAccess")
    method configure (line 68) | @Override
    method beforeSetText (line 74) | @Override

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/node/OiintNode.java
  class OiintNode (line 4) | public class OiintNode extends CustomNode {
    method setIntegrationLimit (line 6) | public void setIntegrationLimit(String limit) {
    method getIntegrationLimit (line 9) | public String getIntegrationLimit() {

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/syntax/SyntaxHighlight.java
  type SyntaxHighlight (line 6) | @SuppressWarnings("WeakerAccess")
    method highlight (line 9) | @NonNull

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/syntax/SyntaxHighlightNoOp.java
  class SyntaxHighlightNoOp (line 6) | public class SyntaxHighlightNoOp implements SyntaxHighlight {
    method highlight (line 7) | @NonNull

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/utils/ColorUtils.java
  class ColorUtils (line 9) | public abstract class ColorUtils {
    method applyAlpha (line 11) | @ColorInt
    method blend (line 19) | @ColorInt
    method ColorUtils (line 31) | private ColorUtils() {

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/utils/Dip.java
  class Dip (line 7) | public class Dip {
    method create (line 9) | @NonNull
    method create (line 14) | @NonNull
    method Dip (line 21) | @SuppressWarnings("WeakerAccess")
    method toPx (line 26) | public int toPx(int dp) {

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/utils/DrawableUtils.java
  class DrawableUtils (line 10) | @Deprecated
    method intrinsicBounds (line 13) | public static void intrinsicBounds(@NonNull Drawable drawable) {
    method DrawableUtils (line 17) | private DrawableUtils() {

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/utils/DumpNodes.java
  class DumpNodes (line 15) | @SuppressWarnings({"unused", "WeakerAccess"})
    type NodeProcessor (line 21) | public interface NodeProcessor {
      method process (line 22) | @NonNull
    method dump (line 26) | @NonNull
    method dump (line 32) | @NonNull
    method DumpNodes (line 77) | private DumpNodes() {
    class Indent (line 80) | private static class Indent {
      method increment (line 84) | void increment() {
      method decrement (line 88) | void decrement() {
      method appendTo (line 92) | void appendTo(@NonNull StringBuilder builder) {
    method visitChildren (line 101) | private static void visitChildren(@NonNull Visitor visitor, @NonNull N...
    class NodeProcessorToString (line 112) | private static class NodeProcessorToString implements NodeProcessor {
      method process (line 113) | @NonNull

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/utils/LayoutUtils.java
  class LayoutUtils (line 11) | public abstract class LayoutUtils {
    method getLineBottomWithoutPaddingAndSpacing (line 16) | public static int getLineBottomWithoutPaddingAndSpacing(
    method getLineTopWithoutPadding (line 58) | public static int getLineTopWithoutPadding(@NonNull Layout layout, int...
    method getLineHeight (line 66) | public static int getLineHeight(@NonNull Layout layout, int line) {
    method LayoutUtils (line 70) | private LayoutUtils() {

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/utils/LeadingMarginUtils.java
  class LeadingMarginUtils (line 5) | public abstract class LeadingMarginUtils {
    method selfStart (line 7) | public static boolean selfStart(int start, CharSequence text, Object s...
    method selfEnd (line 11) | public static boolean selfEnd(int end, CharSequence text, Object span) {
    method LeadingMarginUtils (line 15) | private LeadingMarginUtils() {

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/utils/NoCopySpannableFactory.java
  class NoCopySpannableFactory (line 14) | public class NoCopySpannableFactory extends Spannable.Factory {
    method getInstance (line 16) | @NonNull
    method newSpannable (line 21) | @Override
    class Holder (line 28) | static class Holder {

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/utils/ParserUtils.java
  class ParserUtils (line 10) | public abstract class ParserUtils {
    method moveChildren (line 12) | public static void moveChildren(@NonNull Node to, @NonNull Node from) {
    method ParserUtils (line 23) | private ParserUtils() {

FILE: Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/utils/SpanUtils.java
  class SpanUtils (line 16) | public abstract class SpanUtils {
    method width (line 18) | public static int width(Canvas canvas, @NonNull CharSequence cs) {
    method isSelfEnd (line 44) | public static boolean isSelfEnd(int end, CharSequence text, Object spa...
    method isSelfStart (line 49) | public static boolean isSelfStart(int start, CharSequence text, Object...
    method isSelf (line 54) | public static boolean isSelf(int start, int end, CharSequence text, Ob...

FILE: Android/AntFluid/markwon-ext-latex/src/androidTest/java/io/noties/markwon/ext/latex/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 18) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 20) | @Test

FILE: Android/AntFluid/markwon-ext-latex/src/main/java/io/noties/markwon/ext/latex/JLatexAsyncDrawableSpan.java
  class JLatexAsyncDrawableSpan (line 20) | public class JLatexAsyncDrawableSpan extends AsyncDrawableSpan {
    method JLatexAsyncDrawableSpan (line 26) | public JLatexAsyncDrawableSpan(
    method draw (line 37) | @Override
    method drawable (line 53) | @NonNull
    method color (line 58) | @ColorInt

FILE: Android/AntFluid/markwon-ext-latex/src/main/java/io/noties/markwon/ext/latex/JLatexBlockImageSizeResolver.java
  class JLatexBlockImageSizeResolver (line 12) | class JLatexBlockImageSizeResolver extends ImageSizeResolver {
    method JLatexBlockImageSizeResolver (line 16) | JLatexBlockImageSizeResolver(boolean fitCanvas) {
    method resolveImageSize (line 20) | @NonNull

FILE: Android/AntFluid/markwon-ext-latex/src/main/java/io/noties/markwon/ext/latex/JLatexInlineAsyncDrawableSpan.java
  class JLatexInlineAsyncDrawableSpan (line 17) | class JLatexInlineAsyncDrawableSpan extends JLatexAsyncDrawableSpan {
    method JLatexInlineAsyncDrawableSpan (line 21) | JLatexInlineAsyncDrawableSpan(@NonNull MarkwonTheme theme, @NonNull JL...
    method getSize (line 26) | @Override

FILE: Android/AntFluid/markwon-ext-latex/src/main/java/io/noties/markwon/ext/latex/JLatexMathBlock.java
  class JLatexMathBlock (line 5) | public class JLatexMathBlock extends CustomBlock {
    method latex (line 9) | public String latex() {
    method latex (line 13) | public void latex(String latex) {

FILE: Android/AntFluid/markwon-ext-latex/src/main/java/io/noties/markwon/ext/latex/JLatexMathBlockParser.java
  class JLatexMathBlockParser (line 18) | class JLatexMathBlockParser extends AbstractBlockParser {
    method JLatexMathBlockParser (line 29) | JLatexMathBlockParser(int signs) {
    method getBlock (line 33) | @Override
    method tryContinue (line 38) | @Override
    method addLine (line 58) | @Override
    method closeBlock (line 64) | @Override
    class Factory (line 69) | public static class Factory extends AbstractBlockParserFactory {
      method tryStart (line 71) | @Override
    method consume (line 109) | @SuppressWarnings("SameParameterValue")

FILE: Android/AntFluid/markwon-ext-latex/src/main/java/io/noties/markwon/ext/latex/JLatexMathBlockParserLegacy.java
  class JLatexMathBlockParserLegacy (line 14) | class JLatexMathBlockParserLegacy extends AbstractBlockParser {
    method getBlock (line 22) | @Override
    method tryContinue (line 27) | @Override
    method addLine (line 37) | @Override
    method closeBlock (line 56) | @Override
    class Factory (line 65) | public static class Factory extends AbstractBlockParserFactory {
      method tryStart (line 67) | @Override

FILE: Android/AntFluid/markwon-ext-latex/src/main/java/io/noties/markwon/ext/latex/JLatexMathInlineProcessor.java
  class JLatexMathInlineProcessor (line 14) | class JLatexMathInlineProcessor extends InlineProcessor {
    method specialCharacter (line 19) | @Override
    method parse (line 24) | @Nullable

FILE: Android/AntFluid/markwon-ext-latex/src/main/java/io/noties/markwon/ext/latex/JLatexMathNode.java
  class JLatexMathNode (line 8) | public class JLatexMathNode extends CustomNode {
    method latex (line 12) | public String latex() {
    method latex (line 16) | public void latex(String latex) {

FILE: Android/AntFluid/markwon-ext-latex/src/main/java/io/noties/markwon/ext/latex/JLatexMathPlugin.java
  class JLatexMathPlugin (line 46) | public class JLatexMathPlugin extends AbstractMarkwonPlugin implements S...
    method init (line 51) | public static void init(Context context) {
    method onStreamOutStateChanged (line 55) | @Override
    type ErrorHandler (line 66) | public interface ErrorHandler {
      method handleError (line 74) | @Nullable
    type BuilderConfigure (line 78) | public interface BuilderConfigure {
      method configureBuilder (line 79) | void configureBuilder(@NonNull Builder builder);
    method create (line 82) | @NonNull
    method create (line 90) | @NonNull
    method create (line 95) | @NonNull
    method create (line 100) | @NonNull
    method create (line 110) | @NonNull
    method builder (line 120) | @NonNull
    method builder (line 128) | @NonNull
    class Config (line 133) | @VisibleForTesting
      method Config (line 149) | Config(@NonNull Builder builder) {
    method JLatexMathPlugin (line 171) | @SuppressWarnings("WeakerAccess")
    method configure (line 179) | @Override
    method configureParser (line 188) | @Override
    method configureVisitor (line 200) | @Override
    method addBlockVisitor (line 206) | private void addBlockVisitor(@NonNull MarkwonVisitor.Builder builder) {
    method handleVisitorAndJLatex (line 229) | private void handleVisitorAndJLatex(MarkwonVisitor visitor,String late...
    method isStreamingOutput (line 261) | private boolean isStreamingOutput() {
    method addInlineVisitor (line 265) | private void addInlineVisitor(@NonNull MarkwonVisitor.Builder builder) {
    method beforeSetText (line 285) | @Override
    method afterSetText (line 290) | @Override
    method prepareLatexTextPlaceholder (line 297) | @VisibleForTesting
    class Builder (line 303) | @SuppressWarnings({"unused", "UnusedReturnValue"})
      method Builder (line 320) | Builder(@NonNull JLatexMathTheme.Builder builder) {
      method theme (line 324) | @NonNull
      method blocksEnabled (line 332) | @NonNull
      method blocksLegacy (line 342) | @NonNull
      method inlinesEnabled (line 353) | @NonNull
      method errorHandler (line 359) | @NonNull
      method executorService (line 368) | @SuppressWarnings("WeakerAccess")
      method build (line 374) | @NonNull
    class JLatextAsyncDrawableLoader (line 381) | static class JLatextAsyncDrawableLoader extends AsyncDrawableLoader {
      method JLatextAsyncDrawableLoader (line 387) | JLatextAsyncDrawableLoader(@NonNull Config config) {
      method load (line 391) | @Override
      method cancel (line 451) | @Override
      method placeholder (line 465) | @Nullable
      method createBlockDrawable (line 472) | @NonNull
      method createInlineDrawable (line 503) | @NonNull
      method setResult (line 533) | private void setResult(@NonNull final AsyncDrawable drawable, @NonNu...
    class InlineImageSizeResolver (line 550) | private static class InlineImageSizeResolver extends ImageSizeResolver {
      method resolveImageSize (line 552) | @NonNull

FILE: Android/AntFluid/markwon-ext-latex/src/main/java/io/noties/markwon/ext/latex/JLatexMathTheme.java
  class JLatexMathTheme (line 15) | public abstract class JLatexMathTheme {
    method create (line 17) | @NonNull
    method create (line 22) | @NonNull
    method builder (line 27) | @NonNull
    method builder (line 32) | @NonNull
    type BackgroundProvider (line 42) | public interface BackgroundProvider {
      method provide (line 43) | @NonNull
    class Padding (line 50) | @SuppressWarnings("WeakerAccess")
      method Padding (line 57) | public Padding(int left, int top, int right, int bottom) {
      method toString (line 64) | @NonNull
      method all (line 75) | @NonNull
      method symmetric (line 80) | @NonNull
      method of (line 88) | @NonNull
    method inlineTextSize (line 98) | @Px
    method blockTextSize (line 105) | @Px
    method inlineBackgroundProvider (line 108) | @Nullable
    method blockBackgroundProvider (line 111) | @Nullable
    method blockFitCanvas (line 117) | public abstract boolean blockFitCanvas();
    method blockHorizontalAlignment (line 123) | @JLatexMathDrawable.Align
    method inlinePadding (line 126) | @Nullable
    method blockPadding (line 129) | @Nullable
    method inlineTextColor (line 132) | @ColorInt
    method blockTextColor (line 135) | @ColorInt
    class Builder (line 138) | @SuppressWarnings({"unused", "UnusedReturnValue"})
      method Builder (line 160) | Builder(float textSize, float inlineTextSize, float blockTextSize) {
      method backgroundProvider (line 166) | @NonNull
      method inlineBackgroundProvider (line 174) | @NonNull
      method blockBackgroundProvider (line 180) | @NonNull
      method blockFitCanvas (line 190) | @NonNull
      method blockHorizontalAlignment (line 196) | @NonNull
      method padding (line 202) | @NonNull
      method inlinePadding (line 210) | @NonNull
      method blockPadding (line 216) | @NonNull
      method textColor (line 222) | @NonNull
      method inlineTextColor (line 228) | @NonNull
      method blockTextColor (line 234) | @NonNull
      method build (line 240) | @NonNull
    class Impl (line 246) | static class Impl extends JLatexMathTheme {
      method Impl (line 268) | Impl(@NonNull Builder builder) {
      method inlineTextSize (line 285) | @Override
      method blockTextSize (line 293) | @Override
      method inlineBackgroundProvider (line 301) | @Nullable
      method blockBackgroundProvider (line 310) | @Nullable
      method blockFitCanvas (line 319) | @Override
      method blockHorizontalAlignment (line 324) | @Override
      method inlinePadding (line 329) | @Nullable
      method blockPadding (line 338) | @Nullable
      method inlineTextColor (line 347) | @Override
      method blockTextColor (line 355) | @Override

FILE: Android/AntFluid/markwon-ext-latex/src/main/java/io/noties/markwon/ext/latex/JLatextAsyncDrawable.java
  class JLatextAsyncDrawable (line 14) | class JLatextAsyncDrawable extends AsyncDrawable {
    method JLatextAsyncDrawable (line 18) | JLatextAsyncDrawable(
    method isBlock (line 29) | public boolean isBlock() {

FILE: Android/AntFluid/markwon-ext-latex/src/test/java/io/noties/markwon/ext/latex/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test

FILE: Android/AntFluid/markwon-ext-strikethrough/src/androidTest/java/io/noties/markwon/ext/strikethrough/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 18) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 20) | @Test

FILE: Android/AntFluid/markwon-ext-strikethrough/src/main/java/io/noties/markwon/ext/strikethrough/StrikethroughPlugin.java
  class StrikethroughPlugin (line 28) | public class StrikethroughPlugin extends AbstractMarkwonPlugin {
    method create (line 30) | @NonNull
    method configureParser (line 35) | @Override
    method configureSpansFactory (line 40) | @Override
    method configureVisitor (line 50) | @Override

FILE: Android/AntFluid/markwon-ext-strikethrough/src/test/java/io/noties/markwon/ext/strikethrough/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test

FILE: Android/AntFluid/markwon-ext-tables/src/androidTest/java/io/noties/markwon/ext/tables/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 18) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 20) | @Test

FILE: Android/AntFluid/markwon-ext-tables/src/main/java/com/fluid/afm/BaseBlockTitleSpan.java
  class BaseBlockTitleSpan (line 31) | public class BaseBlockTitleSpan implements LeadingMarginSpan {
    method BaseBlockTitleSpan (line 45) | public BaseBlockTitleSpan(Context context, int height, int textSize) {
    method BaseBlockTitleSpan (line 51) | public BaseBlockTitleSpan(Context context, int height, int textSize, i...
    method getLeadingMargin (line 58) | @Override
    method drawLeadingMargin (line 63) | @Override
    method drawBorder (line 90) | private void drawBorder(Canvas c, Paint p, int top, int layoutWidth) {
    method drawBorder (line 108) | protected boolean drawBorder() {
    method applyBorderStyle (line 111) | protected void applyBorderStyle(Paint paint) {
    method getBackgroundColor (line 114) | protected int getBackgroundColor() {
    method drawBackground (line 126) | protected void drawBackground(Canvas c, Paint p, int top, int layoutWi...
    method getBorderColor (line 144) | protected int getBorderColor() {
    method getBorderWidth (line 147) | protected int getBorderWidth() {
    method drawLine (line 151) | protected boolean drawLine() {
    method getBackgroundRadius (line 155) | protected int getBackgroundRadius() {
    method drawHeaderText (line 169) | private void drawHeaderText(Canvas c, Paint p, CharSequence text, int ...
    method getTextSize (line 182) | protected float getTextSize() {
    method getTextColor (line 185) | protected int getTextColor() {
    method getHeaderTextLeftPadding (line 189) | protected int getHeaderTextLeftPadding() {
    method drawCopyIcon (line 193) | private void drawCopyIcon(Canvas c, Paint p, int start, int end, int t...
    method drawMagnifyIcon (line 213) | private void drawMagnifyIcon(Canvas c, Paint p, int start, int end, in...
    method getIconRightMargin (line 236) | protected int getIconRightMargin() {
    method drawRectWithTopRound (line 240) | private void drawRectWithTopRound(Canvas canvas, Paint paint,
    method getBlockTitle (line 256) | protected String getBlockTitle(CharSequence text, int start) {
    method whoClicked (line 268) | protected CodeBlockTitleSpan.CodeSpanModel whoClicked(int x, int y) {
    method handleClickEvent (line 280) | public boolean handleClickEvent(View widget, Spanned spanned, int x, i...
    method onCopyClicked (line 290) | public void onCopyClicked(final View widget, final String codeContent) {
    method onMagnifyClicked (line 306) | public void onMagnifyClicked(View widget, String content) {
    method getPreviewBundle (line 316) | protected Bundle getPreviewBundle( String content) {
    class CodeSpanModel (line 323) | public static class CodeSpanModel {
      method toString (line 328) | @Override
    type ClickRectType (line 334) | public enum ClickRectType {

FILE: Android/AntFluid/markwon-ext-tables/src/main/java/com/fluid/afm/CodeBlockLineSpacingSpan.java
  class CodeBlockLineSpacingSpan (line 6) | public class CodeBlockLineSpacingSpan extends TopSpacingSpan {
    method CodeBlockLineSpacingSpan (line 10) | public CodeBlockLineSpacingSpan(int topLineSpacingHeight, int reducedL...
    method chooseHeight (line 16) | @Override
    method selfEnd (line 33) | private boolean selfEnd(int end, CharSequence text, Object span) {

FILE: Android/AntFluid/markwon-ext-tables/src/main/java/com/fluid/afm/CodeBlockTitleSpan.java
  class CodeBlockTitleSpan (line 19) | @Keep
    method CodeBlockTitleSpan (line 25) | public CodeBlockTitleSpan(Context context, MarkwonTheme theme, int hei...
    method getBackgroundRadius (line 39) | protected int getBackgroundRadius() {
    method CodeBlockTitleSpan (line 46) | public CodeBlockTitleSpan(Context context, int height, int textSize, i...
    method drawBorder (line 59) | @Override
    method applyBorderStyle (line 64) | @Override
    method getBlockContent (line 71) | protected String getBlockContent(ClickRectType clickRectType, Spanned ...
    method handleClickEvent (line 86) | @Override
    method getBlockTitle (line 106) | protected String getBlockTitle(CharSequence text, int start) {
    method getTextColor (line 117) | @Override
    method getTextSize (line 125) | @Override
    method getBackgroundColor (line 133) | @Override
    method getBorderColor (line 141) | @Override
    method getBorderWidth (line 149) | @Override
    method getPreviewBundle (line 154) | protected Bundle getPreviewBundle(String content) {

FILE: Android/AntFluid/markwon-ext-tables/src/main/java/com/fluid/afm/IMarkdownLayer.java
  type IMarkdownLayer (line 3) | public interface IMarkdownLayer {
    method getViewMaxWidth (line 4) | int getViewMaxWidth();
    method getOriginText (line 6) | String getOriginText();

FILE: Android/AntFluid/markwon-ext-tables/src/main/java/com/fluid/afm/MarkdownAwareMovementMethod.java
  class MarkdownAwareMovementMethod (line 20) | public class MarkdownAwareMovementMethod implements MovementMethod {
    method wrap (line 23) | @NonNull
    method create (line 31) | @NonNull
    method handleCodeBlockTouchEvent (line 36) | public static boolean handleCodeBlockTouchEvent(
    method handleTableRowTouchEvent (line 65) | public static boolean handleTableRowTouchEvent(
    method MarkdownAwareMovementMethod (line 101) | public MarkdownAwareMovementMethod(@NonNull MovementMethod wrapped) {
    method initialize (line 105) | @Override
    method onKeyDown (line 110) | @Override
    method onKeyUp (line 115) | @Override
    method onKeyOther (line 120) | @Override
    method onTakeFocus (line 125) | @Override
    method onTrackballEvent (line 130) | @Override
    method onTouchEvent (line 135) | @Override
    method handleImageTouchEvent (line 144) | private boolean handleImageTouchEvent(TextView widget, Spannable buffe...
    method onGenericMotionEvent (line 173) | @Override
    method canSelectArbitrarily (line 178) | @Override

FILE: Android/AntFluid/markwon-ext-tables/src/main/java/com/fluid/afm/TableBlockTitleBlockSpan.java
  class TableBlockTitleBlockSpan (line 26) | public class TableBlockTitleBlockSpan extends BaseBlockTitleSpan {
    method setCurrentTableBlock (line 35) | public static void setCurrentTableBlock(TableBlock currentTableBlock) {
    method getCurrentTableBlock (line 39) | public static TableBlock getCurrentTableBlock() {
    method TableBlockTitleBlockSpan (line 43) | public TableBlockTitleBlockSpan(Context context, int height, TableStyl...
    method setTableBlock (line 59) | public void setTableBlock(TableBlock tableBlock) {
    method getBackgroundColor (line 63) | @Override
    method drawLine (line 68) | protected boolean drawLine() {
    method getTextSize (line 72) | @Override
    method drawBackground (line 77) | @Override
    method drawBorder (line 99) | @Override
    method applyBorderStyle (line 104) | @Override
    method getBorderColor (line 109) | @Override
    method getBackgroundRadius (line 114) | protected int getBackgroundRadius() {
    method getIconRightMargin (line 118) | protected int getIconRightMargin() {
    method getHeaderTextLeftPadding (line 122) | protected int getHeaderTextLeftPadding() {
    method getBlockTitle (line 133) | protected String getBlockTitle(CharSequence text, int start) {
    method getTextColor (line 140) | @Override
    method getBlockContent (line 145) | protected String getBlockContent(View view) {
    method handleClickEvent (line 149) | @Override
    method onMagnifyClicked (line 167) | @Override
    method getPreviewBundle (line 189) | protected Bundle getPreviewBundle(String content) {
    method getTableMarkdown (line 197) | protected String getTableMarkdown(View view) {

FILE: Android/AntFluid/markwon-ext-tables/src/main/java/com/fluid/afm/TableLineSpacingSpan.java
  class TableLineSpacingSpan (line 6) | public class TableLineSpacingSpan implements LineHeightSpan {
    method TableLineSpacingSpan (line 11) | public TableLineSpacingSpan(boolean header, int reducedLineHeight) {
    method chooseHeight (line 16) | @Override

FILE: Android/AntFluid/markwon-ext-tables/src/main/java/com/fluid/afm/TopSpacingSpan.java
  class TopSpacingSpan (line 7) | public class TopSpacingSpan implements LineHeightSpan {
    method TopSpacingSpan (line 11) | public TopSpacingSpan(int height) {
    method chooseHeight (line 15) | @Override
    method selfStart (line 25) | protected boolean selfStart(int start, CharSequence text, Object span) {

FILE: Android/AntFluid/markwon-ext-tables/src/main/java/io/noties/markwon/ext/tables/Table.java
  class Table (line 28) | public class Table {
    method parse (line 37) | @Nullable
    class Row (line 55) | public static class Row {
      method Row (line 60) | public Row(
      method header (line 67) | public boolean header() {
      method columns (line 71) | @NonNull
      method toString (line 76) | @Override
    class Column (line 85) | public static class Column {
      method Column (line 90) | public Column(@NonNull Alignment alignment, @NonNull Spanned content) {
      method alignment (line 95) | @NonNull
      method content (line 100) | @NonNull
      method toString (line 105) | @Override
    type Alignment (line 114) | public enum Alignment {
    method Table (line 122) | public Table(@NonNull List<Row> rows) {
    method rows (line 126) | @NonNull
    method toString (line 131) | @Override
    class ParseVisitor (line 138) | static class ParseVisitor extends AbstractVisitor {
      method ParseVisitor (line 147) | ParseVisitor(@NonNull Markwon markwon) {
      method rows (line 151) | @Nullable
      method visit (line 156) | @Override
      method alignment (line 197) | @NonNull

FILE: Android/AntFluid/markwon-ext-tables/src/main/java/io/noties/markwon/ext/tables/TablePlugin.java
  class TablePlugin (line 60) | public class TablePlugin extends AbstractMarkwonPlugin implements Stream...
    method create (line 65) | @NonNull
    method create (line 70) | @NonNull
    method TablePlugin (line 75) | @SuppressWarnings("WeakerAccess")
    method TablePlugin (line 80) | TablePlugin(Context context, boolean isHideHeader) {
    method onStreamOutStateChanged (line 84) | @Override
    method configure (line 91) | @Override
    method configureTheme (line 96) | @Override
    method configureConfiguration (line 101) | @Override
    method configureSpansFactory (line 106) | @Override
    method processMarkdown (line 111) | @NonNull
    method afterRender (line 118) | @Override
    method configureParser (line 125) | @Override
    method configureVisitor (line 130) | @Override
    method beforeRender (line 135) | @Override
    method beforeSetText (line 141) | @Override
    method afterSetText (line 146) | @Override
    class TableVisitor (line 151) | private static class TableVisitor {
      method TableVisitor (line 177) | TableVisitor(Context context) {
      method TableVisitor (line 181) | TableVisitor(Context context, boolean isHideTitle) {
      method isStreamingOutput (line 186) | public boolean isStreamingOutput() {
      method setStreamingOutput (line 190) | public void setStreamingOutput(boolean streamingOutput) {
      method clear (line 194) | void clear() {
      method configure (line 201) | void configure(@NonNull MarkwonVisitor.Builder builder) {
      method getTableIndex (line 245) | private int getTableIndex(int contentIndex) {
      method visitRow (line 259) | private void visitRow(@NonNull MarkwonVisitor visitor, @NonNull Node...
      method getTableBlock (line 382) | private TableBlock getTableBlock(Node node) {
      method cacheAndUpdateTableCurrentMaxNumber (line 392) | private void cacheAndUpdateTableCurrentMaxNumber(int tableIndex, Tab...
      method updateCachedTableCurrentMaxNumber (line 409) | private void updateCachedTableCurrentMaxNumber(int tableIndex) {
      method tableCellAlignment (line 441) | @TableRowSpan.Alignment
      method findCurrentTableEnd (line 465) | private boolean findCurrentTableEnd(int tableIndex) {
      method getCachedSpan (line 496) | private TableRowSpan getCachedSpan(int tableIndex, int length) {
      method cacheSpan (line 500) | private void cacheSpan(int tableIndex, int length, TableRowSpan span) {
      method getSpanCache (line 504) | private ConcurrentHashMap<String, TableRowSpan> getSpanCache(int tab...
    class MyTablesExtension (line 514) | public static class MyTablesExtension implements Parser.ParserExtensio...
      method MyTablesExtension (line 515) | private MyTablesExtension() {
      method create (line 518) | public static Extension create() {
      method extend (line 522) | public void extend(Parser.Builder parserBuilder) {
      method extend (line 526) | public void extend(HtmlRenderer.Builder rendererBuilder) {
      method extend (line 530) | public void extend(TextContentRenderer.Builder rendererBuilder) {
      class MyTableBlockParser (line 534) | public static class MyTableBlockParser extends AbstractBlockParser {
        method MyTableBlockParser (line 543) | private MyTableBlockParser(List<TableCell.Alignment> columns, List...
        method canHaveLazyContinuationLines (line 552) | public boolean canHaveLazyContinuationLines() {
        method getBlock (line 556) | public Block getBlock() {
        method tryContinue (line 560) | public BlockContinue tryContinue(ParserState state) {
        method addLine (line 569) | public void addLine(CharSequence line) {
        method parseInlines (line 607) | public void parseInlines(InlineParser inlineParser) {
        method parseCell (line 646) | private TableCell parseCell(String cell, int column, InlineParser ...
        method split (line 656) | private static List<String> split(CharSequence input) {
        method parseSeparator (line 693) | private static List<TableCell.Alignment> parseSeparator(CharSequen...
        method getAlignment (line 757) | private static TableCell.Alignment getAlignment(boolean left, bool...
        method isContainer (line 767) | @Override
        method canContain (line 772) | @Override
        class Factory (line 777) | public static class Factory extends AbstractBlockParserFactory {
          method Factory (line 778) | public Factory() {
          method tryStart (line 781) | public BlockStart tryStart(ParserState state, MatchedBlockParser...

FILE: Android/AntFluid/markwon-ext-tables/src/main/java/io/noties/markwon/ext/tables/TableRowSpan.java
  class TableRowSpan (line 39) | public class TableRowSpan extends ReplacementSpan {
    type Invalidator (line 50) | public interface Invalidator {
      method invalidate (line 51) | void invalidate();
    class Cell (line 54) | public static class Cell {
      method Cell (line 59) | public Cell(@Alignment int alignment, CharSequence text) {
      method alignment (line 64) | @Alignment
      method text (line 69) | public CharSequence text() {
      method toString (line 73) | @NonNull
    method TableRowSpan (line 102) | public TableRowSpan(
    method TableRowSpan (line 119) | public TableRowSpan(
    method updateCurrentMaxRows (line 142) | public void updateCurrentMaxRows(int currentMaxRows) {
    method getSize (line 146) | @Override
    method draw (line 226) | @Override
    method drawLineWithBottomRound (line 431) | private void drawLineWithBottomRound(Canvas canvas, Paint paint,
    method drawRectWithBottomRound (line 453) | private void drawRectWithBottomRound(Canvas canvas, Paint paint, RectF...
    method drawRectWithBottomRound (line 457) | private void drawRectWithBottomRound(Canvas canvas, Paint paint,
    method recreateLayouts (line 504) | private boolean recreateLayouts(int newWidth, float x) {
    method makeNewLayouts (line 508) | private void makeNewLayouts() {
    method makeLayout (line 525) | private void makeLayout(final int index, final int width, @NonNull fin...
    method scheduleAsyncDrawables (line 563) | private void scheduleAsyncDrawables(@NonNull Spannable spannable, @Non...
    method findLayoutForHorizontalOffset (line 594) | @Nullable
    method cellWidth (line 608) | public int cellWidth() {
    method cellWidth (line 613) | protected float cellWidth(int size) {
    method alignment (line 617) | @SuppressLint("SwitchIntDef")
    method invalidator (line 634) | public void invalidator(@Nullable Invalidator invalidator) {
    class CallbackAdapter (line 638) | private static abstract class CallbackAdapter implements Drawable.Call...
      method invalidateDrawable (line 639) | @Override
      method scheduleDrawable (line 644) | @Override
      method unscheduleDrawable (line 649) | @Override

FILE: Android/AntFluid/markwon-ext-tables/src/main/java/io/noties/markwon/ext/tables/TableRowsScheduler.java
  class TableRowsScheduler (line 11) | abstract class TableRowsScheduler {
    method schedule (line 13) | static void schedule(@NonNull final TextView view) {
    method unschedule (line 62) | static void unschedule(@NonNull TextView view) {
    method extract (line 72) | @Nullable
    method TableRowsScheduler (line 84) | private TableRowsScheduler() {

FILE: Android/AntFluid/markwon-ext-tables/src/main/java/io/noties/markwon/ext/tables/TableSpan.java
  class TableSpan (line 6) | public class TableSpan {

FILE: Android/AntFluid/markwon-ext-tables/src/test/java/io/noties/markwon/ext/tables/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test

FILE: Android/AntFluid/markwon-ext-tasklist/src/androidTest/java/io/noties/markwon/ext/tasklist/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 18) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 20) | @Test

FILE: Android/AntFluid/markwon-ext-tasklist/src/main/java/io/noties/markwon/ext/tasklist/TaskListDrawable.java
  class TaskListDrawable (line 20) | @SuppressWarnings("WeakerAccess")
    method TaskListDrawable (line 41) | public TaskListDrawable(
    method onBoundsChange (line 52) | @Override
    method draw (line 75) | @Override
    method setAlpha (line 113) | @Override
    method setColorFilter (line 118) | @Override
    method getOpacity (line 123) | @Override
    method isStateful (line 128) | @Override
    method onStateChange (line 133) | @Override
    class Point (line 166) | private static class Point {
      method Point (line 171) | Point(float x, float y) {
      method moveTo (line 176) | void moveTo(@NonNull Path path, float side) {
      method lineTo (line 180) | void lineTo(@NonNull Path path, float side) {

FILE: Android/AntFluid/markwon-ext-tasklist/src/main/java/io/noties/markwon/ext/tasklist/TaskListItem.java
  class TaskListItem (line 10) | @SuppressWarnings("WeakerAccess")
    method TaskListItem (line 15) | public TaskListItem(boolean isDone) {
    method isDone (line 19) | public boolean isDone() {
    method toString (line 23) | @Override

FILE: Android/AntFluid/markwon-ext-tasklist/src/main/java/io/noties/markwon/ext/tasklist/TaskListPlugin.java
  class TaskListPlugin (line 22) | public class TaskListPlugin extends AbstractMarkwonPlugin {
    method create (line 32) | @NonNull
    method create (line 37) | @NonNull
    method create (line 48) | @NonNull
    method TaskListPlugin (line 61) | private TaskListPlugin(@NonNull Drawable drawable) {
    method configureParser (line 65) | @Override
    method configureSpansFactory (line 70) | @Override
    method configureVisitor (line 75) | @Override
    method resolve (line 97) | private static int resolve(@NonNull Context context, @AttrRes int attr) {

FILE: Android/AntFluid/markwon-ext-tasklist/src/main/java/io/noties/markwon/ext/tasklist/TaskListPostProcessor.java
  class TaskListPostProcessor (line 19) | class TaskListPostProcessor implements PostProcessor {
    method process (line 21) | @Override
    class TaskListVisitor (line 28) | private static class TaskListVisitor extends AbstractVisitor {
      method visit (line 32) | @Override

FILE: Android/AntFluid/markwon-ext-tasklist/src/main/java/io/noties/markwon/ext/tasklist/TaskListProps.java
  class TaskListProps (line 8) | public abstract class TaskListProps {
    method TaskListProps (line 12) | private TaskListProps() {

FILE: Android/AntFluid/markwon-ext-tasklist/src/main/java/io/noties/markwon/ext/tasklist/TaskListSpan.java
  class TaskListSpan (line 18) | public class TaskListSpan implements LeadingMarginSpan {
    method TaskListSpan (line 32) | public TaskListSpan(@NonNull MarkwonTheme theme, @NonNull Drawable dra...
    method isDone (line 41) | public boolean isDone() {
    method setDone (line 51) | public void setDone(boolean isDone) {
    method getLeadingMargin (line 55) | @Override
    method drawLeadingMargin (line 60) | @Override

FILE: Android/AntFluid/markwon-ext-tasklist/src/main/java/io/noties/markwon/ext/tasklist/TaskListSpanFactory.java
  class TaskListSpanFactory (line 12) | public class TaskListSpanFactory implements SpanFactory {
    method TaskListSpanFactory (line 16) | public TaskListSpanFactory(@NonNull Drawable drawable) {
    method getSpans (line 20) | @Nullable

FILE: Android/AntFluid/markwon-ext-tasklist/src/test/java/io/noties/markwon/ext/tasklist/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test

FILE: Android/AntFluid/markwon-html/src/androidTest/java/io/noties/markwon/html/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 18) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 20) | @Test

FILE: Android/AntFluid/markwon-html/src/main/java/com/fluid/afm/spans/DefinitionListSpan.java
  class DefinitionListSpan (line 9) | public class DefinitionListSpan implements LeadingMarginSpan {
    method getLeadingMargin (line 12) | @Override
    method drawLeadingMargin (line 17) | @Override
    class TermSpan (line 24) | public static class TermSpan extends StyleSpan {
      method TermSpan (line 25) | public TermSpan() {
    class DescriptionSpan (line 31) | public static class DescriptionSpan implements LeadingMarginSpan {
      method getLeadingMargin (line 34) | @Override
      method drawLeadingMargin (line 39) | @Override

FILE: Android/AntFluid/markwon-html/src/main/java/com/fluid/afm/tag/DefinitionListTagHandler.java
  class DefinitionListTagHandler (line 16) | public class DefinitionListTagHandler extends SimpleTagHandler {
    method getSpans (line 18) | @Nullable
    method supportedTags (line 37) | @NonNull
    method create (line 43) | public static DefinitionListTagHandler create() {

FILE: Android/AntFluid/markwon-html/src/main/java/io/noties/markwon/html/AppendableUtils.java
  class AppendableUtils (line 7) | abstract class AppendableUtils {
    method appendQuietly (line 9) | static void appendQuietly(@NonNull Appendable appendable, char c) {
    method appendQuietly (line 17) | static void appendQuietly(@NonNull Appendable appendable, @NonNull Cha...
    method appendQuietly (line 25) | static void appendQuietly(@NonNull Appendable appendable, @NonNull Cha...
    method AppendableUtils (line 33) | private AppendableUtils() {

FILE: Android/AntFluid/markwon-html/src/main/java/io/noties/markwon/html/CssInlineStyleParser.java
  class CssInlineStyleParser (line 11) | public abstract class CssInlineStyleParser {
    method parse (line 13) | @NonNull
    method create (line 16) | @NonNull
    class Impl (line 21) | static class Impl extends CssInlineStyleParser {
      method parse (line 23) | @NonNull
      class CssIterable (line 29) | private static class CssIterable implements Iterable<CssProperty> {
        method CssIterable (line 33) | CssIterable(@NonNull String input) {
        method iterator (line 37) | @NonNull
        class CssIterator (line 43) | private class CssIterator implements Iterator<CssProperty> {
          method hasNext (line 53) | @Override
          method next (line 61) | @Override
          method prepareNext (line 69) | private void prepareNext() {
          method hasNextPrepared (line 161) | private boolean hasNextPrepared() {
          method hasValues (line 165) | private boolean hasValues(@Nullable String key, @Nullable String...

FILE: Android/AntFluid/markwon-html/src/main/java/io/noties/markwon/html/CssProperty.java
  class CssProperty (line 5) | public class CssProperty {
    method CssProperty (line 10) | CssProperty() {
    method set (line 13) | void set(@NonNull String key, @NonNull String value) {
    method key (line 18) | @NonNull
    method value (line 23) | @NonNull
    method mutate (line 28) | @NonNull
    method toString (line 35) | @Override

FILE: Android/AntFluid/markwon-html/src/main/java/io/noties/markwon/html/HtmlEmptyTagReplacement.java
  class HtmlEmptyTagReplacement (line 16) | public class HtmlEmptyTagReplacement {
    method create (line 18) | @NonNull
    method replace (line 30) | @Nullable

FILE: Android/AntFluid/markwon-html/src/main/java/io/noties/markwon/html/HtmlPlugin.java
  class HtmlPlugin (line 30) | public class HtmlPlugin extends AbstractMarkwonPlugin {
    type HtmlConfigure (line 36) | public interface HtmlConfigure {
      method configureHtml (line 37) | void configureHtml(@NonNull HtmlPlugin plugin);
    method create (line 40) | @NonNull
    method create (line 48) | @NonNull
    method HtmlPlugin (line 65) | @SuppressWarnings("WeakerAccess")
    method allowNonClosedTags (line 75) | @NonNull
    method addHandler (line 84) | @NonNull
    method getHandler (line 93) | @Nullable
    method excludeDefaults (line 106) | @NonNull
    method emptyTagReplacement (line 116) | @NonNull
    method configureConfiguration (line 122) | @Override
    method afterRender (line 151) | @Override
    method configureVisitor (line 161) | @Override
    method visitHtml (line 181) | private void visitHtml(@NonNull MarkwonVisitor visitor, @Nullable Stri...

FILE: Android/AntFluid/markwon-html/src/main/java/io/noties/markwon/html/HtmlTag.java
  type HtmlTag (line 14) | public interface HtmlTag {
    method name (line 21) | @NonNull
    method start (line 27) | int start();
    method end (line 32) | int end();
    method isEmpty (line 37) | boolean isEmpty();
    method isClosed (line 43) | boolean isClosed();
    method attributes (line 45) | @NonNull
    method isInline (line 51) | boolean isInline();
    method isBlock (line 56) | boolean isBlock();
    method getAsInline (line 58) | @NonNull
    method getAsBlock (line 61) | @NonNull
    type Inline (line 67) | interface Inline extends HtmlTag {
    type Block (line 74) | interface Block extends HtmlTag {
      method parent (line 79) | @Nullable
      method children (line 85) | @NonNull
      method isRoot (line 92) | boolean isRoot();

FILE: Android/AntFluid/markwon-html/src/main/java/io/noties/markwon/html/HtmlTagImpl.java
  class HtmlTagImpl (line 10) | abstract class HtmlTagImpl implements HtmlTag {
    method HtmlTagImpl (line 17) | protected HtmlTagImpl(@NonNull String name, int start, @NonNull Map<St...
    method name (line 23) | @NonNull
    method start (line 29) | @Override
    method end (line 34) | @Override
    method isEmpty (line 39) | @Override
    method attributes (line 44) | @NonNull
    method isClosed (line 50) | @Override
    method closeAt (line 55) | abstract void closeAt(int end);
    class InlineImpl (line 58) | static class InlineImpl extends HtmlTagImpl implements Inline {
      method InlineImpl (line 60) | InlineImpl(@NonNull String name, int start, @NonNull Map<String, Str...
      method closeAt (line 64) | @Override
      method toString (line 71) | @Override
      method isInline (line 81) | @Override
      method isBlock (line 86) | @Override
      method getAsInline (line 91) | @NonNull
      method getAsBlock (line 97) | @NonNull
    class BlockImpl (line 104) | static class BlockImpl extends HtmlTagImpl implements Block {
      method root (line 106) | @NonNull
      method create (line 111) | @NonNull
      method BlockImpl (line 123) | @SuppressWarnings("NullableProblems")
      method closeAt (line 133) | @Override
      method isRoot (line 145) | @Override
      method parent (line 150) | @Nullable
      method children (line 156) | @NonNull
      method attributes (line 168) | @NonNull
      method isInline (line 174) | @Override
      method isBlock (line 179) | @Override
      method getAsInline (line 184) | @NonNull
      method getAsBlock (line 190) | @NonNull
      method toString (line 196) | @Override

FILE: Android/AntFluid/markwon-html/src/main/java/io/noties/markwon/html/MarkwonHtmlParser.java
  class MarkwonHtmlParser (line 10) | public abstract class MarkwonHtmlParser {
    type FlushAction (line 12) | public interface FlushAction<T> {
      method apply (line 13) | void apply(@NonNull List<T> tags);
    method processFragment (line 16) | public abstract <T extends Appendable & CharSequence> void processFrag...
    method flushInlineTags (line 31) | public abstract void flushInlineTags(
    method flushBlockTags (line 46) | public abstract void flushBlockTags(
    method reset (line 50) | public abstract void reset();

FILE: Android/AntFluid/markwon-html/src/main/java/io/noties/markwon/html/MarkwonHtmlParserImpl.java
  class MarkwonHtmlParserImpl (line 29) | public class MarkwonHtmlParserImpl extends MarkwonHtmlParser {
    method create (line 31) | @NonNull
    method create (line 36) | @NonNull
    method MarkwonHtmlParserImpl (line 123) | MarkwonHtmlParserImpl(
    method processFragment (line 130) | @Override
    method flushInlineTags (line 186) | @Override
    method flushBlockTags (line 203) | @Override
    method reset (line 225) | @Override
    method processInlineTagStart (line 232) | protected <T extends Appendable & CharSequence> void processInlineTagS...
    method processInlineTagEnd (line 260) | protected <T extends Appendable & CharSequence> void processInlineTagEnd(
    method processBlockTagStart (line 279) | protected <T extends Appendable & CharSequence> void processBlockTagSt...
    method processBlockTagEnd (line 332) | protected <T extends Appendable & CharSequence> void processBlockTagEnd(
    method processCharacter (line 365) | protected <T extends Appendable & CharSequence> void processCharacter(
    method appendBlockChild (line 380) | protected void appendBlockChild(@NonNull HtmlTagImpl.BlockImpl parent,...
    method findOpenInlineTag (line 389) | @Nullable
    method findOpenBlockTag (line 405) | @Nullable
    method ensureNewLineIfPreviousWasBlock (line 418) | protected <T extends Appendable & CharSequence> void ensureNewLineIfPr...
    method isInlineTag (line 426) | protected static boolean isInlineTag(@NonNull String name) {
    method isVoidTag (line 430) | protected static boolean isVoidTag(@NonNull String name) {
    method isBlockTag (line 434) | protected static boolean isBlockTag(@NonNull String name) {
    method ensureNewLine (line 438) | protected static <T extends Appendable & CharSequence> void ensureNewL...
    method extractAttributes (line 446) | @NonNull
    method isEmpty (line 467) | protected static <T extends Appendable & CharSequence> boolean isEmpty(
    method appendEmptyTagReplacement (line 473) | protected <T extends Appendable & CharSequence> void appendEmptyTagRep...

FILE: Android/AntFluid/markwon-html/src/main/java/io/noties/markwon/html/MarkwonHtmlRenderer.java
  class MarkwonHtmlRenderer (line 11) | public abstract class MarkwonHtmlRenderer {
    method render (line 13) | public abstract void render(
    method tagHandler (line 18) | @Nullable

FILE: Android/AntFluid/markwon-html/src/main/java/io/noties/markwon/html/MarkwonHtmlRendererImpl.java
  class MarkwonHtmlRendererImpl (line 13) | class MarkwonHtmlRendererImpl extends MarkwonHtmlRenderer {
    method MarkwonHtmlRendererImpl (line 18) | @SuppressWarnings("WeakerAccess")
    method render (line 24) | @Override
    method tagHandler (line 83) | @Nullable
    class Builder (line 89) | static class Builder {
      method allowNonClosedTags (line 97) | void allowNonClosedTags(boolean allowNonClosedTags) {
      method addHandler (line 102) | void addHandler(@NonNull TagHandler tagHandler) {
      method getHandler (line 109) | @Nullable
      method excludeDefaults (line 115) | public void excludeDefaults(boolean excludeDefaults) {
      method excludeDefaults (line 120) | boolean excludeDefaults() {
      method build (line 124) | @NonNull
      method checkState (line 138) | private void checkState() {
      method addDefaultTagHandler (line 144) | void addDefaultTagHandler(@NonNull TagHandler tagHandler) {

FILE: Android/AntFluid/markwon-html/src/main/java/io/noties/markwon/html/MarkwonHtmlRendererNoOp.java
  class MarkwonHtmlRendererNoOp (line 8) | class MarkwonHtmlRendererNoOp extends MarkwonHtmlRenderer {
    method render (line 10) | @Override
    method tagHandler (line 15) | @Nullable

FILE: Android/AntFluid/markwon-html/src/main/java/io/noties/markwon/html/TagHandler.java
  class TagHandler (line 9) | public abstract class TagHandler {
    method handle (line 11) | public abstract void handle(
    method supportedTags (line 20) | @NonNull
    method visitChildren (line 24) | protected static void visitChildren(

FILE: Android/AntFluid/markwon-html/src/main/java/io/noties/markwon/html/TagHandlerNoOp.java
  class TagHandlerNoOp (line 14) | public class TagHandlerNoOp extends TagHandler {
    method create (line 16) | @NonNull
    method create (line 21) | @NonNull
    method TagHandlerNoOp (line 28) | @SuppressWarnings("WeakerAccess")
    method handle (line 33) | @Override
    method supportedTags (line 38) | @NonNull

FILE: Android/AntFluid/markwon-html/src/main/java/io/noties/markwon/html/TrimmingAppender.java
  class TrimmingAppender (line 7) | abstract class TrimmingAppender {
    method append (line 9) | abstract <T extends Appendable & CharSequence> void append(
    method create (line 14) | @NonNull
    class Impl (line 19) | static class Impl extends TrimmingAppender {
      method append (line 27) | @Override

FILE: Android/AntFluid/markwon-html/src/main/java/io/noties/markwon/html/jsoup/UncheckedIOException.java
  class UncheckedIOException (line 5) | public class UncheckedIOException extends RuntimeException {
    method UncheckedIOException (line 6) | public UncheckedIOException(IOException cause) {
    method ioException (line 10) | public IOException ioException() {

FILE: Android/AntFluid/markwon-html/src/main/java/io/noties/markwon/html/jsoup/helper/Normalizer.java
  class Normalizer (line 8) | public final class Normalizer {
    method lowerCase (line 10) | public static String lowerCase(final String input) {
    method normalize (line 14) | public static String normalize(final String input) {

FILE: Android/AntFluid/markwon-html/src/main/java/io/noties/markwon/html/jsoup/helper/Validate.java
  class Validate (line 6) | public final class Validate {
    method Validate (line 8) | private Validate() {}
    method notNull (line 14) | public static void notNull(Object obj) {
    method notNull (line 24) | public static void notNull(Object obj, String msg) {
    method isTrue (line 33) | public static void isTrue(boolean val) {
    method isTrue (line 43) | public static void isTrue(boolean val, String msg) {
    method isFalse (line 52) | public static void isFalse(boolean val) {
    method isFalse (line 62) | public static void isFalse(boolean val, String msg) {
    method noNullElements (line 71) | public static void noNullElements(Object[] objects) {
    method noNullElements (line 80) | public static void noNullElements(Object[] objects, String msg) {
    method notEmpty (line 90) | public static void notEmpty(String string) {
    method notEmpty (line 100) | public static void notEmpty(String string, String msg) {
    method fail (line 109) | public static void fail(String msg) {

FILE: Android/AntFluid/markwon-html/src/main/java/io/noties/markwon/html/jsoup/nodes/Attribute.java
  class Attribute (line 10) | public class Attribute implements Map.Entry<String, String>, Cloneable  {
    method Attribute (line 27) | public Attribute(String key, String value) {
    method Attribute (line 37) | public Attribute(String key, String val, Attributes parent) {
    method getKey (line 49) | public String getKey() {
    method setKey (line 57) | public void setKey(String key) {
    method getValue (line 73) | public String getValue() {
    method setValue (line 81) | public String setValue(String val) {
    method equals (line 178) | @Override
    method hashCode (line 187) | @Override
    method clone (line 194) | @Override

FILE: Android/AntFluid/markwon-html/src/main/java/io/noties/markwon/html/jsoup/nodes/Attributes.java
  class Attributes (line 23) | public class Attributes implements Iterable<Attribute>, Cloneable {
    method checkCapacity (line 38) | private void checkCapacity(int minNewSize) {
    method copyOf (line 53) | private static String[] copyOf(String[] orig, int size) {
    method indexOfKey (line 60) | int indexOfKey(String key) {
    method indexOfKeyIgnoreCase (line 69) | private int indexOfKeyIgnoreCase(String key) {
    method checkNotNull (line 79) | static String checkNotNull(String val) {
    method get (line 89) | public String get(String key) {
    method getIgnoreCase (line 99) | public String getIgnoreCase(String key) {
    method add (line 105) | private void add(String key, String value) {
    method put (line 118) | public Attributes put(String key, String value) {
    method putIgnoreCase (line 127) | void putIgnoreCase(String key, String value) {
    method put (line 144) | public Attributes put(String key, boolean value) {
    method put (line 157) | public Attributes put(Attribute attribute) {
    method remove (line 165) | private void remove(int index) {
    method remove (line 181) | public void remove(String key) {
    method removeIgnoreCase (line 191) | public void removeIgnoreCase(String key) {
    method hasKey (line 202) | public boolean hasKey(String key) {
    method hasKeyIgnoreCase (line 211) | public boolean hasKeyIgnoreCase(String key) {
    method size (line 219) | public int size() {
    method addAll (line 227) | public void addAll(Attributes incoming) {
    method iterator (line 239) | public Iterator<Attribute> iterator() {
    method equals (line 330) | @Override
    method hashCode (line 346) | @Override
    method clone (line 354) | @Override
    method normalize (line 371) | public void normalize() {

FILE: Android/AntFluid/markwon-html/src/main/java/io/noties/markwon/html/jsoup/nodes/CommonMarkEntities.java
  class CommonMarkEntities (line 11) | public abstract class CommonMarkEntities {
    method isNamedEntity (line 13) | public static boolean isNamedEntity(@NonNull String name) {
    method codepointsForName (line 17) | public static int codepointsForName(@NonNull String name, @NonNull int...
    method CommonMarkEntities (line 48) | private CommonMarkEntities() {

FILE: Android/AntFluid/markwon-html/src/main/java/io/noties/markwon/html/jsoup/nodes/DocumentType.java
  class DocumentType (line 6) | public class DocumentType /*extends LeafNode*/ {

FILE: Android/AntFluid/markwon-html/src/main/java/io/noties/markwon/html/jsoup/parser/CharacterReader.java
  class CharacterReader (line 15) | public final class CharacterReader {
    method CharacterReader (line 30) | public CharacterReader(Reader input, int sz) {
    method CharacterReader (line 38) | public CharacterReader(Reader input) {
    method CharacterReader (line 42) | public CharacterReader(String input) {
    method bufferUp (line 55) | private void bufferUp() {
    method pos (line 81) | public int pos() {
    method isEmpty (line 90) | public boolean isEmpty() {
    method isEmptyNoBufferUp (line 95) | private boolean isEmptyNoBufferUp() {
    method current (line 104) | public char current() {
    method consume (line 109) | char consume() {
    method unconsume (line 116) | void unconsume() {
    method advance (line 123) | public void advance() {
    method mark (line 127) | void mark() {
    method rewindToMark (line 131) | void rewindToMark() {
    method nextIndexOf (line 141) | int nextIndexOf(char c) {
    method nextIndexOf (line 157) | int nextIndexOf(CharSequence seq) {
    method consumeTo (line 182) | public String consumeTo(char c) {
    method consumeTo (line 193) | String consumeTo(String seq) {
    method consumeToAny (line 210) | public String consumeToAny(final char... chars) {
    method consumeToAnySorted (line 228) | String consumeToAnySorted(final char... chars) {
    method consumeData (line 243) | String consumeData() {
    method consumeTagName (line 260) | String consumeTagName() {
    method consumeToEnd (line 277) | String consumeToEnd() {
    method consumeLetterSequence (line 284) | String consumeLetterSequence() {
    method consumeLetterThenDigitSequence (line 298) | String consumeLetterThenDigitSequence() {
    method consumeHexSequence (line 319) | String consumeHexSequence() {
    method consumeDigitSequence (line 332) | String consumeDigitSequence() {
    method matches (line 345) | boolean matches(char c) {
    method matches (line 350) | boolean matches(String seq) {
    method matchesIgnoreCase (line 362) | boolean matchesIgnoreCase(String seq) {
    method matchesAny (line 377) | boolean matchesAny(char... seq) {
    method matchesAnySorted (line 390) | boolean matchesAnySorted(char[] seq) {
    method matchesLetter (line 395) | boolean matchesLetter() {
    method matchesDigit (line 402) | boolean matchesDigit() {
    method matchConsume (line 409) | boolean matchConsume(String seq) {
    method matchConsumeIgnoreCase (line 419) | boolean matchConsumeIgnoreCase(String seq) {
    method containsIgnoreCase (line 428) | boolean containsIgnoreCase(String seq) {
    method toString (line 435) | @Override
    method cacheString (line 447) | private static String cacheString(final char[] charBuf, final String[]...
    method rangeEquals (line 482) | static boolean rangeEquals(final char[] charBuf, final int start, int ...
    method rangeEquals (line 496) | boolean rangeEquals(final int start, final int count, final String cac...

FILE: Android/AntFluid/markwon-html/src/main/java/io/noties/markwon/html/jsoup/parser/ParseError.java
  class ParseError (line 6) | public class ParseError {
    method ParseError (line 10) | ParseError(int pos, String errorMsg) {
    method ParseError (line 15) | ParseError(int pos, String errorFormat, Object... args) {
    method getErrorMessage (line 24) | public String getErrorMessage() {
    method getPosition (line 32) | public int getPosition() {
    method toString (line 36) | @Override

FILE: Android/AntFluid/markwon-html/src/main/java/io/noties/markwon/html/jsoup/parser/ParseErrorList.java
  class ParseErrorList (line 10) | public class ParseErrorList extends ArrayList<ParseError>{
    method ParseErrorList (line 14) | ParseErrorList(int initialCapacity, int maxSize) {
    method canAddError (line 19) | boolean canAddError() {
    method getMaxSize (line 23) | int getMaxSize() {
    method noTracking (line 27) | public static ParseErrorList noTracking() {
    method tracking (line 31) | public static ParseErrorList tracking(int maxSize) {

FILE: Android/AntFluid/markwon-html/src/main/java/io/noties/markwon/html/jsoup/parser/Token.java
  class Token (line 13) | public abstract class Token {
    method Token (line 17) | protected Token(@NonNull TokenType tokenType) {
    method reset (line 29) | public abstract Token reset();
    method reset (line 31) | static void reset(StringBuilder sb) {
    class Doctype (line 37) | public static final class Doctype extends Token {
      method Doctype (line 44) | Doctype() {
      method reset (line 48) | @Override
      method getName (line 58) | String getName() {
      method getPubSysKey (line 62) | String getPubSysKey() {
      method getPublicIdentifier (line 66) | String getPublicIdentifier() {
      method getSystemIdentifier (line 70) | public String getSystemIdentifier() {
      method isForceQuirks (line 74) | public boolean isForceQuirks() {
    class Tag (line 79) | public static abstract class Tag extends Token {
      method Tag (line 91) | protected Tag(@NonNull TokenType tokenType) {
      method reset (line 95) | @Override
      method newAttribute (line 109) | final void newAttribute() {
      method finaliseTag (line 134) | final void finaliseTag() {
      method name (line 142) | final String name() { // preserves case, for input into Tag.valueOf ...
      method normalName (line 147) | final String normalName() { // loses case, used in tree building for...
      method name (line 151) | final Tag name(String name) {
      method isSelfClosing (line 157) | final boolean isSelfClosing() {
      method getAttributes (line 161) | @SuppressWarnings({"TypeMayBeWeakened"})
      method appendTagName (line 167) | final void appendTagName(String append) {
      method appendTagName (line 172) | final void appendTagName(char append) {
      method appendAttributeName (line 176) | final void appendAttributeName(String append) {
      method appendAttributeName (line 180) | final void appendAttributeName(char append) {
      method appendAttributeValue (line 184) | final void appendAttributeValue(String append) {
      method appendAttributeValue (line 193) | final void appendAttributeValue(char append) {
      method appendAttributeValue (line 198) | final void appendAttributeValue(char[] append) {
      method appendAttributeValue (line 203) | final void appendAttributeValue(int[] appendCodepoints) {
      method setEmptyAttributeValue (line 210) | final void setEmptyAttributeValue() {
      method ensureAttributeValue (line 214) | private void ensureAttributeValue() {
    class StartTag (line 224) | public final static class StartTag extends Tag {
      method StartTag (line 225) | public StartTag() {
      method reset (line 230) | @Override
      method nameAttr (line 238) | StartTag nameAttr(String name, Attributes attributes) {
      method toString (line 245) | @Override
    class EndTag (line 254) | public final static class EndTag extends Tag {
      method EndTag (line 255) | EndTag() {
      method toString (line 259) | @Override
    class Comment (line 265) | public final static class Comment extends Token {
      method reset (line 269) | @Override
      method Comment (line 276) | Comment() {
      method getData (line 280) | String getData() {
      method toString (line 284) | @Override
    class Character (line 290) | public static class Character extends Token {
      method Character (line 293) | Character() {
      method reset (line 297) | @Override
      method data (line 303) | Character data(String data) {
      method getData (line 308) | public String getData() {
      method toString (line 312) | @Override
    class CData (line 318) | public final static class CData extends Character {
      method CData (line 319) | CData(String data) {
      method toString (line 324) | @Override
    class EOF (line 331) | public final static class EOF extends Token {
      method EOF (line 332) | EOF() {
      method reset (line 336) | @Override
    type TokenType (line 390) | public enum TokenType {

FILE: Android/AntFluid/markwon-html/src/main/java/io/noties/markwon/html/jsoup/parser/Tokeniser.java
  class Tokeniser (line 11) | public final class Tokeniser {
    method Tokeniser (line 49) | public Tokeniser(CharacterReader reader, ParseErrorList errors) {
    method read (line 54) | public Token read() {
    method emit (line 74) | void emit(Token token) {
    method emit (line 90) | void emit(final String str) {
    method emit (line 104) | void emit(char[] chars) {
    method emit (line 108) | void emit(int[] codepoints) {
    method emit (line 112) | void emit(char c) {
    method getState (line 116) | TokeniserState getState() {
    method transition (line 120) | void transition(TokeniserState state) {
    method advanceTransition (line 124) | void advanceTransition(TokeniserState state) {
    method consumeCharacterReference (line 131) | int[] consumeCharacterReference(Character additionalAllowedCharacter, ...
    method createTagPending (line 207) | Token.Tag createTagPending(boolean start) {
    method emitTagPending (line 212) | void emitTagPending() {
    method createCommentPending (line 217) | void createCommentPending() {
    method emitCommentPending (line 221) | void emitCommentPending() {
    method createDoctypePending (line 225) | void createDoctypePending() {
    method emitDoctypePending (line 229) | void emitDoctypePending() {
    method createTempBuffer (line 233) | void createTempBuffer() {
    method isAppropriateEndTagToken (line 237) | boolean isAppropriateEndTagToken() {
    method appropriateEndTagName (line 241) | String appropriateEndTagName() {
    method error (line 245) | void error(TokeniserState state) {
    method eofError (line 250) | void eofError(TokeniserState state) {
    method characterReferenceError (line 255) | private void characterReferenceError(String message) {
    method error (line 260) | void error(String errorMsg) {
    method currentNodeInHtmlNS (line 265) | boolean currentNodeInHtmlNS() {

FILE: Android/AntFluid/markwon-html/src/main/java/io/noties/markwon/html/jsoup/parser/TokeniserState.java
  type TokeniserState (line 8) | enum TokeniserState {
    method read (line 11) | void read(Tokeniser t, CharacterReader r) {
    method read (line 35) | void read(Tokeniser t, CharacterReader r) {
    method read (line 41) | void read(Tokeniser t, CharacterReader r) {
    method read (line 65) | void read(Tokeniser t, CharacterReader r) {
    method read (line 70) | void read(Tokeniser t, CharacterReader r) {
    method read (line 75) | void read(Tokeniser t, CharacterReader r) {
    method read (line 80) | void read(Tokeniser t, CharacterReader r) {
    method read (line 99) | void read(Tokeniser t, CharacterReader r) {
    method read (line 124) | void read(Tokeniser t, CharacterReader r) {
    method read (line 143) | void read(Tokeniser t, CharacterReader r) {
    method read (line 179) | void read(Tokeniser t, CharacterReader r) {
    method read (line 197) | void read(Tokeniser t, CharacterReader r) {
    method read (line 210) | void read(Tokeniser t, CharacterReader r) {
    method anythingElse (line 249) | private void anythingElse(Tokeniser t, CharacterReader r) {
    method read (line 256) | void read(Tokeniser t, CharacterReader r) {
    method read (line 267) | void read(Tokeniser t, CharacterReader r) {
    method read (line 272) | void read(Tokeniser t, CharacterReader r) {
    method read (line 277) | void read(Tokeniser t, CharacterReader r) {
    method read (line 295) | void read(Tokeniser t, CharacterReader r) {
    method read (line 300) | void read(Tokeniser t, CharacterReader r) {
    method read (line 305) | void read(Tokeniser t, CharacterReader r) {
    method read (line 315) | void read(Tokeniser t, CharacterReader r) {
    method read (line 325) | void read(Tokeniser t, CharacterReader r) {
    method read (line 352) | void read(Tokeniser t, CharacterReader r) {
    method read (line 380) | void read(Tokeniser t, CharacterReader r) {
    method read (line 411) | void read(Tokeniser t, CharacterReader r) {
    method read (line 427) | void read(Tokeniser t, CharacterReader r) {
    method read (line 440) | void read(Tokeniser t, CharacterReader r) {
    method read (line 445) | void read(Tokeniser t, CharacterReader r) {
    method read (line 450) | void read(Tokeniser t, CharacterReader r) {
    method read (line 477) | void read(Tokeniser t, CharacterReader r) {
    method read (line 504) | void read(Tokeniser t, CharacterReader r) {
    method read (line 534) | void read(Tokeniser t, CharacterReader r) {
    method read (line 545) | void read(Tokeniser t, CharacterReader r) {
    method read (line 551) | void read(Tokeniser t, CharacterReader r) {
    method read (line 595) | void read(Tokeniser t, CharacterReader r) {
    method read (line 638) | void read(Tokeniser t, CharacterReader r) {
    method read (line 683) | void read(Tokeniser t, CharacterReader r) {
    method read (line 732) | void read(Tokeniser t, CharacterReader r) {
    method read (line 765) | void read(Tokeniser t, CharacterReader r) {
    method read (line 798) | void read(Tokeniser t, CharacterReader r) {
    method read (line 847) | void read(Tokeniser t, CharacterReader r) {
    method read (line 877) | void read(Tokeniser t, CharacterReader r) {
    method read (line 897) | void read(Tokeniser t, CharacterReader r) {
    method read (line 910) | void read(Tokeniser t, CharacterReader r) {
    method read (line 929) | void read(Tokeniser t, CharacterReader r) {
    method read (line 957) | void read(Tokeniser t, CharacterReader r) {
    method read (line 985) | void read(Tokeniser t, CharacterReader r) {
    method read (line 1007) | void read(Tokeniser t, CharacterReader r) {
    method read (line 1030) | void read(Tokeniser t, CharacterReader r) {
    method read (line 1063) | void read(Tokeniser t, CharacterReader r) {
    method read (line 1091) | void read(Tokeniser t, CharacterReader r) {
    method read (line 1118) | void read(Tokeniser t, CharacterReader r) {
    method read (line 1153) | void read(Tokeniser t, CharacterReader r) {
    method read (line 1188) | void read(Tokeniser t, CharacterReader r) {
    method read (line 1216) | void read(Tokeniser t, CharacterReader r) {
    method read (line 1256) | void read(Tokeniser t, CharacterReader r) {
    method read (line 1293) | void read(Tokeniser t, CharacterReader r) {
    method read (line 1321) | void read(Tokeniser t, CharacterReader r) {
    method read (line 1349) | void read(Tokeniser t, CharacterReader r) {
    method read (line 1387) | void read(Tokeniser t, CharacterReader r) {
    method read (line 1424) | void read(Tokeniser t, CharacterReader r) {
    method read (line 1464) | void read(Tokeniser t, CharacterReader r) {
    method read (line 1501) | void read(Tokeniser t, CharacterReader r) {
    method read (line 1529) | void read(Tokeniser t, CharacterReader r) {
    method read (line 1557) | void read(Tokeniser t, CharacterReader r) {
    method read (line 1584) | void read(Tokeniser t, CharacterReader r) {
    method read (line 1602) | void read(Tokeniser t, CharacterReader r) {
    method read (line 1613) | abstract void read(Tokeniser t, CharacterReader r);
    method handleDataEndTag (line 1630) | private static void handleDataEndTag(Tokeniser t, CharacterReader r, T...
    method readData (line 1670) | private static void readData(Tokeniser t, CharacterReader r, Tokeniser...
    method readCharRef (line 1690) | private static void readCharRef(Tokeniser t, TokeniserState advance) {
    method readEndTag (line 1699) | private static void readEndTag(Tokeniser t, CharacterReader r, Tokenis...
    method handleDataDoubleEscapeTag (line 1709) | private static void handleDataDoubleEscapeTag(Tokeniser t, CharacterRe...

FILE: Android/AntFluid/markwon-html/src/main/java/io/noties/markwon/html/span/SubScriptSpan.java
  class SubScriptSpan (line 10) | public class SubScriptSpan extends MetricAffectingSpan {
    method updateDrawState (line 12) | @Override
    method updateMeasureState (line 17) | @Override
    method apply (line 22) | private void apply(TextPaint paint) {

FILE: Android/AntFluid/markwon-html/src/main/java/io/noties/markwon/html/span/SuperScriptSpan.java
  class SuperScriptSpan (line 10) | public class SuperScriptSpan extends MetricAffectingSpan {
    method updateDrawState (line 12) | @Override
    method updateMeasureState (line 17) | @Override
    method apply (line 22) | private void apply(TextPaint paint) {

FILE: Android/AntFluid/markwon-html/src/main/java/io/noties/markwon/html/tag/BlockquoteHandler.java
  class BlockquoteHandler (line 18) | public class BlockquoteHandler extends TagHandler {
    method handle (line 20) | @Override
    method supportedTags (line 42) | @NonNull

FILE: Android/AntFluid/markwon-html/src/main/java/io/noties/markwon/html/tag/EmphasisHandler.java
  class EmphasisHandler (line 16) | public class EmphasisHandler extends SimpleTagHandler {
    method getSpans (line 17) | @Nullable
    method supportedTags (line 30) | @NonNull

FILE: Android/AntFluid/markwon-html/src/main/java/io/noties/markwon/html/tag/HeadingHandler.java
  class HeadingHandler (line 17) | public class HeadingHandler extends SimpleTagHandler {
    method getSpans (line 19) | @Nullable
    method supportedTags (line 48) | @NonNull

FILE: Android/AntFluid/markwon-html/src/main/java/io/noties/markwon/html/tag/ImageHandler.java
  class ImageHandler (line 22) | public class ImageHandler extends SimpleTagHandler {
    method supportedTags (line 24) | @NonNull
    type ImageSizeParser (line 30) | interface ImageSizeParser {
      method parse (line 31) | @Nullable
    method create (line 35) | @NonNull
    method ImageHandler (line 42) | @SuppressWarnings("WeakerAccess")
    method getSpans (line 47) | @Nullable

FILE: Android/AntFluid/markwon-html/src/main/java/io/noties/markwon/html/tag/ImageSizeParserImpl.java
  class ImageSizeParserImpl (line 19) | class ImageSizeParserImpl implements ImageHandler.ImageSizeParser {
    method ImageSizeParserImpl (line 23) | ImageSizeParserImpl(@NonNull CssInlineStyleParser inlineStyleParser) {
    method parse (line 27) | @Override
    method rpxToPx (line 78) | private ImageSize.Dimension rpxToPx(@Nullable ImageSize.Dimension side) {
    method dimension (line 93) | @Nullable

FILE: Android/AntFluid/markwon-html/src/main/java/io/noties/markwon/html/tag/LinkHandler.java
  class LinkHandler (line 23) | public class LinkHandler extends SimpleTagHandler {
    method getSpans (line 24) | @Nullable
    method supportedTags (line 73) | @NonNull

FILE: Android/AntFluid/markwon-html/src/main/java/io/noties/markwon/html/tag/ListHandler.java
  class ListHandler (line 20) | public class ListHandler extends TagHandler {
    method handle (line 22) | @Override
    method supportedTags (line 72) | @NonNull
    method currentBulletListLevel (line 78) | private static int currentBulletListLevel(@NonNull HtmlTag.Block block) {

FILE: Android/AntFluid/markwon-html/src/main/java/io/noties/markwon/html/tag/SimpleTagHandler.java
  class SimpleTagHandler (line 16) | public abstract class SimpleTagHandler extends TagHandler {
    method getSpans (line 19) | @Nullable
    method supportedTags (line 25) | @NonNull
    method handle (line 30) | @Override
    method getTagContent (line 45) | protected String getTagContent() {

FILE: Android/AntFluid/markwon-html/src/main/java/io/noties/markwon/html/tag/StrikeHandler.java
  class StrikeHandler (line 19) | public class StrikeHandler extends TagHandler {
    method handle (line 38) | @Override
    method supportedTags (line 56) | @NonNull
    method getMarkdownSpans (line 62) | @Nullable

FILE: Android/AntFluid/markwon-html/src/main/java/io/noties/markwon/html/tag/StrongEmphasisHandler.java
  class StrongEmphasisHandler (line 16) | public class StrongEmphasisHandler extends SimpleTagHandler {
    method getSpans (line 17) | @Nullable
    method supportedTags (line 30) | @NonNull

FILE: Android/AntFluid/markwon-html/src/main/java/io/noties/markwon/html/tag/SubScriptHandler.java
  class SubScriptHandler (line 14) | public class SubScriptHandler extends SimpleTagHandler {
    method getSpans (line 15) | @Nullable
    method supportedTags (line 21) | @NonNull

FILE: Android/AntFluid/markwon-html/src/main/java/io/noties/markwon/html/tag/SuperScriptHandler.java
  class SuperScriptHandler (line 14) | public class SuperScriptHandler extends SimpleTagHandler {
    method getSpans (line 15) | @Nullable
    method supportedTags (line 21) | @NonNull

FILE: Android/AntFluid/markwon-html/src/main/java/io/noties/markwon/html/tag/UnderlineHandler.java
  class UnderlineHandler (line 19) | public class UnderlineHandler extends TagHandler {
    method handle (line 21) | @Override
    method supportedTags (line 51) | @NonNull

FILE: Android/AntFluid/markwon-html/src/test/java/io/noties/markwon/html/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test

FILE: Android/AntFluid/markwon-image/src/androidTest/java/io/noties/markwon/image/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 18) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 20) | @Test

FILE: Android/AntFluid/markwon-image/src/main/java/com/fluid/afm/network/CircleDrawable.java
  class CircleDrawable (line 11) | public class CircleDrawable {
    method createCircleDrawable (line 13) | public static Drawable createCircleDrawable(Context context, int diame...

FILE: Android/AntFluid/markwon-image/src/main/java/com/fluid/afm/network/ImageLoaderSchemeHandler.java
  class ImageLoaderSchemeHandler (line 19) | public class ImageLoaderSchemeHandler extends SchemeHandler {
    method create (line 24) | @NonNull
    method ImageLoaderSchemeHandler (line 29) | @SuppressWarnings("WeakerAccess")
    method handle (line 34) | @NonNull
    method supportedSchemes (line 55) | @NonNull
    method contentType (line 61) | @Nullable

FILE: Android/AntFluid/markwon-image/src/main/java/io/noties/markwon/image/AsyncDrawableLoaderBuilder.java
  class AsyncDrawableLoaderBuilder (line 16) | class AsyncDrawableLoaderBuilder {
    method AsyncDrawableLoaderBuilder (line 29) | AsyncDrawableLoaderBuilder() {
    method executorService (line 44) | void executorService(@NonNull ExecutorService executorService) {
    method addSchemeHandler (line 49) | void addSchemeHandler(@NonNull SchemeHandler schemeHandler) {
    method addMediaDecoder (line 56) | void addMediaDecoder(@NonNull MediaDecoder mediaDecoder) {
    method defaultMediaDecoder (line 63) | void defaultMediaDecoder(@Nullable MediaDecoder mediaDecoder) {
    method removeSchemeHandler (line 68) | void removeSchemeHandler(@NonNull String scheme) {
    method removeMediaDecoder (line 73) | void removeMediaDecoder(@NonNull String contentType) {
    method placeholderProvider (line 81) | void placeholderProvider(@NonNull ImagesPlugin.PlaceholderProvider pla...
    method errorHandler (line 89) | void errorHandler(@NonNull ImagesPlugin.ErrorHandler errorHandler) {
    method build (line 94) | @NonNull
    method checkState (line 109) | private void checkState() {

FILE: Android/AntFluid/markwon-image/src/main/java/io/noties/markwon/image/AsyncDrawableLoaderImpl.java
  class AsyncDrawableLoaderImpl (line 32) | class AsyncDrawableLoaderImpl extends AsyncDrawableLoader {
    method AsyncDrawableLoaderImpl (line 48) | AsyncDrawableLoaderImpl(@NonNull AsyncDrawableLoaderBuilder builder) {
    method AsyncDrawableLoaderImpl (line 54) | @VisibleForTesting
    method load (line 65) | @Override
    method cancel (line 74) | @Override
    method placeholder (line 86) | @Nullable
    method drawableToBitmap (line 94) | public Bitmap drawableToBitmap(Drawable drawable) {
    method execute (line 110) | @NonNull
    method setBitmapTransparency (line 241) | public Bitmap setBitmapTransparency(Bitmap bitmap, int alpha) {
    method overlayBitmaps (line 250) | public Bitmap overlayBitmaps(Bitmap background, Bitmap overlay) {
    method scaleAndCropCenter (line 264) | public Bitmap scaleAndCropCenter(Bitmap srcBitmap, int targetWidth, in...
    method scaleAndCropHeightOverWidthBitmap (line 299) | public Bitmap scaleAndCropHeightOverWidthBitmap(Bitmap bitmap, int fix...
    method getRoundedCornerBitmap (line 320) | public Bitmap getRoundedCornerBitmap(Bitmap bitmap, int cornerRadius) {

FILE: Android/AntFluid/markwon-image/src/main/java/io/noties/markwon/image/DefaultDownScalingMediaDecoder.java
  class DefaultDownScalingMediaDecoder (line 35) | public class DefaultDownScalingMediaDecoder extends MediaDecoder {
    method create (line 42) | @NonNull
    method create (line 47) | @NonNull
    method DefaultDownScalingMediaDecoder (line 60) | private DefaultDownScalingMediaDecoder(@NonNull Resources resources, i...
    method decode (line 67) | @NonNull
    method writeToTempFile (line 93) | @NonNull
    method decode (line 128) | @Nullable
    method readFile (line 144) | @NonNull
    method calculateInSampleSize (line 154) | private static int calculateInSampleSize(@NonNull BitmapFactory.Option...
    method calculateInSampleSize (line 177) | private static int calculateInSampleSize(int actual, int max) {
    method supportedTypes (line 186) | @NonNull

FILE: Android/AntFluid/markwon-image/src/main/java/io/noties/markwon/image/DefaultMediaDecoder.java
  class DefaultMediaDecoder (line 27) | public class DefaultMediaDecoder extends MediaDecoder {
    method create (line 31) | @NonNull
    method create (line 36) | @NonNull
    method DefaultMediaDecoder (line 43) | @SuppressWarnings("WeakerAccess")
    method decode (line 48) | @NonNull
    method supportedTypes (line 64) | @NonNull

FILE: Android/AntFluid/markwon-image/src/main/java/io/noties/markwon/image/ImageItem.java
  class ImageItem (line 13) | public abstract class ImageItem {
    method withResult (line 22) | @NonNull
    method withDecodingNeeded (line 34) | @NonNull
    method ImageItem (line 42) | private ImageItem() {
    method hasResult (line 48) | public abstract boolean hasResult();
    method hasDecodingNeeded (line 53) | public abstract boolean hasDecodingNeeded();
    method getAsWithResult (line 59) | @NonNull
    method getAsWithDecodingNeeded (line 66) | @NonNull
    class WithResult (line 72) | public static class WithResult extends ImageItem {
      method WithResult (line 76) | private WithResult(@NonNull Drawable drawable) {
      method result (line 80) | @NonNull
      method hasResult (line 85) | @Override
      method hasDecodingNeeded (line 90) | @Override
      method getAsWithResult (line 95) | @NonNull
      method getAsWithDecodingNeeded (line 101) | @NonNull
    class WithDecodingNeeded (line 111) | public static class WithDecodingNeeded extends ImageItem {
      method WithDecodingNeeded (line 116) | private WithDecodingNeeded(
      method contentType (line 123) | @Nullable
      method inputStream (line 128) | @NonNull
      method hasResult (line 133) | @Override
      method hasDecodingNeeded (line 138) | @Override
      method getAsWithResult (line 143) | @NonNull
      method getAsWithDecodingNeeded (line 149) | @NonNull

FILE: Android/AntFluid/markwon-image/src/main/java/io/noties/markwon/image/ImagesPlugin.java
  class ImagesPlugin (line 29) | @SuppressWarnings({"UnusedReturnValue", "WeakerAccess"})
    method onStreamOutStateChanged (line 35) | @Override
    type ImagesConfigure (line 43) | public interface ImagesConfigure {
      method configureImages (line 44) | void configureImages(@NonNull ImagesPlugin plugin);
    type PlaceholderProvider (line 50) | public interface PlaceholderProvider {
      method providePlaceholder (line 51) | @Nullable
    type ErrorHandler (line 58) | public interface ErrorHandler {
      method handleError (line 63) | @Nullable
    method create (line 73) | @NonNull
    method create (line 76) | @NonNull
    method create (line 82) | @NonNull
    method ImagesPlugin (line 92) | ImagesPlugin() {
    method ImagesPlugin (line 96) | ImagesPlugin(IImageClickCallback callback) {
    method ImagesPlugin (line 103) | @VisibleForTesting
    method executorService (line 113) | @NonNull
    method addSchemeHandler (line 126) | @NonNull
    method addMediaDecoder (line 136) | @NonNull
    method defaultMediaDecoder (line 149) | @NonNull
    method removeSchemeHandler (line 158) | @NonNull
    method processMarkdown (line 165) | @NonNull
    method removeMediaDecoder (line 179) | @NonNull
    method placeholderProvider (line 188) | @NonNull
    method errorHandler (line 198) | @NonNull
    method configureConfiguration (line 204) | @Override
    method configureSpansFactory (line 210) | @Override
    method beforeSetText (line 216) | @Override
    method afterSetText (line 221) | @Override

FILE: Android/AntFluid/markwon-image/src/main/java/io/noties/markwon/image/MediaDecoder.java
  class MediaDecoder (line 14) | public abstract class MediaDecoder {
    method decode (line 23) | @NonNull
    method supportedTypes (line 32) | @NonNull

FILE: Android/AntFluid/markwon-image/src/main/java/io/noties/markwon/image/SchemeHandler.java
  class SchemeHandler (line 12) | public abstract class SchemeHandler {
    method handle (line 23) | @NonNull
    method supportedSchemes (line 29) | @NonNull

FILE: Android/AntFluid/markwon-image/src/main/java/io/noties/markwon/image/data/DataUri.java
  class DataUri (line 5) | public class DataUri {
    method DataUri (line 11) | public DataUri(@Nullable String contentType, boolean base64, @Nullable...
    method contentType (line 17) | @Nullable
    method base64 (line 22) | public boolean base64() {
    method data (line 26) | @Nullable
    method toString (line 31) | @Override
    method equals (line 40) | @Override
    method hashCode (line 53) | @Override

FILE: Android/AntFluid/markwon-image/src/main/java/io/noties/markwon/image/data/DataUriDecoder.java
  class DataUriDecoder (line 8) | public abstract class DataUriDecoder {
    method decode (line 10) | @Nullable
    method create (line 13) | @NonNull
    class Impl (line 18) | static class Impl extends DataUriDecoder {
      method decode (line 22) | @Nullable

FILE: Android/AntFluid/markwon-image/src/main/java/io/noties/markwon/image/data/DataUriParser.java
  class DataUriParser (line 6) | public abstract class DataUriParser {
    method parse (line 8) | @Nullable
    method create (line 12) | @NonNull
    class Impl (line 17) | static class Impl extends DataUriParser {
      method parse (line 19) | @Nullable

FILE: Android/AntFluid/markwon-image/src/main/java/io/noties/markwon/image/data/DataUriSchemeHandler.java
  class DataUriSchemeHandler (line 16) | public class DataUriSchemeHandler extends SchemeHandler {
    method create (line 20) | @NonNull
    method DataUriSchemeHandler (line 30) | @SuppressWarnings("WeakerAccess")
    method handle (line 36) | @NonNull
    method supportedSchemes (line 67) | @NonNull

FILE: Android/AntFluid/markwon-image/src/main/java/io/noties/markwon/image/file/FileSchemeHandler.java
  class FileSchemeHandler (line 28) | public class FileSchemeHandler extends SchemeHandler {
    method createWithAssets (line 35) | @NonNull
    method createWithAssets (line 45) | @NonNull
    method create (line 50) | @NonNull
    method FileSchemeHandler (line 60) | @SuppressWarnings("WeakerAccess")
    method handle (line 65) | @NonNull
    method supportedSchemes (line 129) | @NonNull

FILE: Android/AntFluid/markwon-image/src/main/java/io/noties/markwon/image/network/NetworkSchemeHandler.java
  class NetworkSchemeHandler (line 25) | public class NetworkSchemeHandler extends SchemeHandler {
    method create (line 30) | @NonNull
    method NetworkSchemeHandler (line 35) | @SuppressWarnings("WeakerAccess")
    method handle (line 40) | @NonNull
    method supportedSchemes (line 67) | @NonNull
    method contentType (line 73) | @Nullable

FILE: Android/AntFluid/markwon-image/src/test/java/io/noties/markwon/image/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test

FILE: Android/AntFluid/markwon-inline-parser/src/androidTest/java/io/noties/markwon/inlineparser/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 18) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 20) | @Test

FILE: Android/AntFluid/markwon-inline-parser/src/main/java/com/fluid/afm/inline/OiintInlineProcessor.java
  class OiintInlineProcessor (line 11) | public class OiintInlineProcessor extends InlineProcessor {
    method specialCharacter (line 13) | @Override
    method parse (line 17) | @Override

FILE: Android/AntFluid/markwon-inline-parser/src/main/java/io/noties/markwon/inlineparser/AutolinkInlineProcessor.java
  class AutolinkInlineProcessor (line 14) | public class AutolinkInlineProcessor extends InlineProcessor {
    method specialCharacter (line 22) | @Override
    method parse (line 27) | @Override

FILE: Android/AntFluid/markwon-inline-parser/src/main/java/io/noties/markwon/inlineparser/BackslashInlineProcessor.java
  class BackslashInlineProcessor (line 11) | public class BackslashInlineProcessor extends InlineProcessor {
    method specialCharacter (line 15) | @Override
    method parse (line 20) | @Override

FILE: Android/AntFluid/markwon-inline-parser/src/main/java/io/noties/markwon/inlineparser/BackticksInlineProcessor.java
  class BackticksInlineProcessor (line 14) | public class BackticksInlineProcessor extends InlineProcessor {
    method specialCharacter (line 20) | @Override
    method parse (line 25) | @Override

FILE: Android/AntFluid/markwon-inline-parser/src/main/java/io/noties/markwon/inlineparser/BangInlineProcessor.java
  class BangInlineProcessor (line 12) | public class BangInlineProcessor extends InlineProcessor {
    method specialCharacter (line 13) | @Override
    method parse (line 18) | @Override

FILE: Android/AntFluid/markwon-inline-parser/src/main/java/io/noties/markwon/inlineparser/CloseBracketInlineProcessor.java
  class CloseBracketInlineProcessor (line 20) | public class CloseBracketInlineProcessor extends InlineProcessor {
    method specialCharacter (line 24) | @Override
    method parse (line 29) | @Override

FILE: Android/AntFluid/markwon-inline-parser/src/main/java/io/noties/markwon/inlineparser/EntityInlineProcessor.java
  class EntityInlineProcessor (line 16) | public class EntityInlineProcessor extends InlineProcessor {
    method specialCharacter (line 20) | @Override
    method parse (line 25) | @Override

FILE: Android/AntFluid/markwon-inline-parser/src/main/java/io/noties/markwon/inlineparser/HtmlInlineProcessor.java
  class HtmlInlineProcessor (line 14) | public class HtmlInlineProcessor extends InlineProcessor {
    method specialCharacter (line 24) | @Override
    method parse (line 29) | @Override

FILE: Android/AntFluid/markwon-inline-parser/src/main/java/io/noties/markwon/inlineparser/InlineParserUtils.java
  class InlineParserUtils (line 9) | public abstract class InlineParserUtils {
    method mergeTextNodesBetweenExclusive (line 11) | public static void mergeTextNodesBetweenExclusive(Node fromNode, Node ...
    method mergeChildTextNodes (line 20) | public static void mergeChildTextNodes(Node node) {
    method mergeTextNodesInclusive (line 29) | public static void mergeTextNodesInclusive(Node fromNode, Node toNode) {
    method mergeIfNeeded (line 58) | public static void mergeIfNeeded(Text first, Text last, int textLength) {
    method InlineParserUtils (line 75) | private InlineParserUtils() {

FILE: Android/AntFluid/markwon-inline-parser/src/main/java/io/noties/markwon/inlineparser/InlineProcessor.java
  class InlineProcessor (line 29) | public abstract class InlineProcessor {
    method specialCharacter (line 34) | public abstract char specialCharacter();
    method parse (line 39) | @Nullable
    method parse (line 48) | @Nullable
    method lastBracket (line 63) | protected Bracket lastBracket() {
    method lastDelimiter (line 67) | protected Delimiter lastDelimiter() {
    method addBracket (line 71) | protected void addBracket(Bracket bracket) {
    method removeLastBracket (line 75) | protected void removeLastBracket() {
    method spnl (line 79) | protected void spnl() {
    method match (line 85) | @Nullable
    method parseLinkDestination (line 98) | @Nullable
    method parseLinkTitle (line 106) | @Nullable
    method parseLinkLabel (line 114) | protected int parseLinkLabel() {
    method processDelimiters (line 121) | protected void processDelimiters(Delimiter stackBottom) {
    method text (line 127) | @NonNul
Condensed preview — 1326 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (8,909K chars).
[
  {
    "path": ".gitignore",
    "chars": 156,
    "preview": "Pods/\nDerivedData/\nProducts/\nPodfile.lock\nout/\nxcschememanagement.plist\nxcshareddata/\n*.xcscmblueprint\nxcuserdata/\nPodfi"
  },
  {
    "path": "Android/AntFluid/.gitignore",
    "chars": 234,
    "preview": "*.iml\n.gradle\n/local.properties\n/.idea/caches\n/.idea/libraries\n/.idea/modules.xml\n/.idea/workspace.xml\n/.idea/navEditor."
  },
  {
    "path": "Android/AntFluid/app-sample/.gitignore",
    "chars": 6,
    "preview": "/build"
  },
  {
    "path": "Android/AntFluid/app-sample/build.gradle",
    "chars": 1821,
    "preview": "plugins {\n    alias(libs.plugins.android.application)\n    alias(libs.plugins.kotlin.android)\n    alias(libs.plugins.kotl"
  },
  {
    "path": "Android/AntFluid/app-sample/proguard-rules.pro",
    "chars": 750,
    "preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
  },
  {
    "path": "Android/AntFluid/app-sample/src/androidTest/java/com/fluid/markdown/ExampleInstrumentedTest.kt",
    "chars": 667,
    "preview": "package com.fluid.markdown\n\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.platform.app.Instr"
  },
  {
    "path": "Android/AntFluid/app-sample/src/main/AndroidManifest.xml",
    "chars": 1331,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:to"
  },
  {
    "path": "Android/AntFluid/app-sample/src/main/java/com/fluid/markdown/MainActivity.kt",
    "chars": 3913,
    "preview": "package com.fluid.markdown\n\nimport android.content.Intent\nimport android.os.Bundle\nimport android.util.Log\nimport androi"
  },
  {
    "path": "Android/AntFluid/app-sample/src/main/java/com/fluid/markdown/MyImageHandler.java",
    "chars": 5541,
    "preview": "package com.fluid.markdown;\n\nimport android.content.Context;\nimport android.graphics.Bitmap;\nimport android.graphics.dra"
  },
  {
    "path": "Android/AntFluid/app-sample/src/main/java/com/fluid/markdown/demos/ListActivity.java",
    "chars": 1110,
    "preview": "package com.fluid.markdown.demos;\n\nimport android.os.Bundle;\n\nimport androidx.annotation.Nullable;\nimport androidx.appco"
  },
  {
    "path": "Android/AntFluid/app-sample/src/main/java/com/fluid/markdown/demos/MarkdownData.java",
    "chars": 370,
    "preview": "package com.fluid.markdown.demos;\n\nimport com.fluid.afm.markdown.widget.PrinterMarkDownTextView;\n\npublic class MarkdownD"
  },
  {
    "path": "Android/AntFluid/app-sample/src/main/java/com/fluid/markdown/demos/MarkdownHolder.java",
    "chars": 1112,
    "preview": "package com.fluid.markdown.demos;\n\nimport android.view.View;\n\nimport androidx.annotation.NonNull;\nimport androidx.recycl"
  },
  {
    "path": "Android/AntFluid/app-sample/src/main/java/com/fluid/markdown/demos/MarkwonListAdapter.java",
    "chars": 1160,
    "preview": "package com.fluid.markdown.demos;\n\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.Vie"
  },
  {
    "path": "Android/AntFluid/app-sample/src/main/java/com/fluid/markdown/demos/PrinterActivity.java",
    "chars": 3282,
    "preview": "package com.fluid.markdown.demos;\n\nimport android.os.Bundle;\nimport android.view.ViewGroup;\nimport android.widget.EditTe"
  },
  {
    "path": "Android/AntFluid/app-sample/src/main/res/drawable/baseline_arrow_back_24.xml",
    "chars": 374,
    "preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\" android:autoMirrored=\"true\" android:height=\"24dp\" and"
  },
  {
    "path": "Android/AntFluid/app-sample/src/main/res/drawable/circle.xml",
    "chars": 175,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\" android:shape=\""
  },
  {
    "path": "Android/AntFluid/app-sample/src/main/res/drawable/editor_bg.xml",
    "chars": 224,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <stroke\n  "
  },
  {
    "path": "Android/AntFluid/app-sample/src/main/res/drawable/ic_launcher_background.xml",
    "chars": 5606,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:wi"
  },
  {
    "path": "Android/AntFluid/app-sample/src/main/res/drawable/item_bg.xml",
    "chars": 266,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <solid an"
  },
  {
    "path": "Android/AntFluid/app-sample/src/main/res/drawable-v24/ic_launcher_foreground.xml",
    "chars": 1702,
    "preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\"\n    "
  },
  {
    "path": "Android/AntFluid/app-sample/src/main/res/layout/activity_list.xml",
    "chars": 1918,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmln"
  },
  {
    "path": "Android/AntFluid/app-sample/src/main/res/layout/activity_printer.xml",
    "chars": 6727,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmln"
  },
  {
    "path": "Android/AntFluid/app-sample/src/main/res/layout/layout_main.xml",
    "chars": 1562,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    andr"
  },
  {
    "path": "Android/AntFluid/app-sample/src/main/res/layout/list_item.xml",
    "chars": 503,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    andro"
  },
  {
    "path": "Android/AntFluid/app-sample/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
    "chars": 343,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <b"
  },
  {
    "path": "Android/AntFluid/app-sample/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml",
    "chars": 343,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <b"
  },
  {
    "path": "Android/AntFluid/app-sample/src/main/res/values/colors.xml",
    "chars": 524,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"purple_200\">#FFBB86FC</color>\n    <color name=\"purpl"
  },
  {
    "path": "Android/AntFluid/app-sample/src/main/res/values/strings.xml",
    "chars": 2801,
    "preview": "<resources>\n    <string name=\"app_name\">AntFluidMarkdown</string>\n    <string name=\"printer\">Printer</string>\n    <strin"
  },
  {
    "path": "Android/AntFluid/app-sample/src/main/res/values/themes.xml",
    "chars": 351,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <style name=\"Theme.AntFluidMarkdown\" parent=\"Theme.AppCompat.Ligh"
  },
  {
    "path": "Android/AntFluid/app-sample/src/main/res/values-v35/themes.xml",
    "chars": 426,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <style name=\"Theme.AntFluidMarkdown\" parent=\"Theme.AppCompat.Ligh"
  },
  {
    "path": "Android/AntFluid/app-sample/src/main/res/values-zh/strings.xml",
    "chars": 2255,
    "preview": "<resources>\n    <string name=\"app_name\">AntFluidMarkdown</string>\n    <string name=\"printer\">Printer</string>\n    <strin"
  },
  {
    "path": "Android/AntFluid/app-sample/src/main/res/xml/backup_rules.xml",
    "chars": 478,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n   Sample backup rules file; uncomment and customize as necessary.\n   See htt"
  },
  {
    "path": "Android/AntFluid/app-sample/src/main/res/xml/data_extraction_rules.xml",
    "chars": 308,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n   Sample data extraction rules file; uncomment and customize as necessary.\n "
  },
  {
    "path": "Android/AntFluid/app-sample/src/test/java/com/fluid/markdown/ExampleUnitTest.kt",
    "chars": 352,
    "preview": "package com.fluid.markdown\n\nimport org.junit.Assert.assertEquals\nimport org.junit.Test\n\n/**\n * Example local unit test, "
  },
  {
    "path": "Android/AntFluid/build.gradle",
    "chars": 317,
    "preview": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\nplugins {\nalias(libs"
  },
  {
    "path": "Android/AntFluid/fluid-markdown/.gitignore",
    "chars": 6,
    "preview": "/build"
  },
  {
    "path": "Android/AntFluid/fluid-markdown/build.gradle",
    "chars": 1254,
    "preview": "plugins {\n    alias(libs.plugins.android.library)\n}\n\nandroid {\n    namespace 'com.fluid.afm'\n    compileSdk 35\n\n    defa"
  },
  {
    "path": "Android/AntFluid/fluid-markdown/consumer-rules.pro",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "Android/AntFluid/fluid-markdown/proguard-rules.pro",
    "chars": 750,
    "preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
  },
  {
    "path": "Android/AntFluid/fluid-markdown/src/androidTest/java/com/fluid/afm/ExampleInstrumentedTest.java",
    "chars": 751,
    "preview": "package com.fluid.afm;\n\nimport static org.junit.Assert.assertEquals;\n\nimport android.content.Context;\n\nimport androidx.t"
  },
  {
    "path": "Android/AntFluid/fluid-markdown/src/main/AndroidManifest.xml",
    "chars": 351,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <appli"
  },
  {
    "path": "Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/AFMInitializer.java",
    "chars": 810,
    "preview": "package com.fluid.afm;\n\nimport android.content.Context;\n\nimport androidx.annotation.Nullable;\n\nimport com.fluid.afm.hand"
  },
  {
    "path": "Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/ElementClickEventCallback.java",
    "chars": 840,
    "preview": "package com.fluid.afm.markdown;\n\nimport android.view.View;\n\nimport com.fluid.afm.markdown.html.SpanTextClickableSpan;\nim"
  },
  {
    "path": "Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/MarkdownParser.java",
    "chars": 5742,
    "preview": "package com.fluid.afm.markdown;\n\nimport android.content.Context;\nimport android.graphics.Paint;\nimport android.os.Build;"
  },
  {
    "path": "Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/MarkdownParserFactory.java",
    "chars": 8129,
    "preview": "package com.fluid.afm.markdown;\n\nimport android.content.Context;\nimport android.graphics.drawable.Drawable;\nimport andro"
  },
  {
    "path": "Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/code/CodeBlockPlugin.java",
    "chars": 2707,
    "preview": "package com.fluid.afm.markdown.code;\n\nimport static io.noties.markwon.core.MarkwonTheme.CODE_BLOCK_HEADER_HEIGHT;\n\nimpor"
  },
  {
    "path": "Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/html/CustomHtmlPlugin.java",
    "chars": 7393,
    "preview": "package com.fluid.afm.markdown.html;\n\nimport android.os.SystemClock;\nimport android.text.SpannableStringBuilder;\nimport "
  },
  {
    "path": "Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/html/CustomIndentSpan.java",
    "chars": 888,
    "preview": "package com.fluid.afm.markdown.html;\n\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.text"
  },
  {
    "path": "Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/html/CustomUnderlineSpan.java",
    "chars": 1160,
    "preview": "package com.fluid.afm.markdown.html;\n\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.text"
  },
  {
    "path": "Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/html/HtmlMarkTagHandler.java",
    "chars": 4875,
    "preview": "package com.fluid.afm.markdown.html;\n\nimport android.graphics.Color;\nimport android.graphics.Typeface;\nimport android.te"
  },
  {
    "path": "Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/html/HtmlParaTagHandler.java",
    "chars": 4740,
    "preview": "package com.fluid.afm.markdown.html;\n\nimport android.content.Context;\nimport android.text.TextUtils;\n\nimport androidx.an"
  },
  {
    "path": "Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/html/HtmlSpanTagHandler.java",
    "chars": 9520,
    "preview": "package com.fluid.afm.markdown.html;\n\nimport android.content.Context;\nimport android.graphics.Color;\nimport android.grap"
  },
  {
    "path": "Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/html/SpanTextClickableSpan.java",
    "chars": 1553,
    "preview": "package com.fluid.afm.markdown.html;\n\nimport android.text.TextPaint;\nimport android.text.style.URLSpan;\nimport android.v"
  },
  {
    "path": "Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/html/TextHeightBackgroundSpan.java",
    "chars": 1555,
    "preview": "package com.fluid.afm.markdown.html;\n\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.grap"
  },
  {
    "path": "Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/icon/IconSpan.java",
    "chars": 2657,
    "preview": "package com.fluid.afm.markdown.icon;\n\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.text"
  },
  {
    "path": "Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/icon/IconSpanHandler.java",
    "chars": 1251,
    "preview": "package com.fluid.afm.markdown.icon;\n\nimport android.widget.TextView;\n\nimport java.util.Collection;\nimport java.util.Col"
  },
  {
    "path": "Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/iconlink/IconLinkSpan.java",
    "chars": 7468,
    "preview": "package com.fluid.afm.markdown.iconlink;\n\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android."
  },
  {
    "path": "Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/iconlink/IconLinkSpanHandler.java",
    "chars": 3945,
    "preview": "package com.fluid.afm.markdown.iconlink;\n\nimport android.graphics.Color;\nimport android.text.TextPaint;\nimport android.t"
  },
  {
    "path": "Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/image/CustomImageSpan.java",
    "chars": 910,
    "preview": "package com.fluid.afm.markdown.image;\n\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.gra"
  },
  {
    "path": "Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/image/FootnoteClickSpan.java",
    "chars": 806,
    "preview": "package com.fluid.afm.markdown.image;\n\nimport android.annotation.SuppressLint;\nimport android.text.style.ClickableSpan;\n"
  },
  {
    "path": "Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/image/FootnoteSpan.java",
    "chars": 3655,
    "preview": "package com.fluid.afm.markdown.image;\n\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.tex"
  },
  {
    "path": "Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/image/SuperscriptImageSpan.java",
    "chars": 1553,
    "preview": "package com.fluid.afm.markdown.image;\n\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.gra"
  },
  {
    "path": "Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/list/DefinitionListPlugin.java",
    "chars": 7138,
    "preview": "package com.fluid.afm.markdown.list;\n\nimport android.text.TextUtils;\n\nimport androidx.annotation.NonNull;\n\nimport com.fl"
  },
  {
    "path": "Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/model/EventModel.java",
    "chars": 1030,
    "preview": "package com.fluid.afm.markdown.model;\n\nimport androidx.annotation.NonNull;\n\nimport java.util.Objects;\n\npublic class Even"
  },
  {
    "path": "Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/span/LinkClickSpan.java",
    "chars": 2868,
    "preview": "package com.fluid.afm.markdown.span;\n\nimport android.graphics.Canvas;\nimport android.graphics.Color;\nimport android.grap"
  },
  {
    "path": "Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/span/OpacitySpan.java",
    "chars": 452,
    "preview": "package com.fluid.afm.markdown.span;\n\nimport android.text.TextPaint;\nimport android.text.style.CharacterStyle;\nimport an"
  },
  {
    "path": "Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/text/AfmTextPlugin.java",
    "chars": 4682,
    "preview": "package com.fluid.afm.markdown.text;\n\nimport android.content.Context;\nimport android.graphics.drawable.Drawable;\nimport "
  },
  {
    "path": "Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/text/FootnoteInTableSpan.java",
    "chars": 827,
    "preview": "package com.fluid.afm.markdown.text;\n\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.text"
  },
  {
    "path": "Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/text/RoundedBackgroundSpan.java",
    "chars": 2928,
    "preview": "package com.fluid.afm.markdown.text;\n\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.grap"
  },
  {
    "path": "Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/markdown/widget/PrinterMarkDownTextView.java",
    "chars": 22010,
    "preview": "package com.fluid.afm.markdown.widget;\n\nimport android.content.Context;\nimport android.content.ContextWrapper;\nimport an"
  },
  {
    "path": "Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/ui/MarkDownPreviewActivity.java",
    "chars": 6347,
    "preview": "package com.fluid.afm.ui;\n\nimport android.annotation.SuppressLint;\nimport android.content.pm.ActivityInfo;\nimport androi"
  },
  {
    "path": "Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/ui/MarkdownContentAdapter.java",
    "chars": 2047,
    "preview": "package com.fluid.afm.ui;\n\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\n"
  },
  {
    "path": "Android/AntFluid/fluid-markdown/src/main/java/com/fluid/afm/ui/MarkdownTextAdapter.java",
    "chars": 3476,
    "preview": "package com.fluid.afm.ui;\n\nimport android.text.Spanned;\nimport android.util.TypedValue;\nimport android.view.LayoutInflat"
  },
  {
    "path": "Android/AntFluid/fluid-markdown/src/main/res/drawable/back.xml",
    "chars": 374,
    "preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\" android:autoMirrored=\"true\" android:height=\"24dp\" and"
  },
  {
    "path": "Android/AntFluid/fluid-markdown/src/main/res/drawable/bg_shape_ffffffff_12.xml",
    "chars": 190,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <corners a"
  },
  {
    "path": "Android/AntFluid/fluid-markdown/src/main/res/drawable/default_placeholderdefault.xml",
    "chars": 260,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <size\n    "
  },
  {
    "path": "Android/AntFluid/fluid-markdown/src/main/res/drawable/ic_triangle.xml",
    "chars": 328,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:wi"
  },
  {
    "path": "Android/AntFluid/fluid-markdown/src/main/res/layout/activity_magnify_table.xml",
    "chars": 1329,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmln"
  },
  {
    "path": "Android/AntFluid/fluid-markdown/src/main/res/layout/item_markdown_content.xml",
    "chars": 418,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.recyclerview.widget.RecyclerView\n    xmlns:android=\"http://schemas.andr"
  },
  {
    "path": "Android/AntFluid/fluid-markdown/src/main/res/layout/item_markdown_text.xml",
    "chars": 361,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.fluid.afm.markdown.widget.MarkdownTextView\n    xmlns:android=\"http://schemas"
  },
  {
    "path": "Android/AntFluid/fluid-markdown/src/main/res/values/colors.xml",
    "chars": 103,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"white\">#FFFFFF</color>\n</resources>"
  },
  {
    "path": "Android/AntFluid/fluid-markdown/src/main/res/values/dimes.xml",
    "chars": 115,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <dimen name=\"chat_bubble_paddingH\">16dp</dimen>\n</resources>"
  },
  {
    "path": "Android/AntFluid/fluid-markdown/src/main/res/values/ids.xml",
    "chars": 116,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <item type=\"id\" name=\"markdown_need_animation\"/>\n</resources>"
  },
  {
    "path": "Android/AntFluid/fluid-markdown/src/main/res/values/strings.xml",
    "chars": 99,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"back\">返回</string>\n</resources>"
  },
  {
    "path": "Android/AntFluid/fluid-markdown/src/main/res/values/themes.xml",
    "chars": 154,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <style name=\"Theme.Preview\" parent=\"Theme.AppCompat.Light.NoActi"
  },
  {
    "path": "Android/AntFluid/fluid-markdown/src/test/java/com/fluid/afm/ExampleUnitTest.java",
    "chars": 385,
    "preview": "package com.fluid.afm;\n\nimport static org.junit.Assert.assertEquals;\n\nimport org.junit.Test;\n\n/**\n * Example local unit "
  },
  {
    "path": "Android/AntFluid/gradle/libs.versions.toml",
    "chars": 2493,
    "preview": "[versions]\nagp = \"8.9.1\"\nkotlin = \"2.0.21\"\ncoreKtx = \"1.16.0\"\njunit = \"4.13.2\"\njunitVersion = \"1.2.1\"\nespressoCore = \"3."
  },
  {
    "path": "Android/AntFluid/gradle/wrapper/gradle-wrapper.properties",
    "chars": 244,
    "preview": "#Tue Aug 05 12:12:33 CST 2025\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://"
  },
  {
    "path": "Android/AntFluid/gradle.properties",
    "chars": 1801,
    "preview": "# Project-wide Gradle settings.\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will ov"
  },
  {
    "path": "Android/AntFluid/gradlew",
    "chars": 5766,
    "preview": "#!/usr/bin/env sh\n\n#\n# Copyright 2015 the original author or authors.\n#\n# Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "Android/AntFluid/gradlew.bat",
    "chars": 2674,
    "preview": "@rem\n@rem Copyright 2015 the original author or authors.\n@rem\n@rem Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "Android/AntFluid/markwon-core/.gitignore",
    "chars": 6,
    "preview": "/build"
  },
  {
    "path": "Android/AntFluid/markwon-core/build.gradle",
    "chars": 761,
    "preview": "plugins {\n    alias(libs.plugins.android.library)\n}\n\nandroid {\n    namespace 'io.noties.markwon'\n    compileSdk 35\n\n    "
  },
  {
    "path": "Android/AntFluid/markwon-core/proguard-rules.pro",
    "chars": 750,
    "preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/androidTest/java/io/noties/markwon/ExampleInstrumentedTest.kt",
    "chars": 659,
    "preview": "package io.noties.markwon\n\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.platform.app.Instru"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/AndroidManifest.xml",
    "chars": 286,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest package=\"io.noties.markwon\"\n    xmlns:android=\"http://schemas.android.c"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/ContextHolder.java",
    "chars": 388,
    "preview": "package com.fluid.afm;\n\nimport android.annotation.SuppressLint;\nimport android.content.Context;\n\npublic class ContextHol"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/StreamOutStateObserver.java",
    "chars": 130,
    "preview": "package com.fluid.afm;\n\npublic interface StreamOutStateObserver {\n\n    void onStreamOutStateChanged(boolean isStreamingO"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/func/Callback.java",
    "chars": 190,
    "preview": "package com.fluid.afm.func;\n\npublic interface Callback<T> {\n\n    /**\n     * 成功\n     *\n     * @param t result\n     */\n   "
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/func/IImageClickCallback.java",
    "chars": 127,
    "preview": "package com.fluid.afm.func;\n\n\npublic interface IImageClickCallback {\n    void imageClicked(String url, String descriptio"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/handler/BackgroundTaskHandler.java",
    "chars": 219,
    "preview": "package com.fluid.afm.handler;\n\nimport java.util.concurrent.ThreadPoolExecutor;\n\npublic interface BackgroundTaskHandler "
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/handler/DefaultLogHandler.java",
    "chars": 761,
    "preview": "package com.fluid.afm.handler;\n\nimport android.util.Log;\n\npublic class DefaultLogHandler implements LogHandler {\n\n    pu"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/handler/DefaultTaskHandler.java",
    "chars": 726,
    "preview": "package com.fluid.afm.handler;\n\nimport java.util.concurrent.ExecutorService;\nimport java.util.concurrent.Executors;\nimpo"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/handler/DefualtImageHandler.java",
    "chars": 3850,
    "preview": "package com.fluid.afm.handler;\n\nimport android.content.Context;\nimport android.graphics.Bitmap;\nimport android.graphics."
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/handler/EventHandlerManager.java",
    "chars": 1628,
    "preview": "package com.fluid.afm.handler;\n\npublic class EventHandlerManager {\n    private static BackgroundTaskHandler sBackgroundT"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/handler/ImageHandler.java",
    "chars": 518,
    "preview": "package com.fluid.afm.handler;\n\nimport android.content.Context;\nimport android.graphics.drawable.Drawable;\n\nimport com.f"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/handler/LogHandler.java",
    "chars": 370,
    "preview": "package com.fluid.afm.handler;\n\npublic interface LogHandler {\n    void i(String tag, String msg);\n    void e(String tag,"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/icon/DrawableWrapper.java",
    "chars": 4356,
    "preview": "package com.fluid.afm.icon;\n\nimport android.content.Context;\nimport android.graphics.Bitmap;\nimport android.graphics.dra"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/icon/LoadIconUtil.java",
    "chars": 2021,
    "preview": "package com.fluid.afm.icon;\n\nimport com.fluid.afm.utils.MDLogger;\n\nimport java.lang.ref.Reference;\nimport java.lang.ref."
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/icon/LoadImageCallback.java",
    "chars": 959,
    "preview": "package com.fluid.afm.icon;\n\nimport android.graphics.drawable.Drawable;\nimport android.os.Looper;\nimport android.widget."
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/span/AntUnderlineSupportMulLinesSpan.java",
    "chars": 1340,
    "preview": "package com.fluid.afm.span;\n\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.text.style.Re"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/span/BaseIconTextSpan.java",
    "chars": 1970,
    "preview": "package com.fluid.afm.span;\n\nimport android.text.TextPaint;\nimport android.text.TextUtils;\nimport android.text.style.Lea"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/span/CodeLanguageSpan.java",
    "chars": 252,
    "preview": "package com.fluid.afm.span;\n\npublic class CodeLanguageSpan {\n    private final String language;\n\n    public CodeLanguage"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/span/HeadingTopOrBottomSpacingSpan.java",
    "chars": 1656,
    "preview": "package com.fluid.afm.span;\n\nimport android.graphics.Paint;\nimport android.text.Spanned;\nimport android.text.style.LineH"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/span/IClickableSpan.java",
    "chars": 208,
    "preview": "package com.fluid.afm.span;\n\npublic interface IClickableSpan {\n    String getUrl();\n    String getType();\n\n    int getTo"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/span/LinkWithIconSpan.java",
    "chars": 2929,
    "preview": "package com.fluid.afm.span;\n\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.text.TextPain"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/span/ParagraphSpacingSpan.java",
    "chars": 1713,
    "preview": "package com.fluid.afm.span;\n\nimport android.graphics.Paint;\nimport android.text.Spanned;\nimport android.text.style.LineH"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/styles/BlockQuoteStyle.java",
    "chars": 2964,
    "preview": "package com.fluid.afm.styles;\n\nimport com.fluid.afm.utils.Utils;\n\n\npublic class BlockQuoteStyle {\n    private static fin"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/styles/BulletStyle.java",
    "chars": 784,
    "preview": "package com.fluid.afm.styles;\n\n\npublic class BulletStyle {\n    private Shape shape;\n    private int leadingSpacing = -1;"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/styles/CodeStyle.java",
    "chars": 7464,
    "preview": "package com.fluid.afm.styles;\n\nimport android.graphics.Color;\nimport android.graphics.Typeface;\nimport android.os.Parcel"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/styles/FootnoteStyle.java",
    "chars": 2141,
    "preview": "package com.fluid.afm.styles;\n\nimport static java.lang.annotation.RetentionPolicy.SOURCE;\n\nimport androidx.annotation.In"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/styles/HorizonRuleStyle.java",
    "chars": 2000,
    "preview": "package com.fluid.afm.styles;\n\nimport android.graphics.Paint;\n\npublic class HorizonRuleStyle {\n    /**\n     * return thi"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/styles/LinkStyle.java",
    "chars": 1447,
    "preview": "package com.fluid.afm.styles;\n\npublic class LinkStyle {\n\n    private int fontColor;\n    private int space;\n    private S"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/styles/MarkdownStyles.java",
    "chars": 10833,
    "preview": "package com.fluid.afm.styles;\n\nimport android.graphics.Color;\nimport android.graphics.Typeface;\n\nimport com.fluid.afm.ut"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/styles/OrderStyle.java",
    "chars": 1901,
    "preview": "package com.fluid.afm.styles;\n\nimport com.fluid.afm.utils.ParseUtil;\n\n/**\n * 有序列表\n * \"unorder\": {\n * \"item1\": {\n * \"shap"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/styles/ParagraphStyle.java",
    "chars": 1073,
    "preview": "package com.fluid.afm.styles;\n\n\npublic class ParagraphStyle {\n   private float fontSize;\n   private int fontColor;\n   pr"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/styles/Shape.java",
    "chars": 1948,
    "preview": "package com.fluid.afm.styles;\n\n/**\n * \"shape\": {\n * \"type\": \"circle\",\n * \"size\": \"1.5px\",\n * \"color\": \"#13113e\"\n * }\n */"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/styles/TableStyle.java",
    "chars": 10866,
    "preview": "package com.fluid.afm.styles;\n\nimport android.graphics.Color;\nimport android.graphics.Paint;\nimport android.os.Parcel;\ni"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/styles/TitleStyle.java",
    "chars": 2381,
    "preview": "package com.fluid.afm.styles;\n\nimport android.graphics.Typeface;\nimport android.text.TextPaint;\n\npublic class TitleStyle"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/styles/UnderlineStyle.java",
    "chars": 660,
    "preview": "package com.fluid.afm.styles;\n\nimport com.fluid.afm.utils.Utils;\n\npublic class UnderlineStyle {\n    private int height ="
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/utils/MDLogger.java",
    "chars": 1263,
    "preview": "package com.fluid.afm.utils;\n\nimport com.fluid.afm.handler.EventHandlerManager;\n\npublic class MDLogger {\n    private sta"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/utils/ParseUtil.java",
    "chars": 3817,
    "preview": "package com.fluid.afm.utils;\n\nimport android.content.Context;\nimport android.graphics.Color;\nimport android.text.TextUti"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/com/fluid/afm/utils/Utils.java",
    "chars": 4972,
    "preview": "package com.fluid.afm.utils;\n\nimport android.content.Context;\nimport android.content.res.Resources;\nimport android.graph"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/AbstractMarkwonPlugin.java",
    "chars": 1593,
    "preview": "package io.noties.markwon;\n\nimport android.text.Spanned;\nimport android.widget.TextView;\n\nimport androidx.annotation.Non"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/BlockHandlerDef.java",
    "chars": 551,
    "preview": "package io.noties.markwon;\n\nimport androidx.annotation.NonNull;\n\nimport org.commonmark.node.Node;\n\n/**\n * @since 4.3.0\n "
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/LinkResolver.java",
    "chars": 298,
    "preview": "package io.noties.markwon;\n\nimport android.view.View;\n\nimport androidx.annotation.NonNull;\n\n/**\n * @see LinkResolverDef\n"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/LinkResolverDef.java",
    "chars": 1333,
    "preview": "package io.noties.markwon;\n\nimport android.content.ActivityNotFoundException;\nimport android.content.Context;\nimport and"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/Markwon.java",
    "chars": 7441,
    "preview": "package io.noties.markwon;\n\nimport android.content.Context;\nimport android.text.Spanned;\nimport android.widget.TextView;"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/MarkwonBuilderImpl.java",
    "chars": 4521,
    "preview": "package io.noties.markwon;\n\nimport android.content.Context;\nimport android.widget.TextView;\n\nimport androidx.annotation."
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/MarkwonConfiguration.java",
    "chars": 4949,
    "preview": "package io.noties.markwon;\n\nimport androidx.annotation.NonNull;\n\nimport io.noties.markwon.core.MarkwonTheme;\nimport io.n"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/MarkwonImpl.java",
    "chars": 5527,
    "preview": "package io.noties.markwon;\n\nimport android.text.SpannableStringBuilder;\nimport android.text.Spanned;\nimport android.text"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/MarkwonPlugin.java",
    "chars": 5077,
    "preview": "package io.noties.markwon;\n\nimport android.text.Spanned;\nimport android.widget.TextView;\n\nimport androidx.annotation.Non"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/MarkwonReducer.java",
    "chars": 1771,
    "preview": "package io.noties.markwon;\n\nimport androidx.annotation.NonNull;\n\nimport org.commonmark.node.LinkReferenceDefinition;\nimp"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/MarkwonSpansFactory.java",
    "chars": 3222,
    "preview": "package io.noties.markwon;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\nimport org.commonm"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/MarkwonSpansFactoryImpl.java",
    "chars": 5068,
    "preview": "package io.noties.markwon;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\nimport org.commonm"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/MarkwonVisitor.java",
    "chars": 5464,
    "preview": "package io.noties.markwon;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\nimport org.commonm"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/MarkwonVisitorFactory.java",
    "chars": 598,
    "preview": "package io.noties.markwon;\n\nimport androidx.annotation.NonNull;\n\n/**\n * @since 4.1.1\n */\nabstract class MarkwonVisitorFa"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/MarkwonVisitorImpl.java",
    "chars": 8959,
    "preview": "package io.noties.markwon;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\nimport org.commonm"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/PrecomputedFutureTextSetterCompat.java",
    "chars": 2301,
    "preview": "package io.noties.markwon;\n\nimport android.text.Spanned;\nimport android.widget.TextView;\n\nimport androidx.annotation.Non"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/PrecomputedTextSetterCompat.java",
    "chars": 4249,
    "preview": "package io.noties.markwon;\n\nimport android.os.Build;\nimport android.text.Spanned;\nimport android.util.Log;\nimport androi"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/Prop.java",
    "chars": 1877,
    "preview": "package io.noties.markwon;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\n/**\n * Class to ho"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/RegistryImpl.java",
    "chars": 3366,
    "preview": "package io.noties.markwon;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\nimport java.util.A"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/RenderProps.java",
    "chars": 412,
    "preview": "package io.noties.markwon;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\n/**\n * @since 3.0."
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/RenderPropsImpl.java",
    "chars": 1102,
    "preview": "package io.noties.markwon;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\nimport java.util.H"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/SoftBreakAddsNewLinePlugin.java",
    "chars": 710,
    "preview": "package io.noties.markwon;\n\nimport androidx.annotation.NonNull;\n\nimport org.commonmark.node.SoftLineBreak;\n\n/**\n * @sinc"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/SpanFactory.java",
    "chars": 293,
    "preview": "package io.noties.markwon;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\n/**\n * @since 3.0."
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/SpannableBuilder.java",
    "chars": 14371,
    "preview": "package io.noties.markwon;\n\nimport android.text.SpannableStringBuilder;\nimport android.text.Spanned;\n\nimport androidx.an"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/core/CorePlugin.java",
    "chars": 27907,
    "preview": "package io.noties.markwon.core;\n\nimport android.content.Context;\nimport android.text.Spannable;\nimport android.text.Span"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/core/CoreProps.java",
    "chars": 1316,
    "preview": "package io.noties.markwon.core;\n\nimport io.noties.markwon.Prop;\n\n/**\n * @since 3.0.0\n */\npublic abstract class CoreProps"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/core/MarkwonTheme.java",
    "chars": 12818,
    "preview": "\npackage io.noties.markwon.core;\n\nimport android.content.Context;\nimport android.graphics.Paint;\nimport android.graphics"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/core/SimpleBlockNodeVisitor.java",
    "chars": 914,
    "preview": "package io.noties.markwon.core;\n\nimport androidx.annotation.NonNull;\n\nimport org.commonmark.node.Node;\n\nimport io.noties"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/core/factory/BlockQuoteSpanFactory.java",
    "chars": 547,
    "preview": "package io.noties.markwon.core.factory;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\nimpor"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/core/factory/CodeBlockSpanFactory.java",
    "chars": 544,
    "preview": "package io.noties.markwon.core.factory;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\nimpor"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/core/factory/CodeSpanFactory.java",
    "chars": 529,
    "preview": "package io.noties.markwon.core.factory;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\nimpor"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/core/factory/EmphasisSpanFactory.java",
    "chars": 520,
    "preview": "package io.noties.markwon.core.factory;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\nimpor"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/core/factory/HeadingSpanFactory.java",
    "chars": 661,
    "preview": "package io.noties.markwon.core.factory;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\nimpor"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/core/factory/LinkSpanFactory.java",
    "chars": 701,
    "preview": "package io.noties.markwon.core.factory;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\nimpor"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/core/factory/ListItemSpanFactory.java",
    "chars": 1253,
    "preview": "package io.noties.markwon.core.factory;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\nimpor"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/core/factory/StrongEmphasisSpanFactory.java",
    "chars": 538,
    "preview": "package io.noties.markwon.core.factory;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\nimpor"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/core/factory/ThematicBreakSpanFactory.java",
    "chars": 556,
    "preview": "package io.noties.markwon.core.factory;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\nimpor"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/core/spans/BlockQuoteSpan.java",
    "chars": 3972,
    "preview": "package io.noties.markwon.core.spans;\n\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.gra"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/core/spans/BulletListItemSpan.java",
    "chars": 8906,
    "preview": "package io.noties.markwon.core.spans;\n\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.gra"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/core/spans/CodeBlockSpan.java",
    "chars": 6689,
    "preview": "package io.noties.markwon.core.spans;\n\nimport static io.noties.markwon.core.MarkwonTheme.CODE_BLOCK_HEADER_HEIGHT;\n\nimpo"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/core/spans/CodeSpan.java",
    "chars": 741,
    "preview": "package io.noties.markwon.core.spans;\n\nimport android.text.TextPaint;\nimport android.text.style.MetricAffectingSpan;\n\nim"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/core/spans/CustomTypefaceSpan.java",
    "chars": 2848,
    "preview": "package io.noties.markwon.core.spans;\n\nimport android.annotation.SuppressLint;\nimport android.graphics.Typeface;\nimport "
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/core/spans/EmphasisSpan.java",
    "chars": 381,
    "preview": "package io.noties.markwon.core.spans;\n\nimport android.text.TextPaint;\nimport android.text.style.MetricAffectingSpan;\n\npu"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/core/spans/HeadingSpan.java",
    "chars": 1924,
    "preview": "package io.noties.markwon.core.spans;\n\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.tex"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/core/spans/LastLineSpacingSpan.java",
    "chars": 1333,
    "preview": "package io.noties.markwon.core.spans;\n\nimport android.graphics.Paint;\nimport android.text.Spanned;\nimport android.text.s"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/core/spans/LinkSpan.java",
    "chars": 983,
    "preview": "package io.noties.markwon.core.spans;\n\nimport android.text.TextPaint;\nimport android.text.style.URLSpan;\nimport android."
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/core/spans/ObjectsPool.java",
    "chars": 903,
    "preview": "package io.noties.markwon.core.spans;\n\nimport android.graphics.Paint;\nimport android.graphics.Rect;\nimport android.graph"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/core/spans/OrderedListItemSpan.java",
    "chars": 9505,
    "preview": "package io.noties.markwon.core.spans;\n\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.tex"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/core/spans/StrongEmphasisSpan.java",
    "chars": 388,
    "preview": "package io.noties.markwon.core.spans;\n\nimport android.text.TextPaint;\nimport android.text.style.MetricAffectingSpan;\n\npu"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/core/spans/TextLayoutSpan.java",
    "chars": 1810,
    "preview": "package io.noties.markwon.core.spans;\n\nimport android.text.Layout;\nimport android.text.Spannable;\nimport android.text.Sp"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/core/spans/TextViewSpan.java",
    "chars": 1803,
    "preview": "package io.noties.markwon.core.spans;\n\nimport android.text.Spannable;\nimport android.text.Spanned;\nimport android.widget"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/core/spans/ThematicBreakSpan.java",
    "chars": 3561,
    "preview": "package io.noties.markwon.core.spans;\n\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.gra"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/image/AsyncDrawable.java",
    "chars": 14096,
    "preview": "package io.noties.markwon.image;\n\nimport android.graphics.Canvas;\nimport android.graphics.ColorFilter;\nimport android.gr"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/image/AsyncDrawableLoader.java",
    "chars": 642,
    "preview": "package io.noties.markwon.image;\n\nimport android.graphics.drawable.Drawable;\n\nimport androidx.annotation.NonNull;\nimport"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/image/AsyncDrawableLoaderNoOp.java",
    "chars": 494,
    "preview": "package io.noties.markwon.image;\n\nimport android.graphics.drawable.Drawable;\n\nimport androidx.annotation.NonNull;\nimport"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/image/AsyncDrawableScheduler.java",
    "chars": 6485,
    "preview": "package io.noties.markwon.image;\n\nimport android.graphics.Rect;\nimport android.graphics.drawable.Drawable;\nimport androi"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/image/AsyncDrawableSpan.java",
    "chars": 8837,
    "preview": "\npackage io.noties.markwon.image;\n\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.graphic"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/image/DrawableUtils.java",
    "chars": 823,
    "preview": "package io.noties.markwon.image;\n\nimport android.graphics.Rect;\nimport android.graphics.drawable.Drawable;\n\nimport andro"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/image/ImageProps.java",
    "chars": 442,
    "preview": "package io.noties.markwon.image;\n\nimport io.noties.markwon.Prop;\n\n/**\n * @since 3.0.0\n */\npublic abstract class ImagePro"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/image/ImageSize.java",
    "chars": 1004,
    "preview": "package io.noties.markwon.image;\n\nimport androidx.annotation.Nullable;\n\n/**\n * @since 1.0.1\n */\n@SuppressWarnings(\"Weake"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/image/ImageSizeResolver.java",
    "chars": 417,
    "preview": "package io.noties.markwon.image;\n\nimport android.graphics.Rect;\n\nimport androidx.annotation.NonNull;\n\n/**\n * @see ImageS"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/image/ImageSizeResolverDef.java",
    "chars": 4678,
    "preview": "package io.noties.markwon.image;\n\nimport android.content.Context;\nimport android.graphics.Rect;\nimport android.util.Log;"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/image/ImageSpanFactory.java",
    "chars": 2407,
    "preview": "package io.noties.markwon.image;\n\nimport android.util.Log;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotati"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/image/destination/ImageDestinationProcessor.java",
    "chars": 590,
    "preview": "package io.noties.markwon.image.destination;\n\nimport androidx.annotation.NonNull;\n\n/**\n * Process destination of image n"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/image/destination/ImageDestinationProcessorAssets.java",
    "chars": 2008,
    "preview": "package io.noties.markwon.image.destination;\n\nimport android.net.Uri;\nimport android.text.TextUtils;\n\nimport androidx.an"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/image/destination/ImageDestinationProcessorRelativeToAbsolute.java",
    "chars": 1530,
    "preview": "package io.noties.markwon.image.destination;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\n"
  },
  {
    "path": "Android/AntFluid/markwon-core/src/main/java/io/noties/markwon/movement/MovementMethodPlugin.java",
    "chars": 2266,
    "preview": "package io.noties.markwon.movement;\n\nimport android.text.Spanned;\nimport android.text.method.LinkMovementMethod;\nimport "
  }
]

// ... and 1126 more files (download for full content)

About this extraction

This page contains the full source code of the antgroup/FluidMarkdown GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1326 files (7.8 MB), approximately 2.1M tokens, and a symbol index with 5266 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!