gpt4 book ai didi

android - 处理剧透 BBcode Android

转载 作者:太空狗 更新时间:2023-10-29 16:45:35 30 4
gpt4 key购买 nike

我正在为论坛开发应用程序。

我需要一个像 Tapatalk 那样的剧透按钮

enter image description here

隐藏文本部分,仅在用户单击按钮时显示。

我正在获取帖子的所有文本,包括剧透 BBCode。我设法使用以下正则表达式获取剧透的内容:

\[SPOILER\](.+?)\[\/SPOILER\]

我的问题是我想添加一个剧透按钮,但我所有的文本都是类似 HTML 的,因为每个对象(图像、链接、格式代码等)都被翻译成 HTML,然后由 Android 处理Html.fromHtml() 方法。

这是将 BBCode“翻译”成 HTML 的解析方法:

private static String parsePostContent(String text){
String html = text;

Map<String,String> bbMap = new HashMap<>();

bbMap.put("(\r\n|\r|\n|\n\r)", "<br/>");
bbMap.put("\\[b\\](.+?)\\[/b\\]", "<strong>$1</strong>");
bbMap.put("\\[i\\](.+?)\\[/i\\]", "<span style='font-style:italic;'>$1</span>");
bbMap.put("\\[u\\](.+?)\\[/u\\]", "<span style='text-decoration:underline;'>$1</span>");
bbMap.put("\\[h1\\](.+?)\\[/h1\\]", "<h1>$1</h1>");
bbMap.put("\\[h2\\](.+?)\\[/h2\\]", "<h2>$1</h2>");
bbMap.put("\\[h3\\](.+?)\\[/h3\\]", "<h3>$1</h3>");
bbMap.put("\\[h4\\](.+?)\\[/h4\\]", "<h4>$1</h4>");
bbMap.put("\\[h5\\](.+?)\\[/h5\\]", "<h5>$1</h5>");
bbMap.put("\\[h6\\](.+?)\\[/h6\\]", "<h6>$1</h6>");
bbMap.put("\\[quote\\](.+?)\\[/quote\\]", "<blockquote>$1</blockquote>");
bbMap.put("(?s)^\\[quote name=\"([^\"]+)\".*\\](.+)\\[\\/quote\\]", "<span style='font-style:italic;'>Citazione di: $1</span> <blockquote>$2</blockquote>");
bbMap.put("\\[p\\](.+?)\\[/p\\]", "<p>$1</p>");
bbMap.put("\\[p=(.+?),(.+?)\\](.+?)\\[/p\\]", "<p style='text-indent:$1px;line-height:$2%;'>$3</p>");
bbMap.put("\\[center\\](.+?)\\[/center\\]", "<div align='center'>$1");
bbMap.put("\\[align=(.+?)\\](.+?)\\[/align\\]", "<div align='$1'>$2");
bbMap.put("\\[color=(.+?)\\](.+?)\\[/color\\]", "<span style='color:$1;'>$2</span>");
bbMap.put("\\[size=(.+?)\\](.+?)\\[/size\\]", "<span style='font-size:$1;'>$2</span>");
bbMap.put("\\[img\\](.+?)\\[/img\\]", "<img src='$1' />");
bbMap.put("\\[img=(.+?),(.+?)\\](.+?)\\[/img\\]", "<img width='$1' height='$2' src='$3' />");
bbMap.put("\\[email\\](.+?)\\[/email\\]", "<a href='mailto:$1'>$1</a>");
bbMap.put("\\[email=(.+?)\\](.+?)\\[/email\\]", "<a href='mailto:$1'>$2</a>");
bbMap.put("\\[url\\](.+?)\\[/url\\]", "<a href='$1'>$1</a>");
bbMap.put("\\[url=(.+?)\\](.+?)\\[/url\\]", "<a href='$1'>$2</a>");
bbMap.put("\\[youtube\\](.+?)\\[/youtube\\]", "<object width='640' height='380'><param name='movie' value='http://www.youtube.com/v/$1'></param><embed src='http://www.youtube.com/v/$1' type='application/x-shockwave-flash' width='640' height='380'></embed></object>");
bbMap.put("\\[video\\](.+?)\\[/video\\]", "<video src='$1' />");
bbMap.put("\\[SPOILER\\](.+?)\\[\\/SPOILER\\]", "$1");

for (Map.Entry entry: bbMap.entrySet()) {
html = html.replaceAll(entry.getKey().toString(), entry.getValue().toString());
}

return html;
}

请注意,剧透行仅用于测试目的。

然后在Adapter类中的TextView中设置字符串:

postText.setText(Html.fromHtml(post.getPostText()));

文章的布局是这样的:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

<TextView
android:id="@+id/postAuthor"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="10dp"
android:layout_marginTop="10dp"
android:text="New Text"
android:textStyle="bold" />

<TextView
android:id="@+id/postDate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/postAuthor"
android:layout_alignStart="@+id/postAuthor"
android:layout_below="@+id/postAuthor"
android:layout_marginTop="5dp"
android:text="New Text"
android:textStyle="italic" />

<TextView
android:id="@+id/postText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/postDate"
android:layout_alignStart="@+id/postDate"
android:layout_below="@+id/postDate"
android:layout_marginBottom="15dp"
android:layout_marginTop="20dp"
android:autoLink="web"
android:linksClickable="true"
android:text="New Text" />
</RelativeLayout>

每个帖子对象都放在一个 ListView 中。

我的问题是:如何创建类似的布局,即使是使用 HTML 或某种外部库?

谢谢。

最佳答案

TextView不支持 <span> , <object>也不<button>标签。有一个 unofficial list支持的标签。

对于 [spoiler] bbcode,你可以渲染两个TextViews ,一个有扰流板,一个没有扰流板。然后添加一个按钮以在两者之间切换。

JavaScript 演示:

var spoilerVisible = false;
$('#toggleSpoiler').on('click', function () {
spoilerVisible = !spoilerVisible;
$('#textview1').toggle(!spoilerVisible);
$('#textview2').toggle(spoilerVisible);
$('#toggleSpoiler').text(spoilerVisible ? 'Hide spoiler' : 'Show spoiler');
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="textview1">This is a test.</div>
<div id="textview2" style="display:none;">This is a test. Spoiled!</div>
<button id="toggleSpoiler">Show spoiler</button>

关于android - 处理剧透 BBcode Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32533636/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com