From 5313b35fa218e5fcf7af5715cececc046aeffdd9 Mon Sep 17 00:00:00 2001 From: k0shk0sh Date: Sun, 21 Jul 2019 11:08:47 +0200 Subject: [PATCH] add emoji support for markwon --- .../github/di/modules/FragmentModule.kt | 78 +++++++------ .../github/di/modules/NetworkModule.kt | 22 +++- .../platform/markwon/hashtag/HashTag.kt | 27 ----- .../markwon/hashtag/HashTagExtension.kt | 29 ----- .../internal/HashTagDelimiterProcessor.kt | 42 ------- .../hashtag/internal/HashTagNodeRenderer.kt | 31 ------ .../platform/markwon/mention/Mention.kt | 24 ---- .../markwon/mention/MentionExtension.kt | 31 ------ .../internal/MentionDelimiterProcessor.kt | 44 -------- .../mention/internal/MentionNodeRenderer.kt | 31 ------ .../github/ui/adapter/IssueTimelineAdapter.kt | 6 +- .../adapter/viewholder/CommentViewHolder.kt | 39 ++++--- .../modules/issue/fragment/IssueFragment.kt | 8 +- .../issuesprs/CloseOpenIssuePrUseCase.kt | 2 + build-dependecies/fasthub-dependencies.gradle | 12 +- .../fastaccess/markdown/MarkdownProvider.kt | 105 +----------------- .../markdown/extension/TagExtension.kt | 14 --- .../extension}/markwon/emoji/Emoji.kt | 4 +- .../markwon/emoji/EmojiExtension.kt | 6 +- .../extension/markwon/emoji/EmojiPlugin.kt | 33 ++++++ .../markwon/emoji/EmojiSpanFactory.kt | 30 +++++ .../emoji/internal/EmojiDelimiterProcessor.kt | 4 +- .../emoji/internal/EmojiNodeRenderer.kt | 4 +- .../spans/CodeBackgroundRoundedSpan.kt | 51 --------- .../markdown/spans/DrawableHandler.kt | 41 ------- .../fastaccess/markdown/spans/EmojiHandler.kt | 28 ----- .../com/fastaccess/markdown/spans/FontSpan.kt | 21 ---- .../markdown/spans/HeaderHandler.kt | 38 ------- .../fastaccess/markdown/spans/HrHandler.kt | 30 ----- .../com/fastaccess/markdown/spans/HrSpan.kt | 34 ------ .../markdown/spans/ItalicHandler.kt | 17 --- .../fastaccess/markdown/spans/LinkHandler.kt | 37 ------ .../fastaccess/markdown/spans/ListsHandler.kt | 79 ------------- .../markdown/spans/MarginHandler.kt | 30 ----- .../fastaccess/markdown/spans/MdQouteSpan.kt | 55 --------- .../markdown/spans/PreTagHandler.kt | 82 -------------- .../fastaccess/markdown/spans/QuoteHandler.kt | 24 ---- .../markdown/spans/StrikethroughHandler.kt | 14 --- .../markdown/spans/SubScriptHandler.kt | 17 --- .../markdown/spans/SuperScriptHandler.kt | 18 --- .../markdown/spans/UnderlineHandler.kt | 15 --- .../com/fastaccess/markdown/spans/UrlSpan.kt | 18 --- .../markdown/spans/drawable/DrawableGetter.kt | 68 ------------ .../spans/drawable/GlideDrawableTarget.kt | 67 ----------- .../markdown/spans/drawable/UrlDrawable.kt | 45 -------- .../markdown/widget/HtmlTextView.kt | 21 ---- 46 files changed, 175 insertions(+), 1301 deletions(-) delete mode 100644 app/src/main/java/com/fastaccess/github/platform/markwon/hashtag/HashTag.kt delete mode 100644 app/src/main/java/com/fastaccess/github/platform/markwon/hashtag/HashTagExtension.kt delete mode 100644 app/src/main/java/com/fastaccess/github/platform/markwon/hashtag/internal/HashTagDelimiterProcessor.kt delete mode 100644 app/src/main/java/com/fastaccess/github/platform/markwon/hashtag/internal/HashTagNodeRenderer.kt delete mode 100644 app/src/main/java/com/fastaccess/github/platform/markwon/mention/Mention.kt delete mode 100644 app/src/main/java/com/fastaccess/github/platform/markwon/mention/MentionExtension.kt delete mode 100644 app/src/main/java/com/fastaccess/github/platform/markwon/mention/internal/MentionDelimiterProcessor.kt delete mode 100644 app/src/main/java/com/fastaccess/github/platform/markwon/mention/internal/MentionNodeRenderer.kt delete mode 100644 markdown/src/main/java/com/fastaccess/markdown/extension/TagExtension.kt rename {app/src/main/java/com/fastaccess/github/platform => markdown/src/main/java/com/fastaccess/markdown/extension}/markwon/emoji/Emoji.kt (76%) rename {app/src/main/java/com/fastaccess/github/platform => markdown/src/main/java/com/fastaccess/markdown/extension}/markwon/emoji/EmojiExtension.kt (74%) create mode 100644 markdown/src/main/java/com/fastaccess/markdown/extension/markwon/emoji/EmojiPlugin.kt create mode 100644 markdown/src/main/java/com/fastaccess/markdown/extension/markwon/emoji/EmojiSpanFactory.kt rename {app/src/main/java/com/fastaccess/github/platform => markdown/src/main/java/com/fastaccess/markdown/extension}/markwon/emoji/internal/EmojiDelimiterProcessor.kt (87%) rename {app/src/main/java/com/fastaccess/github/platform => markdown/src/main/java/com/fastaccess/markdown/extension}/markwon/emoji/internal/EmojiNodeRenderer.kt (87%) delete mode 100644 markdown/src/main/java/com/fastaccess/markdown/spans/CodeBackgroundRoundedSpan.kt delete mode 100644 markdown/src/main/java/com/fastaccess/markdown/spans/DrawableHandler.kt delete mode 100644 markdown/src/main/java/com/fastaccess/markdown/spans/EmojiHandler.kt delete mode 100644 markdown/src/main/java/com/fastaccess/markdown/spans/FontSpan.kt delete mode 100644 markdown/src/main/java/com/fastaccess/markdown/spans/HeaderHandler.kt delete mode 100644 markdown/src/main/java/com/fastaccess/markdown/spans/HrHandler.kt delete mode 100644 markdown/src/main/java/com/fastaccess/markdown/spans/HrSpan.kt delete mode 100644 markdown/src/main/java/com/fastaccess/markdown/spans/ItalicHandler.kt delete mode 100644 markdown/src/main/java/com/fastaccess/markdown/spans/LinkHandler.kt delete mode 100644 markdown/src/main/java/com/fastaccess/markdown/spans/ListsHandler.kt delete mode 100644 markdown/src/main/java/com/fastaccess/markdown/spans/MarginHandler.kt delete mode 100644 markdown/src/main/java/com/fastaccess/markdown/spans/MdQouteSpan.kt delete mode 100644 markdown/src/main/java/com/fastaccess/markdown/spans/PreTagHandler.kt delete mode 100644 markdown/src/main/java/com/fastaccess/markdown/spans/QuoteHandler.kt delete mode 100644 markdown/src/main/java/com/fastaccess/markdown/spans/StrikethroughHandler.kt delete mode 100644 markdown/src/main/java/com/fastaccess/markdown/spans/SubScriptHandler.kt delete mode 100644 markdown/src/main/java/com/fastaccess/markdown/spans/SuperScriptHandler.kt delete mode 100644 markdown/src/main/java/com/fastaccess/markdown/spans/UnderlineHandler.kt delete mode 100644 markdown/src/main/java/com/fastaccess/markdown/spans/UrlSpan.kt delete mode 100644 markdown/src/main/java/com/fastaccess/markdown/spans/drawable/DrawableGetter.kt delete mode 100644 markdown/src/main/java/com/fastaccess/markdown/spans/drawable/GlideDrawableTarget.kt delete mode 100644 markdown/src/main/java/com/fastaccess/markdown/spans/drawable/UrlDrawable.kt delete mode 100644 markdown/src/main/java/com/fastaccess/markdown/widget/HtmlTextView.kt diff --git a/app/src/main/java/com/fastaccess/github/di/modules/FragmentModule.kt b/app/src/main/java/com/fastaccess/github/di/modules/FragmentModule.kt index 64934cf2..e011e332 100644 --- a/app/src/main/java/com/fastaccess/github/di/modules/FragmentModule.kt +++ b/app/src/main/java/com/fastaccess/github/di/modules/FragmentModule.kt @@ -1,19 +1,32 @@ package com.fastaccess.github.di.modules +import android.annotation.SuppressLint import android.content.Context +import com.fastaccess.data.storage.FastHubSharedPreference +import com.fastaccess.github.R +import com.fastaccess.github.base.engine.ThemeEngine import com.fastaccess.github.di.annotations.ForApplication import com.fastaccess.github.di.scopes.PerFragment -import com.fastaccess.github.extensions.getDrawableCompat import com.fastaccess.github.platform.mentions.MentionsPresenter import com.fastaccess.github.ui.modules.issue.fragment.IssueFragment import com.fastaccess.github.usecase.search.FilterSearchUsersUseCase -import com.fastaccess.markdown.R -import com.fastaccess.markdown.spans.* +import com.fastaccess.github.utils.extensions.theme +import com.fastaccess.markdown.GrammarLocatorDef +import com.fastaccess.markdown.extension.markwon.emoji.EmojiPlugin import dagger.Module import dagger.Provides -import net.nightwhistler.htmlspanner.HtmlSpanner -import net.nightwhistler.htmlspanner.handlers.StyledTextHandler -import net.nightwhistler.htmlspanner.style.Style +import io.noties.markwon.Markwon +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.html.HtmlPlugin +import io.noties.markwon.image.glide.GlideImagesPlugin +import io.noties.markwon.linkify.LinkifyPlugin +import io.noties.markwon.syntax.Prism4jThemeDarkula +import io.noties.markwon.syntax.Prism4jThemeDefault +import io.noties.markwon.syntax.SyntaxHighlightPlugin +import io.noties.prism4j.Prism4j /** * Created by Kosh on 02.02.19. @@ -23,36 +36,29 @@ class FragmentModule { @PerFragment @Provides fun provideContext(fragment: IssueFragment) = fragment.requireContext() - @PerFragment @Provides fun provideHtmlSpanner(@ForApplication context: Context): HtmlSpanner { - val mySpanner = HtmlSpanner() - mySpanner.isStripExtraWhiteSpace = true - val checked = context.getDrawableCompat(R.drawable.ic_checkbox_small) - val unchecked = context.getDrawableCompat(R.drawable.ic_checkbox_empty_small) - mySpanner.registerHandler("li", ListsHandler(checked, unchecked)) - mySpanner.registerHandler("g-emoji", EmojiHandler()) - mySpanner.registerHandler("b", StyledTextHandler(Style().setFontWeight(Style.FontWeight.BOLD))) - mySpanner.registerHandler("strong", StyledTextHandler(Style().setFontWeight(Style.FontWeight.BOLD))) - mySpanner.registerHandler("i", ItalicHandler()) - mySpanner.registerHandler("em", ItalicHandler()) - mySpanner.registerHandler("ul", MarginHandler()) - mySpanner.registerHandler("ol", MarginHandler()) - mySpanner.registerHandler("u", UnderlineHandler()) - mySpanner.registerHandler("strike", StrikethroughHandler()) - mySpanner.registerHandler("ins", UnderlineHandler()) - mySpanner.registerHandler("del", StrikethroughHandler()) - mySpanner.registerHandler("sub", SubScriptHandler()) - mySpanner.registerHandler("sup", SuperScriptHandler()) - mySpanner.registerHandler("a", LinkHandler()) - mySpanner.registerHandler("emoji", EmojiHandler()) - mySpanner.registerHandler("mention", LinkHandler()) - mySpanner.registerHandler("h1", HeaderHandler(1.5f)) - mySpanner.registerHandler("h2", HeaderHandler(1.4f)) - mySpanner.registerHandler("h3", HeaderHandler(1.3f)) - mySpanner.registerHandler("h4", HeaderHandler(1.2f)) - mySpanner.registerHandler("h5", HeaderHandler(1.1f)) - mySpanner.registerHandler("h6", HeaderHandler(1.0f)) - return mySpanner - } + @SuppressLint("PrivateResource") + @PerFragment @Provides fun provideMarkwon( + @ForApplication context: Context, + preference: FastHubSharedPreference + ): Markwon = Markwon.builder(context) + .usePlugin(JLatexMathPlugin.create(context.resources.getDimension(R.dimen.abc_text_size_subhead_material))) + .usePlugin(TaskListPlugin.create(context)) + .usePlugin(HtmlPlugin.create()) + .usePlugin(GlideImagesPlugin.create(context)) + .usePlugin(TablePlugin.create(context)) + .usePlugin(StrikethroughPlugin.create()) + .usePlugin(LinkifyPlugin.create()) + .usePlugin( + SyntaxHighlightPlugin.create( + Prism4j(GrammarLocatorDef()), if (ThemeEngine.isLightTheme(preference.theme)) { + Prism4jThemeDefault.create() + } else { + Prism4jThemeDarkula.create() + } + ) + ) + .usePlugin(EmojiPlugin.create()) + .build() @PerFragment @Provides fun provideMentionsPresenter( context: Context, diff --git a/app/src/main/java/com/fastaccess/github/di/modules/NetworkModule.kt b/app/src/main/java/com/fastaccess/github/di/modules/NetworkModule.kt index 1e5e2149..098ff0f7 100644 --- a/app/src/main/java/com/fastaccess/github/di/modules/NetworkModule.kt +++ b/app/src/main/java/com/fastaccess/github/di/modules/NetworkModule.kt @@ -44,20 +44,34 @@ class NetworkModule { @Singleton @Provides fun provideInterceptor() = AuthenticationInterceptor() - @Singleton @Provides fun provideHttpClient(auth: AuthenticationInterceptor): OkHttpClient = OkHttpClient + @Singleton @Provides fun provideHttpLogging() = HttpLoggingInterceptor().apply { + level = if (BuildConfig.DEBUG) { + HttpLoggingInterceptor.Level.BODY + } else { + HttpLoggingInterceptor.Level.NONE + } + } + + @Singleton @Provides fun provideHttpClient( + auth: AuthenticationInterceptor, + httpLoggingInterceptor: HttpLoggingInterceptor + ): OkHttpClient = OkHttpClient .Builder() .addInterceptor(ContentTypeInterceptor()) .addInterceptor(auth) .addInterceptor(PaginationInterceptor()) .addInterceptor(Pandora.get().interceptor) - .addInterceptor(HttpLoggingInterceptor()) + .addInterceptor(httpLoggingInterceptor) .build() - @Named("apolloClient") @Singleton @Provides fun provideHttpClientForApollo(auth: AuthenticationInterceptor): OkHttpClient = OkHttpClient + @Named("apolloClient") @Singleton @Provides fun provideHttpClientForApollo( + auth: AuthenticationInterceptor, + httpLoggingInterceptor: HttpLoggingInterceptor + ): OkHttpClient = OkHttpClient .Builder() .addInterceptor(auth) .addInterceptor(Pandora.get().interceptor) - .addInterceptor(HttpLoggingInterceptor()) + .addInterceptor(httpLoggingInterceptor) .build() diff --git a/app/src/main/java/com/fastaccess/github/platform/markwon/hashtag/HashTag.kt b/app/src/main/java/com/fastaccess/github/platform/markwon/hashtag/HashTag.kt deleted file mode 100644 index eb833a04..00000000 --- a/app/src/main/java/com/fastaccess/github/platform/markwon/hashtag/HashTag.kt +++ /dev/null @@ -1,27 +0,0 @@ -package com.fastaccess.github.platform.markwon.hashtag - -import org.commonmark.node.CustomNode -import org.commonmark.node.Delimited - - -/** - * Created by kosh on 20/08/2017. - */ - -class HashTag : CustomNode(), Delimited { - - var url: String? = null - get() = DELIMITER + field!! - - override fun getOpeningDelimiter(): String { - return DELIMITER - } - - override fun getClosingDelimiter(): String { - return " " - } - - companion object { - private const val DELIMITER = "#" - } -} diff --git a/app/src/main/java/com/fastaccess/github/platform/markwon/hashtag/HashTagExtension.kt b/app/src/main/java/com/fastaccess/github/platform/markwon/hashtag/HashTagExtension.kt deleted file mode 100644 index ecb191ad..00000000 --- a/app/src/main/java/com/fastaccess/github/platform/markwon/hashtag/HashTagExtension.kt +++ /dev/null @@ -1,29 +0,0 @@ -package com.fastaccess.github.platform.markwon.hashtag - - -import com.fastaccess.github.platform.markwon.hashtag.internal.HashTagDelimiterProcessor -import com.fastaccess.github.platform.markwon.hashtag.internal.HashTagNodeRenderer -import org.commonmark.Extension -import org.commonmark.parser.Parser -import org.commonmark.renderer.html.HtmlRenderer - -/** - * Created by kosh on 20/08/2017. - */ - -class HashTagExtension private constructor() : Parser.ParserExtension, HtmlRenderer.HtmlRendererExtension { - - override fun extend(parserBuilder: Parser.Builder) { - parserBuilder.customDelimiterProcessor(HashTagDelimiterProcessor()) - } - - override fun extend(rendererBuilder: HtmlRenderer.Builder) { - rendererBuilder.nodeRendererFactory { HashTagNodeRenderer(it) } - } - - companion object { - fun create(): Extension { - return HashTagExtension() - } - } -} diff --git a/app/src/main/java/com/fastaccess/github/platform/markwon/hashtag/internal/HashTagDelimiterProcessor.kt b/app/src/main/java/com/fastaccess/github/platform/markwon/hashtag/internal/HashTagDelimiterProcessor.kt deleted file mode 100644 index edd104c0..00000000 --- a/app/src/main/java/com/fastaccess/github/platform/markwon/hashtag/internal/HashTagDelimiterProcessor.kt +++ /dev/null @@ -1,42 +0,0 @@ -package com.fastaccess.github.platform.markwon.hashtag.internal - - -import com.fastaccess.github.platform.markwon.hashtag.HashTag -import org.commonmark.node.Node -import org.commonmark.node.Text -import org.commonmark.parser.delimiter.DelimiterProcessor -import org.commonmark.parser.delimiter.DelimiterRun - -class HashTagDelimiterProcessor : DelimiterProcessor { - - override fun getOpeningCharacter(): Char = '#' - override fun getClosingCharacter(): Char = ' ' - override fun getMinLength(): Int = 1 - - override fun getDelimiterUse( - opener: DelimiterRun, - closer: DelimiterRun - ): Int = if (opener.length() >= 1 && closer.length() >= 1) { - 1 - } else { - 0 - } - - override fun process( - opener: Text, - closer: Text, - delimiterCount: Int - ) { - val hashTag = HashTag() - var tmp: Node? = opener.next - if (tmp != null) { - hashTag.url = (tmp as Text).literal - } - while (tmp != null && tmp !== closer) { - val next = tmp.next - hashTag.appendChild(tmp) - tmp = next - } - opener.insertAfter(hashTag) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/fastaccess/github/platform/markwon/hashtag/internal/HashTagNodeRenderer.kt b/app/src/main/java/com/fastaccess/github/platform/markwon/hashtag/internal/HashTagNodeRenderer.kt deleted file mode 100644 index 21d978e1..00000000 --- a/app/src/main/java/com/fastaccess/github/platform/markwon/hashtag/internal/HashTagNodeRenderer.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.fastaccess.github.platform.markwon.hashtag.internal - -import com.fastaccess.github.platform.markwon.hashtag.HashTag -import org.commonmark.node.Node -import org.commonmark.renderer.NodeRenderer -import org.commonmark.renderer.html.HtmlNodeRendererContext -import org.commonmark.renderer.html.HtmlWriter - -class HashTagNodeRenderer(private val context: HtmlNodeRendererContext) : NodeRenderer { - private val html: HtmlWriter = context.writer - - override fun getNodeTypes(): Set> { - return setOf>(HashTag::class.java) - } - - override fun render(node: Node) { - val attributes = context.extendAttributes(node, "hashtag", emptyMap()) - html.tag("hashtag", attributes) - renderChildren(node) - html.tag("/hashtag") - } - - private fun renderChildren(parent: Node) { - var node: Node? = parent.firstChild - while (node != null) { - val next = node.next - context.render(node) - node = next - } - } -} diff --git a/app/src/main/java/com/fastaccess/github/platform/markwon/mention/Mention.kt b/app/src/main/java/com/fastaccess/github/platform/markwon/mention/Mention.kt deleted file mode 100644 index cc6bac8b..00000000 --- a/app/src/main/java/com/fastaccess/github/platform/markwon/mention/Mention.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.fastaccess.github.platform.markwon.mention - -import com.fastaccess.github.utils.GITHUB_LINK -import org.commonmark.node.CustomNode -import org.commonmark.node.Delimited - - -/** - * Created by kosh on 20/08/2017. - */ - -class Mention : CustomNode(), Delimited { - - var url: String? = null - get() = BASE_URL + field!! - - override fun getOpeningDelimiter(): String = DELIMITER - override fun getClosingDelimiter(): String = " " - - companion object { - private const val BASE_URL = GITHUB_LINK - private const val DELIMITER = "@" - } -} diff --git a/app/src/main/java/com/fastaccess/github/platform/markwon/mention/MentionExtension.kt b/app/src/main/java/com/fastaccess/github/platform/markwon/mention/MentionExtension.kt deleted file mode 100644 index b87b055c..00000000 --- a/app/src/main/java/com/fastaccess/github/platform/markwon/mention/MentionExtension.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.fastaccess.github.platform.markwon.mention - - -import com.fastaccess.github.platform.markwon.mention.internal.MentionDelimiterProcessor -import com.fastaccess.github.platform.markwon.mention.internal.MentionNodeRenderer -import org.commonmark.Extension -import org.commonmark.parser.Parser -import org.commonmark.renderer.html.HtmlNodeRendererFactory -import org.commonmark.renderer.html.HtmlRenderer - -/** - * Created by kosh on 20/08/2017. - */ - -class MentionExtension private constructor() : Parser.ParserExtension, HtmlRenderer.HtmlRendererExtension { - - override fun extend(parserBuilder: Parser.Builder) { - parserBuilder.customDelimiterProcessor(MentionDelimiterProcessor()) - } - - override fun extend(rendererBuilder: HtmlRenderer.Builder) { - rendererBuilder.nodeRendererFactory(HtmlNodeRendererFactory { MentionNodeRenderer(it) }) - } - - companion object { - - fun create(): Extension { - return MentionExtension() - } - } -} diff --git a/app/src/main/java/com/fastaccess/github/platform/markwon/mention/internal/MentionDelimiterProcessor.kt b/app/src/main/java/com/fastaccess/github/platform/markwon/mention/internal/MentionDelimiterProcessor.kt deleted file mode 100644 index a1380bce..00000000 --- a/app/src/main/java/com/fastaccess/github/platform/markwon/mention/internal/MentionDelimiterProcessor.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.fastaccess.github.platform.markwon.mention.internal - - -import com.fastaccess.github.platform.markwon.mention.Mention -import org.commonmark.node.Node -import org.commonmark.node.Text -import org.commonmark.parser.delimiter.DelimiterProcessor -import org.commonmark.parser.delimiter.DelimiterRun - -class MentionDelimiterProcessor : DelimiterProcessor { - - override fun getOpeningCharacter(): Char = '@' - - override fun getClosingCharacter(): Char = ' ' - - override fun getMinLength(): Int = 1 - - override fun getDelimiterUse( - opener: DelimiterRun, - closer: DelimiterRun - ): Int = if (opener.length() >= 1 && closer.length() >= 1) { - 1 - } else { - 0 - } - - override fun process( - opener: Text, - closer: Text, - delimiterCount: Int - ) { - val mention = Mention() - var tmp: Node? = opener.next - if (tmp != null) { - mention.url = (tmp as Text).literal - } - while (tmp != null && tmp !== closer) { - val next = tmp.next - mention.appendChild(tmp) - tmp = next - } - opener.insertAfter(mention) - } -} diff --git a/app/src/main/java/com/fastaccess/github/platform/markwon/mention/internal/MentionNodeRenderer.kt b/app/src/main/java/com/fastaccess/github/platform/markwon/mention/internal/MentionNodeRenderer.kt deleted file mode 100644 index f2fbe972..00000000 --- a/app/src/main/java/com/fastaccess/github/platform/markwon/mention/internal/MentionNodeRenderer.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.fastaccess.github.platform.markwon.mention.internal - -import com.fastaccess.github.platform.markwon.mention.Mention -import org.commonmark.node.Node -import org.commonmark.renderer.NodeRenderer -import org.commonmark.renderer.html.HtmlNodeRendererContext -import org.commonmark.renderer.html.HtmlWriter - -class MentionNodeRenderer(private val context: HtmlNodeRendererContext) : NodeRenderer { - private val html: HtmlWriter = context.writer - - override fun getNodeTypes(): Set> { - return setOf>(Mention::class.java) - } - - override fun render(node: Node) { - val attributes = context.extendAttributes(node, "mention", emptyMap()) - html.tag("mention", attributes) - renderChildren(node) - html.tag("/mention") - } - - private fun renderChildren(parent: Node) { - var node: Node? = parent.firstChild - while (node != null) { - val next = node.next - context.render(node) - node = next - } - } -} diff --git a/app/src/main/java/com/fastaccess/github/ui/adapter/IssueTimelineAdapter.kt b/app/src/main/java/com/fastaccess/github/ui/adapter/IssueTimelineAdapter.kt index e5beaa76..63c41d02 100644 --- a/app/src/main/java/com/fastaccess/github/ui/adapter/IssueTimelineAdapter.kt +++ b/app/src/main/java/com/fastaccess/github/ui/adapter/IssueTimelineAdapter.kt @@ -10,13 +10,13 @@ import com.fastaccess.github.ui.adapter.base.BaseViewHolder import com.fastaccess.github.ui.adapter.viewholder.CommentViewHolder import com.fastaccess.github.ui.adapter.viewholder.IssueContentViewHolder import com.fastaccess.github.ui.adapter.viewholder.LoadingViewHolder -import net.nightwhistler.htmlspanner.HtmlSpanner +import io.noties.markwon.Markwon /** * Created by Kosh on 20.01.19. */ class IssueTimelineAdapter( - private val htmlSpanner: HtmlSpanner, + private val markwon: Markwon, private val theme: Int ) : ListAdapter(DIFF_CALLBACK) { @@ -38,7 +38,7 @@ class IssueTimelineAdapter( override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { return when (viewType) { - COMMENT -> CommentViewHolder(parent, htmlSpanner, theme, notifyCallback) + COMMENT -> CommentViewHolder(parent, markwon, theme, notifyCallback) CONTENT -> IssueContentViewHolder(parent) else -> LoadingViewHolder(parent).apply { itemView.isVisible = false } } diff --git a/app/src/main/java/com/fastaccess/github/ui/adapter/viewholder/CommentViewHolder.kt b/app/src/main/java/com/fastaccess/github/ui/adapter/viewholder/CommentViewHolder.kt index d501da37..4a3dbfc3 100644 --- a/app/src/main/java/com/fastaccess/github/ui/adapter/viewholder/CommentViewHolder.kt +++ b/app/src/main/java/com/fastaccess/github/ui/adapter/viewholder/CommentViewHolder.kt @@ -1,6 +1,8 @@ package com.fastaccess.github.ui.adapter.viewholder import android.annotation.SuppressLint +import android.text.util.Linkify +import android.util.Patterns import android.view.LayoutInflater import android.view.ViewGroup import androidx.core.view.isVisible @@ -12,9 +14,9 @@ import com.fastaccess.github.extensions.timeAgo import com.fastaccess.github.ui.adapter.base.BaseViewHolder import com.fastaccess.github.utils.extensions.popupEmoji import com.fastaccess.markdown.MarkdownProvider -import com.fastaccess.markdown.spans.drawable.DrawableGetter +import io.noties.markwon.Markwon import kotlinx.android.synthetic.main.comment_row_item.view.* -import net.nightwhistler.htmlspanner.HtmlSpanner +import java.util.regex.Pattern /** @@ -23,7 +25,7 @@ import net.nightwhistler.htmlspanner.HtmlSpanner class CommentViewHolder( parent: ViewGroup, - private val htmlSpanner: HtmlSpanner, + private val markwon: Markwon, private val theme: Int, private val callback: (position: Int) -> Unit ) : BaseViewHolder( @@ -33,7 +35,7 @@ class CommentViewHolder( @SuppressLint("SetTextI18n") override fun bind(item: CommentModel?) { - val model = item ?: kotlin.run { + val model = item ?: run { itemView.isVisible = false return } @@ -46,8 +48,23 @@ class CommentViewHolder( "${model.authorAssociation?.value?.toLowerCase()?.replace("_", "")} ${model.updatedAt?.timeAgo()}" } - MarkdownProvider.loadIntoTextView(htmlSpanner, description, model.body ?: "", ThemeEngine.getCodeBackground(theme), - ThemeEngine.isLightTheme(theme)) + MarkdownProvider.loadIntoTextView( + markwon, description, model.body ?: "", ThemeEngine.getCodeBackground(theme), + ThemeEngine.isLightTheme(theme) + ) + + val filter = Linkify.TransformFilter { match, _ -> match.group() } + + val mentionPattern = Pattern.compile("@([A-Za-z0-9_-]+)") + val mentionScheme = "https://www.github.com/" + Linkify.addLinks(description, mentionPattern, mentionScheme, null, filter) + + val hashtagPattern = Pattern.compile("#([A-Za-z0-9_-]+)") + val hashtagScheme = "https://www.github.com/" + Linkify.addLinks(description, hashtagPattern, hashtagScheme, null, filter) + + val urlPattern = Patterns.WEB_URL + Linkify.addLinks(description, urlPattern, null, null, filter) addEmoji.setOnClickListener { it.popupEmoji(requireNotNull(model.id), model.reactionGroups) { @@ -72,14 +89,4 @@ class CommentViewHolder( } } } - - override fun onDetached() { - super.onDetached() - itemView.description?.let { - if (it.tag is DrawableGetter) { - val target = it.tag as DrawableGetter - target.clear(target) - } - } - } } \ No newline at end of file diff --git a/app/src/main/java/com/fastaccess/github/ui/modules/issue/fragment/IssueFragment.kt b/app/src/main/java/com/fastaccess/github/ui/modules/issue/fragment/IssueFragment.kt index 0f960739..deba395f 100644 --- a/app/src/main/java/com/fastaccess/github/ui/modules/issue/fragment/IssueFragment.kt +++ b/app/src/main/java/com/fastaccess/github/ui/modules/issue/fragment/IssueFragment.kt @@ -48,10 +48,10 @@ import com.otaliastudios.autocomplete.CharPolicy import github.type.CommentAuthorAssociation import github.type.IssueState import github.type.LockReason +import io.noties.markwon.Markwon import kotlinx.android.synthetic.main.empty_state_layout.* import kotlinx.android.synthetic.main.issue_header_row_item.* import kotlinx.android.synthetic.main.issue_pr_fragment_layout.* -import net.nightwhistler.htmlspanner.HtmlSpanner import timber.log.Timber import javax.inject.Inject @@ -63,7 +63,7 @@ class IssueFragment : BaseFragment(), LockUnlockFragment.OnLockReasonSelected, MilestoneFragment.OnMilestoneChanged { @Inject lateinit var viewModelFactory: ViewModelProvider.Factory - @Inject lateinit var htmlSpanner: HtmlSpanner + @Inject lateinit var markwon: Markwon @Inject lateinit var preference: FastHubSharedPreference @Inject lateinit var mentionsPresenter: MentionsPresenter @@ -71,7 +71,7 @@ class IssueFragment : BaseFragment(), LockUnlockFragment.OnLockReasonSelected, private val login by lazy { arguments?.getString(EXTRA) ?: "" } private val repo by lazy { arguments?.getString(EXTRA_TWO) ?: "" } private val number by lazy { arguments?.getInt(EXTRA_THREE) ?: 0 } - private val adapter by lazy { IssueTimelineAdapter(htmlSpanner, preference.theme) } + private val adapter by lazy { IssueTimelineAdapter(markwon, preference.theme) } override fun layoutRes(): Int = R.layout.issue_pr_fragment_layout override fun viewModel(): BaseViewModel? = viewModel @@ -240,7 +240,7 @@ class IssueFragment : BaseFragment(), LockUnlockFragment.OnLockReasonSelected, "${model.authorAssociation?.toLowerCase()?.replace("_", "")} ${model.updatedAt?.timeAgo()}" } MarkdownProvider.loadIntoTextView( - htmlSpanner, description, model.body ?: "", ThemeEngine.getCodeBackground(theme), + markwon, description, model.body ?: "", ThemeEngine.getCodeBackground(theme), ThemeEngine.isLightTheme(theme) ) state.text = model.state?.toLowerCase() diff --git a/app/src/main/java/com/fastaccess/github/usecase/issuesprs/CloseOpenIssuePrUseCase.kt b/app/src/main/java/com/fastaccess/github/usecase/issuesprs/CloseOpenIssuePrUseCase.kt index 782cbb9c..2fd86aa1 100644 --- a/app/src/main/java/com/fastaccess/github/usecase/issuesprs/CloseOpenIssuePrUseCase.kt +++ b/app/src/main/java/com/fastaccess/github/usecase/issuesprs/CloseOpenIssuePrUseCase.kt @@ -33,6 +33,8 @@ class CloseOpenIssuePrUseCase @Inject constructor( .observeOn(schedulerProvider.uiThread()) .flatMapObservable { issue -> issuePrService.editIssue(login, repo, number, IssueRequestModel(state = if ("closed".equals(issue.state, true)) "open" else "closed")) + .subscribeOn(schedulerProvider.ioThread()) + .observeOn(schedulerProvider.uiThread()) .map { issue.state = it.issueState issueRepositoryProvider.upsert(issue) diff --git a/build-dependecies/fasthub-dependencies.gradle b/build-dependecies/fasthub-dependencies.gradle index d86ec145..6b926674 100644 --- a/build-dependecies/fasthub-dependencies.gradle +++ b/build-dependecies/fasthub-dependencies.gradle @@ -121,25 +121,21 @@ ext { ] markdown = [ - 'com.github.NightWhistler:HtmlSpanner:-SNAPSHOT', - 'net.sourceforge.htmlcleaner:htmlcleaner:2.22', - "com.atlassian.commonmark:commonmark:${commonmark}", - "com.atlassian.commonmark:commonmark-ext-autolink:${commonmark}", - "com.atlassian.commonmark:commonmark-ext-gfm-strikethrough:${commonmark}", - "com.atlassian.commonmark:commonmark-ext-gfm-tables:${commonmark}", - "com.atlassian.commonmark:commonmark-ext-ins:${commonmark}", - "com.atlassian.commonmark:commonmark-ext-yaml-front-matter:${commonmark}", "io.noties.markwon:core:$markwon_version", "io.noties.markwon:ext-latex:$markwon_version", "io.noties.markwon:ext-strikethrough:$markwon_version", "io.noties.markwon:ext-tables:$markwon_version", "io.noties.markwon:ext-tasklist:$markwon_version", "io.noties.markwon:html:$markwon_version", + "io.noties.markwon:image:$markwon_version", "io.noties.markwon:image-glide:$markwon_version", "io.noties.markwon:recycler:$markwon_version", "io.noties.markwon:recycler-table:$markwon_version", "io.noties.markwon:simple-ext:$markwon_version", "io.noties.markwon:syntax-highlight:$markwon_version", + "io.noties.markwon:linkify:$markwon_version", + "com.caverock:androidsvg:1.4", + "pl.droidsonroids.gif:android-gif-drawable:1.2.14", "io.noties:prism4j:2.0.0" ] diff --git a/markdown/src/main/java/com/fastaccess/markdown/MarkdownProvider.kt b/markdown/src/main/java/com/fastaccess/markdown/MarkdownProvider.kt index 1dad3031..c81cd05a 100644 --- a/markdown/src/main/java/com/fastaccess/markdown/MarkdownProvider.kt +++ b/markdown/src/main/java/com/fastaccess/markdown/MarkdownProvider.kt @@ -1,26 +1,14 @@ package com.fastaccess.markdown -import android.text.method.ScrollingMovementMethod import android.widget.TextView import androidx.core.text.HtmlCompat import androidx.core.view.doOnPreDraw import io.noties.markwon.Markwon -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.html.HtmlPlugin -import io.noties.markwon.image.glide.GlideImagesPlugin -import io.noties.markwon.movement.MovementMethodPlugin -import io.noties.markwon.syntax.Prism4jThemeDarkula -import io.noties.markwon.syntax.Prism4jThemeDefault -import io.noties.markwon.syntax.SyntaxHighlightPlugin -import io.noties.prism4j.Prism4j import io.noties.prism4j.annotations.PrismBundle -import net.nightwhistler.htmlspanner.HtmlSpanner import org.commonmark.parser.Parser import org.commonmark.renderer.html.HtmlRenderer + /** * Created by Kosh on 02.02.19. */ @@ -40,7 +28,7 @@ object MarkdownProvider { private const val PARAGRAPH_END = "

" fun loadIntoTextView( - htmlSpanner: HtmlSpanner, + markwon: Markwon, textView: TextView, html: String, windowBackground: Int, @@ -49,10 +37,10 @@ object MarkdownProvider { ) { val width = textView.measuredWidth if (width > 0) { - initTextView(width, htmlSpanner, textView, html, windowBackground, isLightTheme, onLinkClicked) + initTextView(width, markwon, textView, html, windowBackground, isLightTheme, onLinkClicked) } else { textView.doOnPreDraw { - initTextView(textView.width, htmlSpanner, textView, html, windowBackground, isLightTheme, onLinkClicked) + initTextView(textView.width, markwon, textView, html, windowBackground, isLightTheme, onLinkClicked) } } } @@ -67,94 +55,13 @@ object MarkdownProvider { private fun initTextView( width: Int, - htmlSpanner: HtmlSpanner, + markwon: Markwon, textView: TextView, html: String, windowBackground: Int, isLightTheme: Boolean, onLinkClicked: ((link: String) -> Unit)? = null ) { - val context = textView.context - Markwon.builder(context) - .usePlugin(JLatexMathPlugin.create(textView.textSize - 20)) - .usePlugin(TaskListPlugin.create(context)) - .usePlugin(HtmlPlugin.create()) - .usePlugin(GlideImagesPlugin.create(context)) - .usePlugin(TablePlugin.create(context)) - .usePlugin(StrikethroughPlugin.create()) - .usePlugin(MovementMethodPlugin.create(ScrollingMovementMethod.getInstance())) - .usePlugin( - SyntaxHighlightPlugin.create( - Prism4j(GrammarLocatorDef()), if (isLightTheme) { - Prism4jThemeDefault.create() - } else { - Prism4jThemeDarkula.create() - } - ) - ) - .build() - .setMarkdown(textView, html) - } - - //https://github.com/k0shk0sh/GitHubSdk/blob/master/library/src/main/java/com/meisolsson/githubsdk/core/HtmlUtils.java - private fun format(html: String): CharSequence { - if (html.isEmpty()) return "" - val formatted = StringBuilder(html) - strip(formatted, TOGGLE_START, TOGGLE_END) - strip(formatted, SIGNATURE_START, SIGNATURE_END) - strip(formatted, REPLY_START, REPLY_END) - strip(formatted, HIDDEN_REPLY_START, HIDDEN_REPLY_END) - if (replace(formatted, PARAGRAPH_START, BREAK)) replace(formatted, PARAGRAPH_END, BREAK) - trim(formatted) - return formatted - } - - private fun strip( - input: StringBuilder, - prefix: String, - suffix: String - ) { - var start = input.indexOf(prefix) - while (start != -1) { - var end = input.indexOf(suffix, start + prefix.length) - if (end == -1) - end = input.length - input.delete(start, end + suffix.length) - start = input.indexOf(prefix, start) - } - } - - private fun replace( - input: StringBuilder, - from: String, - to: String - ): Boolean { - var start = input.indexOf(from) - if (start == -1) return false - val fromLength = from.length - val toLength = to.length - while (start != -1) { - input.replace(start, start + fromLength, to) - start = input.indexOf(from, start + toLength) - } - return true - } - - private fun trim(input: StringBuilder) { - var length = input.length - val breakLength = BREAK.length - while (length > 0) { - if (input.indexOf(BREAK) == 0) - input.delete(0, breakLength) - else if (length >= breakLength && input.lastIndexOf(BREAK) == length - breakLength) - input.delete(length - breakLength, length) - else if (Character.isWhitespace(input[0])) - input.deleteCharAt(0) - else if (Character.isWhitespace(input[length - 1])) - input.deleteCharAt(length - 1) - else - break - length = input.length - } + markwon.setMarkdown(textView, html) } } \ No newline at end of file diff --git a/markdown/src/main/java/com/fastaccess/markdown/extension/TagExtension.kt b/markdown/src/main/java/com/fastaccess/markdown/extension/TagExtension.kt deleted file mode 100644 index c2a53d7b..00000000 --- a/markdown/src/main/java/com/fastaccess/markdown/extension/TagExtension.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.fastaccess.markdown.extension - -import android.text.SpannableStringBuilder -import net.nightwhistler.htmlspanner.TagNodeHandler -import net.nightwhistler.htmlspanner.spans.FontFamilySpan - -/** - * Created by Kosh on 02.02.19. - */ - -fun TagNodeHandler.getFontFamilySpan(builder: SpannableStringBuilder, start: Int, end: Int): FontFamilySpan? { - val spans = builder.getSpans(start, end, FontFamilySpan::class.java) as Array - return if (spans.isNotEmpty()) spans[spans.size - 1] else null -} \ No newline at end of file diff --git a/app/src/main/java/com/fastaccess/github/platform/markwon/emoji/Emoji.kt b/markdown/src/main/java/com/fastaccess/markdown/extension/markwon/emoji/Emoji.kt similarity index 76% rename from app/src/main/java/com/fastaccess/github/platform/markwon/emoji/Emoji.kt rename to markdown/src/main/java/com/fastaccess/markdown/extension/markwon/emoji/Emoji.kt index 96b7ba63..d97a878f 100644 --- a/app/src/main/java/com/fastaccess/github/platform/markwon/emoji/Emoji.kt +++ b/markdown/src/main/java/com/fastaccess/markdown/extension/markwon/emoji/Emoji.kt @@ -1,4 +1,4 @@ -package com.fastaccess.github.platform.markwon.emoji +package com.fastaccess.markdown.extension.markwon.emoji import org.commonmark.node.CustomNode import org.commonmark.node.Delimited @@ -14,6 +14,8 @@ class Emoji : CustomNode(), Delimited { override fun getClosingDelimiter(): String = DELIMITER + override fun toString(): String = emoji ?: "no emoji" + companion object { private const val DELIMITER = ":" } diff --git a/app/src/main/java/com/fastaccess/github/platform/markwon/emoji/EmojiExtension.kt b/markdown/src/main/java/com/fastaccess/markdown/extension/markwon/emoji/EmojiExtension.kt similarity index 74% rename from app/src/main/java/com/fastaccess/github/platform/markwon/emoji/EmojiExtension.kt rename to markdown/src/main/java/com/fastaccess/markdown/extension/markwon/emoji/EmojiExtension.kt index 5bd322fd..c5c9537c 100644 --- a/app/src/main/java/com/fastaccess/github/platform/markwon/emoji/EmojiExtension.kt +++ b/markdown/src/main/java/com/fastaccess/markdown/extension/markwon/emoji/EmojiExtension.kt @@ -1,7 +1,7 @@ -package com.fastaccess.github.platform.markwon.emoji +package com.fastaccess.markdown.extension.markwon.emoji -import com.fastaccess.github.platform.markwon.emoji.internal.EmojiDelimiterProcessor -import com.fastaccess.github.platform.markwon.emoji.internal.EmojiNodeRenderer +import com.fastaccess.markdown.extension.markwon.emoji.internal.EmojiDelimiterProcessor +import com.fastaccess.markdown.extension.markwon.emoji.internal.EmojiNodeRenderer import org.commonmark.Extension import org.commonmark.parser.Parser import org.commonmark.renderer.html.HtmlRenderer diff --git a/markdown/src/main/java/com/fastaccess/markdown/extension/markwon/emoji/EmojiPlugin.kt b/markdown/src/main/java/com/fastaccess/markdown/extension/markwon/emoji/EmojiPlugin.kt new file mode 100644 index 00000000..c91e49d9 --- /dev/null +++ b/markdown/src/main/java/com/fastaccess/markdown/extension/markwon/emoji/EmojiPlugin.kt @@ -0,0 +1,33 @@ +package com.fastaccess.markdown.extension.markwon.emoji + +import android.text.SpannedString +import com.fastaccess.markdown.emoji.EmojiManager +import io.noties.markwon.AbstractMarkwonPlugin +import io.noties.markwon.MarkwonVisitor +import org.commonmark.parser.Parser +import timber.log.Timber + + +class EmojiPlugin : AbstractMarkwonPlugin() { + + override fun configureParser(builder: Parser.Builder) { + builder.extensions(setOf(EmojiExtension.create())) + } + + override fun configureVisitor(builder: MarkwonVisitor.Builder) { + builder.on(Emoji::class.java) { visitor, emoji -> + val length = visitor.length() + val emojiUnicode = emoji.emoji + val unicode = EmojiManager.getForAlias(emoji.emoji)?.unicode + if (!unicode.isNullOrEmpty()) { + visitor.setSpans(length, SpannedString(unicode)) + } else { + Timber.e(emojiUnicode) + } + } + } + + companion object { + fun create() = EmojiPlugin() + } +} diff --git a/markdown/src/main/java/com/fastaccess/markdown/extension/markwon/emoji/EmojiSpanFactory.kt b/markdown/src/main/java/com/fastaccess/markdown/extension/markwon/emoji/EmojiSpanFactory.kt new file mode 100644 index 00000000..34ac02c8 --- /dev/null +++ b/markdown/src/main/java/com/fastaccess/markdown/extension/markwon/emoji/EmojiSpanFactory.kt @@ -0,0 +1,30 @@ +package com.fastaccess.markdown.extension.markwon.emoji + +import android.text.SpannedString +import com.fastaccess.markdown.emoji.EmojiManager +import io.noties.markwon.MarkwonConfiguration +import io.noties.markwon.Prop +import io.noties.markwon.RenderProps +import io.noties.markwon.SpanFactory +import timber.log.Timber + +/** + * Created by Kosh on 2019-07-20. + */ +class EmojiSpanFactory : SpanFactory { + + override fun getSpans( + configuration: MarkwonConfiguration, + props: RenderProps + ): Any? { + val emoji = props.get(Prop.of(":")) + Timber.e("$props $emoji") + if (emoji != null) { + val unicode = EmojiManager.getForAlias(emoji.emoji) + if (unicode?.unicode != null) { + return SpannedString(unicode.unicode) + } + } + return null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/fastaccess/github/platform/markwon/emoji/internal/EmojiDelimiterProcessor.kt b/markdown/src/main/java/com/fastaccess/markdown/extension/markwon/emoji/internal/EmojiDelimiterProcessor.kt similarity index 87% rename from app/src/main/java/com/fastaccess/github/platform/markwon/emoji/internal/EmojiDelimiterProcessor.kt rename to markdown/src/main/java/com/fastaccess/markdown/extension/markwon/emoji/internal/EmojiDelimiterProcessor.kt index 266b3f1a..2117c262 100644 --- a/app/src/main/java/com/fastaccess/github/platform/markwon/emoji/internal/EmojiDelimiterProcessor.kt +++ b/markdown/src/main/java/com/fastaccess/markdown/extension/markwon/emoji/internal/EmojiDelimiterProcessor.kt @@ -1,7 +1,7 @@ -package com.fastaccess.github.platform.markwon.emoji.internal +package com.fastaccess.markdown.extension.markwon.emoji.internal -import com.fastaccess.github.platform.markwon.emoji.Emoji +import com.fastaccess.markdown.extension.markwon.emoji.Emoji import org.commonmark.node.Text import org.commonmark.parser.delimiter.DelimiterProcessor import org.commonmark.parser.delimiter.DelimiterRun diff --git a/app/src/main/java/com/fastaccess/github/platform/markwon/emoji/internal/EmojiNodeRenderer.kt b/markdown/src/main/java/com/fastaccess/markdown/extension/markwon/emoji/internal/EmojiNodeRenderer.kt similarity index 87% rename from app/src/main/java/com/fastaccess/github/platform/markwon/emoji/internal/EmojiNodeRenderer.kt rename to markdown/src/main/java/com/fastaccess/markdown/extension/markwon/emoji/internal/EmojiNodeRenderer.kt index 81e4e461..bb2b117d 100644 --- a/app/src/main/java/com/fastaccess/github/platform/markwon/emoji/internal/EmojiNodeRenderer.kt +++ b/markdown/src/main/java/com/fastaccess/markdown/extension/markwon/emoji/internal/EmojiNodeRenderer.kt @@ -1,6 +1,6 @@ -package com.fastaccess.github.platform.markwon.emoji.internal +package com.fastaccess.markdown.extension.markwon.emoji.internal -import com.fastaccess.github.platform.markwon.emoji.Emoji +import com.fastaccess.markdown.extension.markwon.emoji.Emoji import org.commonmark.node.Node import org.commonmark.renderer.NodeRenderer import org.commonmark.renderer.html.HtmlNodeRendererContext diff --git a/markdown/src/main/java/com/fastaccess/markdown/spans/CodeBackgroundRoundedSpan.kt b/markdown/src/main/java/com/fastaccess/markdown/spans/CodeBackgroundRoundedSpan.kt deleted file mode 100644 index 837cf8b1..00000000 --- a/markdown/src/main/java/com/fastaccess/markdown/spans/CodeBackgroundRoundedSpan.kt +++ /dev/null @@ -1,51 +0,0 @@ -package com.fastaccess.markdown.spans - -import android.graphics.Canvas -import android.graphics.Paint -import android.graphics.RectF -import android.graphics.Typeface -import android.text.Layout -import android.text.TextPaint -import android.text.style.LeadingMarginSpan -import android.text.style.LineBackgroundSpan -import android.text.style.MetricAffectingSpan - -class CodeBackgroundRoundedSpan constructor( - private val color: Int -) : MetricAffectingSpan(), LeadingMarginSpan, LineBackgroundSpan { - - private val rect = RectF() - - override fun updateMeasureState(paint: TextPaint) { - apply(paint) - } - - override fun updateDrawState(paint: TextPaint) { - apply(paint) - } - - private fun apply(paint: TextPaint) { - paint.typeface = Typeface.MONOSPACE - } - - override fun drawBackground( - c: Canvas, p: Paint, left: Int, right: Int, top: Int, baseline: Int, bottom: Int, - text: CharSequence, start: Int, end: Int, lnum: Int - ) { - val style = p.style - val color = p.color - p.style = Paint.Style.FILL - p.color = this.color - rect.set(left.toFloat(), top.toFloat(), right.toFloat(), bottom.toFloat()) - c.drawRect(rect, p) - p.color = color - p.style = style - } - - override fun getLeadingMargin(first: Boolean) = 30 - - override fun drawLeadingMargin( - c: Canvas, p: Paint, x: Int, dir: Int, top: Int, baseline: Int, bottom: Int, - text: CharSequence, start: Int, end: Int, first: Boolean, layout: Layout - ) = Unit -} \ No newline at end of file diff --git a/markdown/src/main/java/com/fastaccess/markdown/spans/DrawableHandler.kt b/markdown/src/main/java/com/fastaccess/markdown/spans/DrawableHandler.kt deleted file mode 100644 index 03f46d6f..00000000 --- a/markdown/src/main/java/com/fastaccess/markdown/spans/DrawableHandler.kt +++ /dev/null @@ -1,41 +0,0 @@ -package com.fastaccess.markdown.spans - -import android.text.SpannableStringBuilder -import android.text.Spanned -import android.text.style.ImageSpan -import android.widget.TextView -import com.fastaccess.markdown.spans.drawable.DrawableGetter -import net.nightwhistler.htmlspanner.SpanStack -import net.nightwhistler.htmlspanner.TagNodeHandler -import org.htmlcleaner.ContentNode -import org.htmlcleaner.TagNode - -/** - * Created by Kosh on 22 Apr 2017, 1:09 PM - */ - -class DrawableHandler( - private val textView: TextView, - private val width: Int = 0 -) : TagNodeHandler() { - override fun beforeChildren(node: TagNode?, builder: SpannableStringBuilder?, spanStack: SpanStack?) { - super.beforeChildren(node, builder, spanStack) - node?.addChild(ContentNode("\n")) - } - - override fun handleTagNode(node: TagNode?, builder: SpannableStringBuilder?, start: Int, end: Int, spanStack: SpanStack?) { - node?.let { n -> - builder?.let { b -> - val src = n.getAttributeByName("fallback-src") ?: n.getAttributeByName("data-canonical-src") ?: n.getAttributeByName("src") - if (!src.isNullOrEmpty()) { - b.append("") - b.append("\n") - val imageGetter = DrawableGetter(textView, width, n.getAttributeByName("src") ?: src) - b.setSpan(ImageSpan(imageGetter.getDrawable(src)), start, b.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) -// b.setSpan(CenterSpan(), start, b.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) // no center for now - b.append("\n") - } - } - } - } -} diff --git a/markdown/src/main/java/com/fastaccess/markdown/spans/EmojiHandler.kt b/markdown/src/main/java/com/fastaccess/markdown/spans/EmojiHandler.kt deleted file mode 100644 index b0385fd4..00000000 --- a/markdown/src/main/java/com/fastaccess/markdown/spans/EmojiHandler.kt +++ /dev/null @@ -1,28 +0,0 @@ -package com.fastaccess.markdown.spans - -import android.text.SpannableStringBuilder -import com.fastaccess.markdown.emoji.EmojiManager -import net.nightwhistler.htmlspanner.SpanStack -import net.nightwhistler.htmlspanner.TagNodeHandler -import org.htmlcleaner.TagNode - -/** - * Created by Kosh on 27 May 2017, 4:54 PM - */ - -class EmojiHandler : TagNodeHandler() { - override fun handleTagNode(node: TagNode?, builder: SpannableStringBuilder?, start: Int, end: Int, spanStack: SpanStack?) { - val emoji = node?.getAttributeByName("alias") - if (emoji != null) { - val unicode = EmojiManager.getForAlias(emoji) - if (unicode?.unicode != null) { - builder?.replace(start, end, " " + unicode.unicode + " ") - } - } else if (node?.text != null) { - val unicode = EmojiManager.getForAlias(node.text.toString()) - if (unicode?.unicode != null) { - builder?.replace(start, end, " " + unicode.unicode + " ") - } - } - } -} diff --git a/markdown/src/main/java/com/fastaccess/markdown/spans/FontSpan.kt b/markdown/src/main/java/com/fastaccess/markdown/spans/FontSpan.kt deleted file mode 100644 index d29029b6..00000000 --- a/markdown/src/main/java/com/fastaccess/markdown/spans/FontSpan.kt +++ /dev/null @@ -1,21 +0,0 @@ -package com.fastaccess.markdown.spans - -import android.text.ParcelableSpan -import android.text.TextPaint -import android.text.style.StyleSpan - -class FontSpan( - private val size: Float, - style: Int -) : StyleSpan(style), ParcelableSpan { - - override fun updateMeasureState(p: TextPaint) { - super.updateMeasureState(p) - p.textSize = p.textSize * size - } - - override fun updateDrawState(tp: TextPaint) { - super.updateDrawState(tp) - updateMeasureState(tp) - } -} diff --git a/markdown/src/main/java/com/fastaccess/markdown/spans/HeaderHandler.kt b/markdown/src/main/java/com/fastaccess/markdown/spans/HeaderHandler.kt deleted file mode 100644 index 1e1cc173..00000000 --- a/markdown/src/main/java/com/fastaccess/markdown/spans/HeaderHandler.kt +++ /dev/null @@ -1,38 +0,0 @@ -package com.fastaccess.markdown.spans - -import android.text.SpannableStringBuilder -import android.text.style.RelativeSizeSpan -import com.fastaccess.markdown.extension.getFontFamilySpan -import net.nightwhistler.htmlspanner.SpanStack -import net.nightwhistler.htmlspanner.TagNodeHandler -import net.nightwhistler.htmlspanner.spans.FontFamilySpan -import org.htmlcleaner.TagNode - -/** - * Created by Kosh on 29.09.17. - */ -class HeaderHandler(private val size: Float) : TagNodeHandler() { - - - override fun beforeChildren(node: TagNode?, builder: SpannableStringBuilder?, spanStack: SpanStack?) { - builder?.let { appendNewLine(it) } - } - - override fun handleTagNode(node: TagNode?, builder: SpannableStringBuilder?, start: Int, end: Int, spanStack: SpanStack?) { - builder?.let { b -> - b.setSpan(RelativeSizeSpan(this.size), start, end, 33) - val originalSpan = getFontFamilySpan(b, start, end) - val boldSpan: FontFamilySpan - if (originalSpan == null) { - boldSpan = FontFamilySpan(spanner.fontResolver.defaultFont) - } else { - boldSpan = FontFamilySpan(originalSpan.fontFamily) - boldSpan.isItalic = originalSpan.isItalic - } - - boldSpan.isBold = true - b.setSpan(boldSpan, start, end, 33) - appendNewLine(b) - } - } -} \ No newline at end of file diff --git a/markdown/src/main/java/com/fastaccess/markdown/spans/HrHandler.kt b/markdown/src/main/java/com/fastaccess/markdown/spans/HrHandler.kt deleted file mode 100644 index 105b4dc6..00000000 --- a/markdown/src/main/java/com/fastaccess/markdown/spans/HrHandler.kt +++ /dev/null @@ -1,30 +0,0 @@ -package com.fastaccess.markdown.spans - -import android.text.SpannableStringBuilder -import android.text.Spanned -import net.nightwhistler.htmlspanner.SpanStack -import net.nightwhistler.htmlspanner.TagNodeHandler -import net.nightwhistler.htmlspanner.spans.CenterSpan -import org.htmlcleaner.TagNode - -/** - * Created by kosh on 30/07/2017. - */ - -class HrHandler( - private val color: Int = 0, - private val width: Int = 0 -) : TagNodeHandler() { - - override fun handleTagNode(node: TagNode?, builder: SpannableStringBuilder?, start: Int, end: Int, spanStack: SpanStack?) { - builder?.let { spannableStringBuilder -> - appendNewLine(spannableStringBuilder) - val b = SpannableStringBuilder("$") - val hrSpan = HrSpan(color, width) - b.setSpan(hrSpan, 0, b.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) - b.setSpan(CenterSpan(), 0, b.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) - appendNewLine(b) - spannableStringBuilder.append(b) - } - } -} diff --git a/markdown/src/main/java/com/fastaccess/markdown/spans/HrSpan.kt b/markdown/src/main/java/com/fastaccess/markdown/spans/HrSpan.kt deleted file mode 100644 index 55f5db36..00000000 --- a/markdown/src/main/java/com/fastaccess/markdown/spans/HrSpan.kt +++ /dev/null @@ -1,34 +0,0 @@ -package com.fastaccess.markdown.spans - -import android.graphics.Canvas -import android.graphics.Paint -import android.graphics.Rect -import android.text.style.LineHeightSpan -import android.text.style.ReplacementSpan - -class HrSpan internal constructor( - private val color: Int, - private val width: Int -) : ReplacementSpan(), LineHeightSpan { - - override fun getSize(paint: Paint, text: CharSequence, start: Int, end: Int, fm: Paint.FontMetricsInt?): Int { - return paint.measureText(text, start, end).toInt() - } - - override fun draw(canvas: Canvas, text: CharSequence, start: Int, end: Int, x: Float, top: Int, - y: Int, bottom: Int, paint: Paint) { - val currentColor = paint.color - paint.color = color - paint.style = Paint.Style.FILL - val height = 10 - canvas.drawRect(Rect(0, bottom - height, x.toInt() + width, bottom), paint) - paint.color = currentColor - } - - override fun chooseHeight(text: CharSequence, start: Int, end: Int, spanstartv: Int, v: Int, fm: Paint.FontMetricsInt) { - fm.top /= 3 - fm.ascent /= 3 - fm.bottom /= 3 - fm.descent /= 3 - } -} \ No newline at end of file diff --git a/markdown/src/main/java/com/fastaccess/markdown/spans/ItalicHandler.kt b/markdown/src/main/java/com/fastaccess/markdown/spans/ItalicHandler.kt deleted file mode 100644 index 70a9fc14..00000000 --- a/markdown/src/main/java/com/fastaccess/markdown/spans/ItalicHandler.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.fastaccess.markdown.spans - -import android.graphics.Typeface -import android.text.SpannableStringBuilder -import net.nightwhistler.htmlspanner.SpanStack -import net.nightwhistler.htmlspanner.TagNodeHandler -import org.htmlcleaner.TagNode - -/** - * Created by Kosh on 06 May 2017, 11:02 AM - */ - -class ItalicHandler : TagNodeHandler() { - override fun handleTagNode(node: TagNode?, builder: SpannableStringBuilder?, start: Int, end: Int, spanStack: SpanStack?) { - builder?.setSpan(FontSpan(1f, Typeface.ITALIC), start, builder.length, 33) - } -} \ No newline at end of file diff --git a/markdown/src/main/java/com/fastaccess/markdown/spans/LinkHandler.kt b/markdown/src/main/java/com/fastaccess/markdown/spans/LinkHandler.kt deleted file mode 100644 index 206dc583..00000000 --- a/markdown/src/main/java/com/fastaccess/markdown/spans/LinkHandler.kt +++ /dev/null @@ -1,37 +0,0 @@ -package com.fastaccess.markdown.spans - -import android.graphics.Color -import android.text.SpannableStringBuilder -import net.nightwhistler.htmlspanner.SpanStack -import net.nightwhistler.htmlspanner.TagNodeHandler -import org.htmlcleaner.TagNode - -/** - * Created by Kosh on 10 May 2017, 8:46 PM - */ - -class LinkHandler : TagNodeHandler() { - - override fun handleTagNode( - node: TagNode, - builder: SpannableStringBuilder, - start: Int, - end: Int, - spanStack: SpanStack - ) { - val href = node.getAttributeByName("href") - val url = if (!href.isNullOrEmpty()) { - href.toString() - } else if (!node.text.isNullOrEmpty()) { - "https://github.com/${node.text}" - } else { - null - } - - url?.let { builder.setSpan(UrlSpan(href, linkColor), start, end, 33) } - } - - companion object { - private val linkColor = Color.parseColor("#4078C0") - } -} diff --git a/markdown/src/main/java/com/fastaccess/markdown/spans/ListsHandler.kt b/markdown/src/main/java/com/fastaccess/markdown/spans/ListsHandler.kt deleted file mode 100644 index d95fc9ec..00000000 --- a/markdown/src/main/java/com/fastaccess/markdown/spans/ListsHandler.kt +++ /dev/null @@ -1,79 +0,0 @@ -package com.fastaccess.markdown.spans - -import android.graphics.drawable.Drawable -import android.text.SpannableStringBuilder - -import com.fastaccess.markdown.widget.SpannableBuilder -import net.nightwhistler.htmlspanner.SpanStack - -import net.nightwhistler.htmlspanner.TagNodeHandler - -import org.htmlcleaner.TagNode - -class ListsHandler( - private val checked: Drawable? = null, - private val unchecked: Drawable? = null - -) : TagNodeHandler() { - private fun getMyIndex(node: TagNode): Int { - if (node.parent == null) { - return -1 - } else { - var i = 1 - for (child in node.parent.children) { - if (child === node) { - return i - } - if (child is TagNode) { - if ("li" == child.name) { - ++i - } - } - } - return -1 - } - } - - private fun getParentName(node: TagNode): String? { - return if (node.parent == null) null else node.parent.name - } - - override fun beforeChildren(node: TagNode?, builder: SpannableStringBuilder?, spanStack: SpanStack?) { - node?.let { n -> - var todoItem: TodoItems? = null - if (n.childTags?.isNotEmpty() == true) { - for (tagNode in n.childTags) { - if (tagNode.name != null && tagNode.name == "input") { - todoItem = TodoItems() - todoItem.isChecked = tagNode.getAttributeByName("checked") != null - break - } - } - } - when { - "ol" == getParentName(n) -> builder?.append(getMyIndex(n).toString())?.append(". ") - "ul" == getParentName(n) -> if (todoItem != null) { - if (checked == null || unchecked == null) { - builder?.append(if (todoItem.isChecked) "☑" else "☐") - } else { - builder?.append(SpannableBuilder.builder() - .append(if (todoItem.isChecked) checked else unchecked)) - ?.append(" ") - } - } else { - builder?.append("\u2022 ") - } - else -> null - } - - } - } - - override fun handleTagNode(node: TagNode?, builder: SpannableStringBuilder?, start: Int, end: Int, spanStack: SpanStack?) { - builder?.let(this::appendNewLine) - } - - internal class TodoItems { - var isChecked: Boolean = false - } -} diff --git a/markdown/src/main/java/com/fastaccess/markdown/spans/MarginHandler.kt b/markdown/src/main/java/com/fastaccess/markdown/spans/MarginHandler.kt deleted file mode 100644 index 493650cc..00000000 --- a/markdown/src/main/java/com/fastaccess/markdown/spans/MarginHandler.kt +++ /dev/null @@ -1,30 +0,0 @@ -package com.fastaccess.markdown.spans - -import android.text.Spannable -import android.text.SpannableStringBuilder -import android.text.style.LeadingMarginSpan -import net.nightwhistler.htmlspanner.SpanStack -import net.nightwhistler.htmlspanner.TagNodeHandler -import org.htmlcleaner.TagNode - -/** - * Created by Kosh on 29 Apr 2017, 11:59 PM - */ - -class MarginHandler : TagNodeHandler() { - - override fun beforeChildren(node: TagNode?, builder: SpannableStringBuilder?, spanStack: SpanStack?) { - builder?.let { - if (builder.isNotEmpty() && builder[builder.length - 1].toInt() != 10) { //'10 = \n' - this.appendNewLine(builder) - } - } - } - - override fun handleTagNode(node: TagNode?, builder: SpannableStringBuilder?, start: Int, end: Int, spanStack: SpanStack?) { - builder?.let { - builder.setSpan(LeadingMarginSpan.Standard(30), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) - appendNewLine(builder) - } - } -} diff --git a/markdown/src/main/java/com/fastaccess/markdown/spans/MdQouteSpan.kt b/markdown/src/main/java/com/fastaccess/markdown/spans/MdQouteSpan.kt deleted file mode 100644 index 17fd4314..00000000 --- a/markdown/src/main/java/com/fastaccess/markdown/spans/MdQouteSpan.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.fastaccess.markdown.spans - -import android.graphics.Canvas -import android.graphics.Paint -import android.graphics.Rect -import android.text.Layout -import android.text.style.LeadingMarginSpan -import androidx.annotation.ColorInt -import com.fastaccess.github.extensions.toPx -import kotlin.math.max -import kotlin.math.min - -/** - * Created by Kosh on 2019-06-30. - */ -class MdQouteSpan( - @ColorInt private val paintColor: Int -) : LeadingMarginSpan { - - private val rect = Rect() - private val paint = Paint() - - override fun getLeadingMargin(first: Boolean): Int = LEADING_MARGIN.toPx() - override fun drawLeadingMargin( - c: Canvas?, - p: Paint?, - x: Int, - dir: Int, - top: Int, - baseline: Int, - bottom: Int, - text: CharSequence?, - start: Int, - end: Int, - first: Boolean, - layout: Layout? - ) { - val w = WIDTH.toPx() - paint.set(p) - paint.style = Paint.Style.FILL - paint.color = paintColor - val leftWithMargin = x + dir * w - val rightWithMargin = leftWithMargin + dir * w - val left = min(leftWithMargin, rightWithMargin) - val right = max(leftWithMargin, rightWithMargin) - rect.set(left, top, right, bottom) - c?.drawRect(rect, paint) - - } - - companion object { - private const val LEADING_MARGIN = 24 - private const val WIDTH = 4 - } -} \ No newline at end of file diff --git a/markdown/src/main/java/com/fastaccess/markdown/spans/PreTagHandler.kt b/markdown/src/main/java/com/fastaccess/markdown/spans/PreTagHandler.kt deleted file mode 100644 index 62d3c3e1..00000000 --- a/markdown/src/main/java/com/fastaccess/markdown/spans/PreTagHandler.kt +++ /dev/null @@ -1,82 +0,0 @@ -package com.fastaccess.markdown.spans - -import android.graphics.Color -import android.text.SpannableStringBuilder -import android.text.Spanned.SPAN_EXCLUSIVE_EXCLUSIVE -import android.text.style.BackgroundColorSpan -import android.text.style.ForegroundColorSpan -import android.text.style.TypefaceSpan -import com.fastaccess.github.extensions.isTrue -import net.nightwhistler.htmlspanner.SpanStack -import net.nightwhistler.htmlspanner.TextUtil -import net.nightwhistler.htmlspanner.handlers.PreHandler -import org.htmlcleaner.ContentNode -import org.htmlcleaner.TagNode - -/** - * Created by Kosh on 22 Apr 2017, 1:07 PM - */ -class PreTagHandler( - private val color: Int = 0, - private val isPre: Boolean = false, - private val isLightTheme: Boolean = true -) : PreHandler() { - - private fun getPlainText(buffer: StringBuffer, node: Any?) { - if (node is ContentNode) { - val text = TextUtil.replaceHtmlEntities(node.content.toString(), true) - buffer.append(text) - } else if (node is TagNode) { - for (child in node.allChildren) { - getPlainText(buffer, child) - } - } - } - - private fun replace(text: String): String { - return text.replace(" ".toRegex(), "\u00A0") - .replace("&", "&", true) - .replace(""", "\"", true) - .replace("¢", "¢", true) - .replace("<", "<", true) - .replace(">", ">", true) - .replace("§", "§", true) - .replace("“", "“", true) - .replace("”", "”", true) - .replace("‘", "‘", true) - .replace("’", "’", true) - .replace("–", "\u2013", true) - .replace("—", "\u2014", true) - .replace("―", "\u2015", true) - } - - override fun beforeChildren(node: TagNode?, builder: SpannableStringBuilder?, spanStack: SpanStack?) { - super.beforeChildren(node, builder, spanStack) - isPre.isTrue { node?.addChild(ContentNode("\n")) } // append fake hr - } - - override fun handleTagNode(node: TagNode?, builder: SpannableStringBuilder?, start: Int, end: Int, spanStack: SpanStack?) { - builder?.let { - if (isPre) { - val buffer = StringBuffer() - buffer.append("\n")//fake padding top + make sure, pre is always by itself - getPlainText(buffer, node) - builder.append(replace(buffer.toString())) - this.appendNewLine(builder) - builder.setSpan(CodeBackgroundRoundedSpan(color), start, builder.length, SPAN_EXCLUSIVE_EXCLUSIVE) - } else { - val text = node?.text ?: "" - builder.append(" ") - builder.append(replace(text.toString())) - builder.append(" ") - val stringStart = start + 1 - val stringEnd = builder.length - 1 - builder.setSpan(BackgroundColorSpan(color), stringStart, stringEnd, SPAN_EXCLUSIVE_EXCLUSIVE) - if (isLightTheme) { - builder.setSpan(ForegroundColorSpan(Color.RED), stringStart, stringEnd, SPAN_EXCLUSIVE_EXCLUSIVE) - } - builder.setSpan(TypefaceSpan("monospace"), stringStart, stringEnd, SPAN_EXCLUSIVE_EXCLUSIVE) - } - } - } -} diff --git a/markdown/src/main/java/com/fastaccess/markdown/spans/QuoteHandler.kt b/markdown/src/main/java/com/fastaccess/markdown/spans/QuoteHandler.kt deleted file mode 100644 index 994a12b6..00000000 --- a/markdown/src/main/java/com/fastaccess/markdown/spans/QuoteHandler.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.fastaccess.markdown.spans - -import android.text.SpannableStringBuilder -import net.nightwhistler.htmlspanner.SpanStack - -import net.nightwhistler.htmlspanner.TagNodeHandler - -import org.htmlcleaner.TagNode - -/** - * Created by Kosh on 23 Apr 2017, 11:30 AM - */ - -class QuoteHandler(private val color: Int = 0) : TagNodeHandler() { - override fun handleTagNode( - node: TagNode?, - builder: SpannableStringBuilder?, - start: Int, - end: Int, - spanStack: SpanStack? - ) { - builder?.setSpan(MdQouteSpan(color), if (start > builder.length - 1) start + 1 else start, builder.length - 1, 33) - } -} diff --git a/markdown/src/main/java/com/fastaccess/markdown/spans/StrikethroughHandler.kt b/markdown/src/main/java/com/fastaccess/markdown/spans/StrikethroughHandler.kt deleted file mode 100644 index 03772397..00000000 --- a/markdown/src/main/java/com/fastaccess/markdown/spans/StrikethroughHandler.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.fastaccess.markdown.spans - -import android.text.SpannableStringBuilder -import android.text.style.StrikethroughSpan -import net.nightwhistler.htmlspanner.SpanStack -import net.nightwhistler.htmlspanner.TagNodeHandler -import org.htmlcleaner.TagNode - -class StrikethroughHandler : TagNodeHandler() { - - override fun handleTagNode(node: TagNode?, builder: SpannableStringBuilder?, start: Int, end: Int, spanStack: SpanStack?) { - builder?.setSpan(StrikethroughSpan(), start, end, 33) - } -} \ No newline at end of file diff --git a/markdown/src/main/java/com/fastaccess/markdown/spans/SubScriptHandler.kt b/markdown/src/main/java/com/fastaccess/markdown/spans/SubScriptHandler.kt deleted file mode 100644 index b32d5355..00000000 --- a/markdown/src/main/java/com/fastaccess/markdown/spans/SubScriptHandler.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.fastaccess.markdown.spans - -import android.text.SpannableStringBuilder -import android.text.style.RelativeSizeSpan -import android.text.style.SubscriptSpan -import net.nightwhistler.htmlspanner.SpanStack -import net.nightwhistler.htmlspanner.TagNodeHandler -import org.htmlcleaner.TagNode - -class SubScriptHandler : TagNodeHandler() { - override fun handleTagNode(node: TagNode?, builder: SpannableStringBuilder?, start: Int, end: Int, spanStack: SpanStack) { - builder?.let { - builder.setSpan(SubscriptSpan(), start, end, 33) - builder.setSpan(RelativeSizeSpan(0.8f), start, end, 33) - } - } -} \ No newline at end of file diff --git a/markdown/src/main/java/com/fastaccess/markdown/spans/SuperScriptHandler.kt b/markdown/src/main/java/com/fastaccess/markdown/spans/SuperScriptHandler.kt deleted file mode 100644 index fe3ef3d1..00000000 --- a/markdown/src/main/java/com/fastaccess/markdown/spans/SuperScriptHandler.kt +++ /dev/null @@ -1,18 +0,0 @@ -package com.fastaccess.markdown.spans - -import android.text.SpannableStringBuilder -import android.text.style.RelativeSizeSpan -import android.text.style.SuperscriptSpan -import net.nightwhistler.htmlspanner.SpanStack -import net.nightwhistler.htmlspanner.TagNodeHandler -import org.htmlcleaner.TagNode - -class SuperScriptHandler : TagNodeHandler() { - - override fun handleTagNode(node: TagNode?, builder: SpannableStringBuilder?, start: Int, end: Int, spanStack: SpanStack?) { - builder?.let { - builder.setSpan(SuperscriptSpan(), start, end, 33) - builder.setSpan(RelativeSizeSpan(0.8f), start, end, 33) - } - } -} \ No newline at end of file diff --git a/markdown/src/main/java/com/fastaccess/markdown/spans/UnderlineHandler.kt b/markdown/src/main/java/com/fastaccess/markdown/spans/UnderlineHandler.kt deleted file mode 100644 index 81f342bd..00000000 --- a/markdown/src/main/java/com/fastaccess/markdown/spans/UnderlineHandler.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.fastaccess.markdown.spans - -import android.text.SpannableStringBuilder -import android.text.style.UnderlineSpan -import net.nightwhistler.htmlspanner.SpanStack - -import net.nightwhistler.htmlspanner.TagNodeHandler - -import org.htmlcleaner.TagNode - -class UnderlineHandler : TagNodeHandler() { - override fun handleTagNode(node: TagNode?, builder: SpannableStringBuilder?, start: Int, end: Int, spanStack: SpanStack?) { - builder?.setSpan(UnderlineSpan(), start, end, 33) - } -} \ No newline at end of file diff --git a/markdown/src/main/java/com/fastaccess/markdown/spans/UrlSpan.kt b/markdown/src/main/java/com/fastaccess/markdown/spans/UrlSpan.kt deleted file mode 100644 index a82f2549..00000000 --- a/markdown/src/main/java/com/fastaccess/markdown/spans/UrlSpan.kt +++ /dev/null @@ -1,18 +0,0 @@ -package com.fastaccess.markdown.spans - -import android.text.TextPaint -import android.text.style.URLSpan - -/** - * Created by Kosh on 2019-06-30. - */ -class UrlSpan ( - url: String, - private val textColor: Int -) : URLSpan(url) { - override fun updateDrawState(textPaint: TextPaint) { - super.updateDrawState(textPaint) - textPaint.color = textColor - textPaint.isUnderlineText = false - } -} \ No newline at end of file diff --git a/markdown/src/main/java/com/fastaccess/markdown/spans/drawable/DrawableGetter.kt b/markdown/src/main/java/com/fastaccess/markdown/spans/drawable/DrawableGetter.kt deleted file mode 100644 index 79f1db9d..00000000 --- a/markdown/src/main/java/com/fastaccess/markdown/spans/drawable/DrawableGetter.kt +++ /dev/null @@ -1,68 +0,0 @@ -package com.fastaccess.markdown.spans.drawable - -import android.graphics.drawable.Drawable -import android.text.Html -import android.widget.TextView -import androidx.annotation.NonNull -import com.bumptech.glide.Glide -import com.bumptech.glide.load.engine.DiskCacheStrategy -import com.bumptech.glide.load.resource.gif.GifDrawable -import com.bumptech.glide.request.RequestOptions -import com.fastaccess.github.extensions.getDrawableCompat -import com.fastaccess.markdown.R -import timber.log.Timber - -/** - * Created by Kosh on 22 Apr 2017, 7:44 PM - */ - -class DrawableGetter( - private val tv: TextView?, - private val width: Int, - private val url: String -) : Html.ImageGetter, Drawable.Callback { - private val cachedTargets = hashSetOf>() - - init { - tv?.setTag(R.id.drawable_callback, this) - } - - override fun getDrawable(oriUrl: String): Drawable { - val urlDrawable = UrlDrawable() - tv?.let { - val context = it.context ?: return urlDrawable - val imageTarget = if (oriUrl.endsWith(".gif")) { - GlideDrawableTarget(urlDrawable, tv, width) - } else { - GlideDrawableTarget(urlDrawable, tv, width) - } - Glide.with(it).apply { - clear(it) - applyDefaultRequestOptions(RequestOptions().diskCacheStrategy(DiskCacheStrategy.ALL) - .placeholder(context.getDrawableCompat(R.drawable.ic_image))) - if (oriUrl.endsWith(".gif")) { - asGif().load(url).into(imageTarget as GlideDrawableTarget) - } else { - asDrawable().load(url).into(imageTarget as GlideDrawableTarget) - } - } - cachedTargets.add(imageTarget) - } - return urlDrawable - } - - override fun invalidateDrawable(@NonNull drawable: Drawable) { - tv?.invalidate() - } - - override fun scheduleDrawable(@NonNull drawable: Drawable, @NonNull runnable: Runnable, l: Long) {} - - override fun unscheduleDrawable(@NonNull drawable: Drawable, @NonNull runnable: Runnable) {} - - fun clear(@NonNull drawableGetter: DrawableGetter) { - Timber.e("clearing......") - for (target in drawableGetter.cachedTargets) { - tv?.let { Glide.with(it).clear(target) } - } - } -} diff --git a/markdown/src/main/java/com/fastaccess/markdown/spans/drawable/GlideDrawableTarget.kt b/markdown/src/main/java/com/fastaccess/markdown/spans/drawable/GlideDrawableTarget.kt deleted file mode 100644 index b0f19367..00000000 --- a/markdown/src/main/java/com/fastaccess/markdown/spans/drawable/GlideDrawableTarget.kt +++ /dev/null @@ -1,67 +0,0 @@ -package com.fastaccess.markdown.spans.drawable - -import android.graphics.Rect -import android.graphics.drawable.Drawable -import android.widget.TextView -import com.bumptech.glide.load.resource.gif.GifDrawable -import com.bumptech.glide.request.target.SimpleTarget -import com.bumptech.glide.request.transition.Transition -import com.fastaccess.markdown.R - -internal class GlideDrawableTarget( - private val urlDrawable: UrlDrawable, - private val container: TextView?, - private val width: Int -) : SimpleTarget() { - - override fun onResourceReady(resource: T, transition: Transition?) { - val textView = container - textView?.post { - val width: Float - val height: Float - if (resource.intrinsicWidth >= this.width) { - val downScale = resource.intrinsicWidth.toFloat() / this.width - width = (resource.intrinsicWidth.toDouble() / downScale.toDouble() / 1.3).toFloat() - height = (resource.intrinsicHeight.toDouble() / downScale.toDouble() / 1.3).toFloat() - } else { - val multiplier = this.width.toFloat() / resource.intrinsicWidth - width = resource.intrinsicWidth.toFloat() * multiplier - height = resource.intrinsicHeight.toFloat() * multiplier - } - val rect = Rect(0, 0, Math.round(width), Math.round(height)) - resource.bounds = rect - urlDrawable.bounds = rect - urlDrawable.setDrawable(resource) - urlDrawable.callback = textView.getTag(R.id.drawable_callback) as DrawableGetter - if (resource is GifDrawable) { - resource.setLoopCount(GifDrawable.LOOP_FOREVER) - resource.start() - } - textView.text = textView.text - textView.invalidate() - } - } - - override fun onLoadStarted(placeholder: Drawable?) { - super.onLoadStarted(placeholder) - applyTempDrawable(placeholder) - } - - override fun onLoadFailed(errorDrawable: Drawable?) { - super.onLoadFailed(errorDrawable) - applyTempDrawable(errorDrawable) - } - - private fun applyTempDrawable(placeholder: Drawable?) { - placeholder?.let { drawable -> - val rect = Rect(0, 0, drawable.intrinsicWidth, drawable.intrinsicHeight) - drawable.bounds = rect - urlDrawable.bounds = rect - urlDrawable.setDrawable(drawable) - container?.let { - it.text = it.text - it.invalidate() - } - } - } -} \ No newline at end of file diff --git a/markdown/src/main/java/com/fastaccess/markdown/spans/drawable/UrlDrawable.kt b/markdown/src/main/java/com/fastaccess/markdown/spans/drawable/UrlDrawable.kt deleted file mode 100644 index 37bfdccd..00000000 --- a/markdown/src/main/java/com/fastaccess/markdown/spans/drawable/UrlDrawable.kt +++ /dev/null @@ -1,45 +0,0 @@ -package com.fastaccess.markdown.spans.drawable - -import android.graphics.Canvas -import android.graphics.drawable.BitmapDrawable -import android.graphics.drawable.Drawable - -import com.bumptech.glide.load.resource.gif.GifDrawable - -class UrlDrawable : BitmapDrawable(), Drawable.Callback { - - private var drawable: Drawable? = null - - override fun draw(canvas: Canvas) { - drawable?.let { - it.draw(canvas) - if (it is GifDrawable) { - if (!it.isRunning) it.start() - } - } - } - - override fun invalidateDrawable(who: Drawable) { - if (callback != null) { - callback!!.invalidateDrawable(who) - } - } - - override fun scheduleDrawable(who: Drawable, what: Runnable, `when`: Long) { - if (callback != null) { - callback!!.scheduleDrawable(who, what, `when`) - } - } - - override fun unscheduleDrawable(who: Drawable, what: Runnable) { - if (callback != null) { - callback!!.unscheduleDrawable(who, what) - } - } - - fun setDrawable(drawable: Drawable) { - this.drawable?.callback = this - drawable.callback = this - this.drawable = drawable - } -} \ No newline at end of file diff --git a/markdown/src/main/java/com/fastaccess/markdown/widget/HtmlTextView.kt b/markdown/src/main/java/com/fastaccess/markdown/widget/HtmlTextView.kt deleted file mode 100644 index 800c9c17..00000000 --- a/markdown/src/main/java/com/fastaccess/markdown/widget/HtmlTextView.kt +++ /dev/null @@ -1,21 +0,0 @@ -package com.fastaccess.markdown.widget - -import android.content.Context -import android.util.AttributeSet -import androidx.appcompat.widget.AppCompatTextView - -/** - * Created by Kosh on 02.02.19. - */ -class HtmlTextView constructor( - context: Context, - attrs: AttributeSet? = null, - defStyle: Int = 0 -) : AppCompatTextView(context, attrs, defStyle) { - constructor(context: Context) : this(context, null) - constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0) - - fun setHtml(text: String? = null) { - //TODO - } -} \ No newline at end of file