Skip to content
Snippets Groups Projects
Commit 39721d8f authored by Janne Mareike Koschinski's avatar Janne Mareike Koschinski
Browse files

Correctly parse colors and links

parent fa74da92
Branches custom_prefix
No related tags found
No related merge requests found
...@@ -23,6 +23,7 @@ class MessageAdapter(context: Context) : ...@@ -23,6 +23,7 @@ class MessageAdapter(context: Context) :
RenderingSettings( RenderingSettings(
showPrefix = RenderingSettings.ShowPrefixMode.FIRST, showPrefix = RenderingSettings.ShowPrefixMode.FIRST,
colorizeNicknames = RenderingSettings.ColorizeNicknamesMode.ALL_BUT_MINE, colorizeNicknames = RenderingSettings.ColorizeNicknamesMode.ALL_BUT_MINE,
colorizeMirc = true,
timeFormat = "" timeFormat = ""
) )
) )
......
...@@ -3,9 +3,11 @@ package de.kuschku.quasseldroid_ng.ui.chat ...@@ -3,9 +3,11 @@ package de.kuschku.quasseldroid_ng.ui.chat
import android.content.Context import android.content.Context
import android.graphics.Typeface import android.graphics.Typeface
import android.text.SpannableString import android.text.SpannableString
import android.text.Spanned
import android.text.format.DateFormat import android.text.format.DateFormat
import android.text.style.ForegroundColorSpan import android.text.style.ForegroundColorSpan
import android.text.style.StyleSpan import android.text.style.StyleSpan
import android.text.style.URLSpan
import de.kuschku.libquassel.protocol.Message.MessageType.* import de.kuschku.libquassel.protocol.Message.MessageType.*
import de.kuschku.libquassel.protocol.Message_Flag import de.kuschku.libquassel.protocol.Message_Flag
import de.kuschku.libquassel.protocol.Message_Type import de.kuschku.libquassel.protocol.Message_Type
...@@ -16,6 +18,7 @@ import de.kuschku.quasseldroid_ng.ui.settings.data.RenderingSettings ...@@ -16,6 +18,7 @@ import de.kuschku.quasseldroid_ng.ui.settings.data.RenderingSettings
import de.kuschku.quasseldroid_ng.ui.settings.data.RenderingSettings.ColorizeNicknamesMode import de.kuschku.quasseldroid_ng.ui.settings.data.RenderingSettings.ColorizeNicknamesMode
import de.kuschku.quasseldroid_ng.ui.settings.data.RenderingSettings.ShowPrefixMode import de.kuschku.quasseldroid_ng.ui.settings.data.RenderingSettings.ShowPrefixMode
import de.kuschku.quasseldroid_ng.util.helper.styledAttributes import de.kuschku.quasseldroid_ng.util.helper.styledAttributes
import de.kuschku.quasseldroid_ng.util.irc.format.IrcFormatDeserializer
import de.kuschku.quasseldroid_ng.util.quassel.IrcUserUtils import de.kuschku.quasseldroid_ng.util.quassel.IrcUserUtils
import de.kuschku.quasseldroid_ng.util.ui.SpanFormatter import de.kuschku.quasseldroid_ng.util.ui.SpanFormatter
import org.threeten.bp.ZoneId import org.threeten.bp.ZoneId
...@@ -37,6 +40,8 @@ class QuasselMessageRenderer( ...@@ -37,6 +40,8 @@ class QuasselMessageRenderer(
private val zoneId = ZoneId.systemDefault() private val zoneId = ZoneId.systemDefault()
private val ircFormatDeserializer = IrcFormatDeserializer(context)
init { init {
context.theme.styledAttributes( context.theme.styledAttributes(
R.attr.senderColor0, R.attr.senderColor1, R.attr.senderColor2, R.attr.senderColor3, R.attr.senderColor0, R.attr.senderColor1, R.attr.senderColor2, R.attr.senderColor3,
...@@ -86,7 +91,7 @@ class QuasselMessageRenderer( ...@@ -86,7 +91,7 @@ class QuasselMessageRenderer(
context.getString(R.string.message_format_plain), context.getString(R.string.message_format_plain),
formatPrefix(message.senderPrefixes), formatPrefix(message.senderPrefixes),
formatNick(message.sender, Message_Flag.of(message.flag).hasFlag(Message_Flag.Self)), formatNick(message.sender, Message_Flag.of(message.flag).hasFlag(Message_Flag.Self)),
message.content formatContent(message.content)
) )
) )
Message_Type.Action -> FormattedMessage( Message_Type.Action -> FormattedMessage(
...@@ -96,7 +101,7 @@ class QuasselMessageRenderer( ...@@ -96,7 +101,7 @@ class QuasselMessageRenderer(
context.getString(R.string.message_format_action), context.getString(R.string.message_format_action),
formatPrefix(message.senderPrefixes), formatPrefix(message.senderPrefixes),
formatNick(message.sender, Message_Flag.of(message.flag).hasFlag(Message_Flag.Self)), formatNick(message.sender, Message_Flag.of(message.flag).hasFlag(Message_Flag.Self)),
message.content formatContent(message.content)
) )
) )
Message_Type.Notice -> FormattedMessage( Message_Type.Notice -> FormattedMessage(
...@@ -106,7 +111,7 @@ class QuasselMessageRenderer( ...@@ -106,7 +111,7 @@ class QuasselMessageRenderer(
context.getString(R.string.message_format_notice), context.getString(R.string.message_format_notice),
formatPrefix(message.senderPrefixes), formatPrefix(message.senderPrefixes),
formatNick(message.sender, Message_Flag.of(message.flag).hasFlag(Message_Flag.Self)), formatNick(message.sender, Message_Flag.of(message.flag).hasFlag(Message_Flag.Self)),
message.content formatContent(message.content)
) )
) )
Message_Type.Nick -> FormattedMessage( Message_Type.Nick -> FormattedMessage(
...@@ -209,7 +214,7 @@ class QuasselMessageRenderer( ...@@ -209,7 +214,7 @@ class QuasselMessageRenderer(
Message_Type.Topic -> FormattedMessage( Message_Type.Topic -> FormattedMessage(
message.messageId, message.messageId,
timeFormatter.format(message.time.atZone(zoneId)), timeFormatter.format(message.time.atZone(zoneId)),
message.content formatContent(message.content)
) )
else -> FormattedMessage( else -> FormattedMessage(
message.messageId, message.messageId,
...@@ -225,6 +230,37 @@ class QuasselMessageRenderer( ...@@ -225,6 +230,37 @@ class QuasselMessageRenderer(
} }
} }
private val scheme = "(?:(?:mailto:|(?:[+.-]?\\w)+://)|www(?=\\.\\S+\\.))"
private val authority = "(?:(?:[,.;@:]?[-\\w]+)+\\.?|\\[[0-9a-f:.]+\\])(?::\\d+)?"
private val urlChars = "(?:[,.;:]*[\\w~@/?&=+$()!%#*-])"
private val urlEnd = "((?:>|[,.;:\"]*\\s|\\b|$))"
private val urlPattern = Regex(
String.format("\\b(%s%s(?:/%s*)?)%s", scheme, authority, urlChars, urlEnd),
RegexOption.IGNORE_CASE
)
private val channelPattern = Regex(
"((?:#|![A-Z0-9]{5})[^,:\\s]+(?::[^,:\\s]+)?)\\b",
RegexOption.IGNORE_CASE
)
private fun formatContent(content: String): CharSequence {
val text = SpannableString(
ircFormatDeserializer.formatString(content, renderingSettings.colorizeMirc)
)
for (result in urlPattern.findAll(content)) {
text.setSpan(
URLSpan(result.value), result.range.start, result.range.start + result.value.length,
Spanned.SPAN_INCLUSIVE_INCLUSIVE
)
}
/*
for (result in channelPattern.findAll(content)) {
text.setSpan(URLSpan(result.value), result.range.start, result.range.endInclusive, Spanned.SPAN_INCLUSIVE_INCLUSIVE)
}
*/
return text
}
private fun formatNickImpl(sender: String, colorize: Boolean): CharSequence { private fun formatNickImpl(sender: String, colorize: Boolean): CharSequence {
val nick = IrcUserUtils.nick(sender) val nick = IrcUserUtils.nick(sender)
val spannableString = SpannableString(nick) val spannableString = SpannableString(nick)
......
...@@ -3,6 +3,7 @@ package de.kuschku.quasseldroid_ng.ui.settings.data ...@@ -3,6 +3,7 @@ package de.kuschku.quasseldroid_ng.ui.settings.data
data class RenderingSettings( data class RenderingSettings(
val showPrefix: ShowPrefixMode = ShowPrefixMode.FIRST, val showPrefix: ShowPrefixMode = ShowPrefixMode.FIRST,
val colorizeNicknames: ColorizeNicknamesMode = ColorizeNicknamesMode.ALL_BUT_MINE, val colorizeNicknames: ColorizeNicknamesMode = ColorizeNicknamesMode.ALL_BUT_MINE,
val colorizeMirc: Boolean = true,
val timeFormat: String = "" val timeFormat: String = ""
) { ) {
enum class ColorizeNicknamesMode(val value: Int) { enum class ColorizeNicknamesMode(val value: Int) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment