Skip to content

Instantly share code, notes, and snippets.

@mahdiPourkazemi
Created July 31, 2025 08:44
Show Gist options
  • Save mahdiPourkazemi/6166969b0bf3317bc8517fa6624ebeeb to your computer and use it in GitHub Desktop.
Save mahdiPourkazemi/6166969b0bf3317bc8517fa6624ebeeb to your computer and use it in GitHub Desktop.
quoran text style with color
fun String.toAnnotatedTextWithArabicDiacritics(
diacriticsStyle: SpanStyle = SpanStyle(color = Color.Red)
): AnnotatedString {
val builder = AnnotatedString.Builder()
// اعراب عربی که باید قرمز شوند
val arabicDiacritics = setOf(
'\u064B', // فتحتان (ً)
'\u064C', // ضمتان (ٌ)
'\u064D', // کسرتان (ٍ)
'\u064E', // فتحه (َ)
'\u064F', // ضمه (ُ)
'\u0650', // کسره (ِ)
'\u0651', // شده (ّ)
'\u0652', // سکون (ْ)
'\u0653', // مده (ٓ)
'\u0654', // همزه بالا (ٔ)
'\u0655', // همزه پایین (ٕ)
'\u0656', // کسره مقلوب (ٖ)
'\u0657', // فتحه مقلوب (ٗ)
'\u0658', // ضمه مقلوب (٘)
'\u0659', // واو کوچک (ٙ)
'\u065A', // یای کوچک (ٚ)
'\u065B', // واو کوچک بالا (ٛ)
'\u065C', // یای کوچک بالا (ٜ)
'\u065D', // کسره معکوس (ٝ)
'\u065E', // فتحه معکوس (ٞ)
'\u065F', // ضمه معکوس (ٟ)
'\u0670' // الف کوتاه بالا (ٰ)
)
var i = 0
while (i < length) {
val char = this[i]
if (char in arabicDiacritics) {
// اعراب را با استایل مشخص شده اضافه کن
builder.pushStyle(diacriticsStyle)
builder.append(char)
builder.pop()
} else {
// کاراکترهای عادی را بدون استایل اضافه کن
builder.append(char)
}
i++
}
return builder.toAnnotatedString()
}
//###########################################################################
// نسخه بهبود یافته کد اصلی شما برای هایلایت کردن کلمات خاص
fun String.toAnnotatedText(
keyword: String,
keywordStyle: SpanStyle = SpanStyle(color = Color.Red)
): AnnotatedString {
val builder = AnnotatedString.Builder()
val start = indexOf(keyword)
if (start == -1) return AnnotatedString(this)
builder.append(substring(0, start))
builder.pushStyle(keywordStyle)
builder.append(keyword)
builder.pop()
builder.append(substring(start + keyword.length))
return builder.toAnnotatedString()
}
//###########################################################################
// نسخه ترکیبی که هم کلمات خاص و هم اعراب عربی را هایلایت می‌کند
fun String.toAnnotatedTextWithKeywordAndDiacritics(
keyword: String? = null,
keywordStyle: SpanStyle = SpanStyle(color = Color.Blue),
diacriticsStyle: SpanStyle = SpanStyle(color = Color.Red)
): AnnotatedString {
val builder = AnnotatedString.Builder()
val arabicDiacritics = setOf(
'\u064B', '\u064C', '\u064D', '\u064E', '\u064F', '\u0650',
'\u0651', '\u0652', '\u0653', '\u0654', '\u0655', '\u0656',
'\u0657', '\u0658', '\u0659', '\u065A', '\u065B', '\u065C',
'\u065D', '\u065E', '\u065F', '\u0670'
)
var i = 0
while (i < length) {
val char = this[i]
// بررسی کنید که آیا در شروع کلمه کلیدی هستیم
var keywordFound = false
if (keyword != null && i <= length - keyword.length) {
val substring = substring(i, i + keyword.length)
if (substring == keyword) {
// کلمه کلیدی را هایلایت کن
builder.pushStyle(keywordStyle)
// هر کاراکتر کلمه کلیدی را بررسی کن
for (j in 0 until keyword.length) {
val keywordChar = keyword[j]
if (keywordChar in arabicDiacritics) {
builder.pop() // استایل کلمه کلیدی را بردار
builder.pushStyle(diacriticsStyle) // استایل اعراب را اعمال کن
builder.append(keywordChar)
builder.pop() // استایل اعراب را بردار
builder.pushStyle(keywordStyle) // دوباره استایل کلمه کلیدی را اعمال کن
} else {
builder.append(keywordChar)
}
}
builder.pop()
i += keyword.length
keywordFound = true
}
}
if (!keywordFound) {
if (char in arabicDiacritics) {
builder.pushStyle(diacriticsStyle)
builder.append(char)
builder.pop()
} else {
builder.append(char)
}
i++
}
}
return builder.toAnnotatedString()
}
//###########################################################################
Text(
"اَلْحَمْدُ لِلَّهِ رَبِّ الْعَالَمِينَ".toAnnotatedTextWithArabicDiacritics(),
modifier = modifier
)
//###########################################################################
Text(
"اَلْحَمْدُ لِلَّهِ رَبِّ الْعَالَمِينَ".toAnnotatedTextWithKeywordAndDiacritics(
keyword = "لِلَّهِ",
keywordStyle = SpanStyle(color = Color.Blue, fontWeight = FontWeight.Bold),
diacriticsStyle = SpanStyle(color = Color.Red)
),
modifier = modifier
)
//###########################################################################
Text(
"بِسْمِ اللَّهِ الرَّحْمَٰنِ الرَّحِيمِ".toAnnotatedTextWithArabicDiacritics(
diacriticsStyle = SpanStyle(
color = Color.Green,
fontSize = 12.sp
)
),
modifier = modifier
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment