Skip to content

Commit b8ce734

Browse files
Merge pull request #3155 from nextcloud/improve-note-preview
Improve note preview
2 parents 4234083 + 0b73697 commit b8ce734

3 files changed

Lines changed: 306 additions & 113 deletions

File tree

app/src/main/java/it/niedermann/owncloud/notes/shared/util/NoteUtil.java

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
import static it.niedermann.android.markdown.MarkdownUtil.removeMarkdown;
1919
import static it.niedermann.android.markdown.MarkdownUtil.replaceCheckboxesWithEmojis;
2020

21+
import java.util.regex.Pattern;
22+
2123
/**
2224
* Provides basic functionality for Note operations.
2325
*/
@@ -69,18 +71,49 @@ private static String truncateString(@NonNull String str, @SuppressWarnings("Sam
6971
*/
7072
@NonNull
7173
public static String generateNoteExcerpt(@NonNull String content, @Nullable String title) {
72-
content = removeMarkdown(replaceCheckboxesWithEmojis(content.trim()));
73-
if (TextUtils.isEmpty(content)) {
74+
final var trimmedContent = content.trim();
75+
76+
if (isHtml(trimmedContent)) {
77+
return sanitizeHtml(trimmedContent);
78+
}
79+
80+
final var emojiReplacedWithCheckBoxesContent = replaceCheckboxesWithEmojis(trimmedContent);
81+
var result = removeMarkdown(emojiReplacedWithCheckBoxesContent);
82+
if (TextUtils.isEmpty(result)) {
7483
return "";
7584
}
85+
7686
if (!TextUtils.isEmpty(title)) {
77-
assert title != null;
7887
final String trimmedTitle = removeMarkdown(replaceCheckboxesWithEmojis(title.trim()));
79-
if (content.startsWith(trimmedTitle)) {
80-
content = content.substring(trimmedTitle.length());
88+
if (result.startsWith(trimmedTitle)) {
89+
result = result.substring(trimmedTitle.length());
8190
}
8291
}
83-
return truncateString(content.trim(), 200).replace("\n", EXCERPT_LINE_SEPARATOR);
92+
93+
return truncateString(result.trim(), 200).replace("\n", EXCERPT_LINE_SEPARATOR);
94+
}
95+
96+
private static final Pattern HTML_PATTERN = Pattern.compile(
97+
"(?is)<(?:!DOCTYPE|/?(?:[a-z][a-z0-9]*))[^>]*>"
98+
);
99+
100+
private static boolean isHtml(String content) {
101+
if (content == null || content.isEmpty()) {
102+
return false;
103+
}
104+
105+
return HTML_PATTERN.matcher(content).find();
106+
}
107+
108+
private static String sanitizeHtml(String html) {
109+
// Remove script tags and their content
110+
String sanitized = html.replaceAll("(?is)<script[^>]*>.*?</script>", "");
111+
112+
// Remove event handlers (onclick, onerror, onload, etc.)
113+
sanitized = sanitized.replaceAll("(?i)\\s+on\\w+\\s*=\\s*['\"][^'\"]*['\"]", "");
114+
sanitized = sanitized.replaceAll("(?i)\\s+on\\w+\\s*=\\s*[^\\s>]+", "");
115+
116+
return sanitized.trim();
84117
}
85118

86119
@NonNull

app/src/test/java/it/niedermann/owncloud/notes/shared/util/NoteUtilTest.java

Lines changed: 0 additions & 107 deletions
This file was deleted.

0 commit comments

Comments
 (0)