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">< \n\n \n\n\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">< \n\n \n\n\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
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
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.