Support RTL language in the reading page
This commit is contained in:
parent
a94017d564
commit
1384012c44
|
@ -4,7 +4,6 @@ import android.content.Context
|
|||
import android.text.Html
|
||||
import android.util.Log
|
||||
import com.rometools.rome.feed.synd.SyndEntry
|
||||
import com.rometools.rome.feed.synd.SyndFeed
|
||||
import com.rometools.rome.io.SyndFeedInput
|
||||
import com.rometools.rome.io.XmlReader
|
||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
||||
|
@ -37,16 +36,15 @@ class RssHelper @Inject constructor(
|
|||
suspend fun searchFeed(feedLink: String): FeedWithArticle {
|
||||
return withContext(dispatcherIO) {
|
||||
val accountId = context.currentAccountId
|
||||
val parseRss: SyndFeed =
|
||||
SyndFeedInput().build(XmlReader(inputStream(okHttpClient, feedLink)))
|
||||
val syndFeed = SyndFeedInput().build(XmlReader(inputStream(okHttpClient, feedLink)))
|
||||
val feed = Feed(
|
||||
id = accountId.spacerDollar(UUID.randomUUID().toString()),
|
||||
name = parseRss.title!!,
|
||||
name = syndFeed.title!!,
|
||||
url = feedLink,
|
||||
groupId = "",
|
||||
accountId = accountId,
|
||||
)
|
||||
val list = parseRss.entries.map { article(feed, context.currentAccountId, it) }
|
||||
val list = syndFeed.entries.map { article(feed, context.currentAccountId, it) }
|
||||
FeedWithArticle(feed, list)
|
||||
}
|
||||
}
|
||||
|
@ -62,9 +60,8 @@ class RssHelper @Inject constructor(
|
|||
suspend fun parseFullContent(link: String, title: String): String {
|
||||
return withContext(dispatcherIO) {
|
||||
val response = response(okHttpClient, link)
|
||||
val content = response.body!!.string()
|
||||
val readability4J: Readability4J =
|
||||
Readability4JExtended(link, content)
|
||||
val content = response.body.string()
|
||||
val readability4J = Readability4JExtended(link, content)
|
||||
val articleContent = readability4J.parse().articleContent
|
||||
if (articleContent == null) {
|
||||
""
|
||||
|
@ -85,10 +82,8 @@ class RssHelper @Inject constructor(
|
|||
): List<Article> {
|
||||
return withContext(dispatcherIO) {
|
||||
val accountId = context.currentAccountId
|
||||
val parseRss: SyndFeed = SyndFeedInput().build(
|
||||
XmlReader(inputStream(okHttpClient, feed.url))
|
||||
)
|
||||
parseRss.entries.asSequence()
|
||||
val syndFeed = SyndFeedInput().build(XmlReader(inputStream(okHttpClient, feed.url)))
|
||||
syndFeed.entries.asSequence()
|
||||
.takeWhile { latestLink == null || latestLink != it.link }
|
||||
.map { article(feed, accountId, it) }
|
||||
.toList()
|
||||
|
@ -124,7 +119,7 @@ class RssHelper @Inject constructor(
|
|||
rawDescription = (content ?: desc) ?: "",
|
||||
shortDescription = (Readability4JExtended("", desc ?: content ?: "")
|
||||
.parse().textContent ?: "")
|
||||
.take(100)
|
||||
.take(110)
|
||||
.trim(),
|
||||
fullContent = content,
|
||||
img = findImg((content ?: desc) ?: ""),
|
||||
|
@ -150,9 +145,8 @@ class RssHelper @Inject constructor(
|
|||
withContext(dispatcherIO) {
|
||||
val domainRegex = Regex("(http|https)://(www.)?(\\w+(\\.)?)+")
|
||||
val request = response(okHttpClient, articleLink)
|
||||
val content = request.body!!.string()
|
||||
val regex =
|
||||
Regex("""<link(.+?)rel="shortcut icon"(.+?)href="(.+?)"""")
|
||||
val content = request.body.string()
|
||||
val regex = Regex("""<link(.+?)rel="shortcut icon"(.+?)href="(.+?)"""")
|
||||
var iconLink = regex
|
||||
.find(content)
|
||||
?.groups?.get(3)
|
||||
|
@ -188,7 +182,7 @@ class RssHelper @Inject constructor(
|
|||
private suspend fun inputStream(
|
||||
client: OkHttpClient,
|
||||
url: String
|
||||
): InputStream = response(client, url).body!!.byteStream()
|
||||
): InputStream = response(client, url).body.byteStream()
|
||||
|
||||
private suspend fun response(
|
||||
client: OkHttpClient,
|
||||
|
|
|
@ -44,43 +44,50 @@ fun bodyForeground(): Color =
|
|||
@Composable
|
||||
fun bodyStyle(): TextStyle =
|
||||
MaterialTheme.typography.bodyLarge.copy(
|
||||
color = bodyForeground()
|
||||
color = bodyForeground(),
|
||||
textAlign = TextAlign.Start,
|
||||
)
|
||||
|
||||
@Composable
|
||||
fun h1Style(): TextStyle =
|
||||
MaterialTheme.typography.displayMedium.copy(
|
||||
color = bodyForeground()
|
||||
color = bodyForeground(),
|
||||
textAlign = TextAlign.Start,
|
||||
)
|
||||
|
||||
@Composable
|
||||
fun h2Style(): TextStyle =
|
||||
MaterialTheme.typography.displaySmall.copy(
|
||||
color = bodyForeground()
|
||||
color = bodyForeground(),
|
||||
textAlign = TextAlign.Start,
|
||||
)
|
||||
|
||||
@Composable
|
||||
fun h3Style(): TextStyle =
|
||||
MaterialTheme.typography.headlineLarge.copy(
|
||||
color = bodyForeground()
|
||||
color = bodyForeground(),
|
||||
textAlign = TextAlign.Start,
|
||||
)
|
||||
|
||||
@Composable
|
||||
fun h4Style(): TextStyle =
|
||||
MaterialTheme.typography.headlineMedium.copy(
|
||||
color = bodyForeground()
|
||||
color = bodyForeground(),
|
||||
textAlign = TextAlign.Start,
|
||||
)
|
||||
|
||||
@Composable
|
||||
fun h5Style(): TextStyle =
|
||||
MaterialTheme.typography.headlineSmall.copy(
|
||||
color = bodyForeground(),
|
||||
textAlign = TextAlign.Start,
|
||||
)
|
||||
|
||||
@Composable
|
||||
fun h6Style(): TextStyle =
|
||||
MaterialTheme.typography.titleLarge.copy(
|
||||
color = bodyForeground()
|
||||
color = bodyForeground(),
|
||||
textAlign = TextAlign.Start,
|
||||
)
|
||||
|
||||
@Composable
|
||||
|
|
|
@ -8,6 +8,7 @@ import androidx.compose.runtime.remember
|
|||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.draw.alpha
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import androidx.compose.ui.text.style.TextAlign
|
||||
import androidx.compose.ui.unit.dp
|
||||
import me.ash.reader.ui.ext.formatAsString
|
||||
import me.ash.reader.ui.ext.openURL
|
||||
|
@ -40,12 +41,14 @@ fun Header(
|
|||
text = dateString,
|
||||
color = MaterialTheme.colorScheme.outline,
|
||||
style = MaterialTheme.typography.labelMedium,
|
||||
textAlign = TextAlign.Start,
|
||||
)
|
||||
Spacer(modifier = Modifier.height(4.dp))
|
||||
Text(
|
||||
text = title,
|
||||
color = MaterialTheme.colorScheme.onSurface,
|
||||
style = MaterialTheme.typography.headlineLarge,
|
||||
textAlign = TextAlign.Start,
|
||||
)
|
||||
Spacer(modifier = Modifier.height(4.dp))
|
||||
author?.let {
|
||||
|
@ -55,6 +58,7 @@ fun Header(
|
|||
text = it,
|
||||
color = MaterialTheme.colorScheme.outline,
|
||||
style = MaterialTheme.typography.labelMedium,
|
||||
textAlign = TextAlign.Start,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
@ -63,6 +67,7 @@ fun Header(
|
|||
text = feedName,
|
||||
color = MaterialTheme.colorScheme.outline,
|
||||
style = MaterialTheme.typography.labelMedium,
|
||||
textAlign = TextAlign.Start,
|
||||
)
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user