Created
July 31, 2025 08:44
-
-
Save mahdiPourkazemi/6166969b0bf3317bc8517fa6624ebeeb to your computer and use it in GitHub Desktop.
quoran text style with color
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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