feat: add content processer

This commit is contained in:
Rogee
2024-09-27 17:52:11 +08:00
parent db5db42181
commit 61af5a1f05
2 changed files with 58 additions and 13 deletions

View File

@@ -2,7 +2,8 @@
<div class="mb-4 md:mb-8 border rounded overflow-hidden" :id="`message-${item.ID}`">
<div class="bg-slate-100 p-2 md:p-4">
<div class="mb-2 font-semibold text-right text-gray-400">#{{ item.ID }}</div>
<div v-if="item.Content.length > 0" class="text-wrap font-sans" v-html="processedContent"></div>
<MediaContent :content="item.Content" />
<div v-if="item.Media.length > 0" class="mt-2 md:mt-4">
<div class="medias grid grid-cols-3 gap-2 md:gap-4">
@@ -23,29 +24,20 @@
<script>
import { deleteMessage, toggleFavorite } from "@/services/messages";
import { computed, defineComponent } from "vue";
import { defineComponent } from "vue";
import MediaContent from "./MediaContent.vue";
import MediaItem from "./MediaItem.vue";
function nl2br(str, is_xhtml) {
var breakTag = is_xhtml || typeof is_xhtml === "undefined" ? "<br />" : "<br>";
return (str + "").replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, "$1" + breakTag + "$2");
}
export default defineComponent({
components: {
MediaItem,
MediaContent,
},
name: "ListItem",
props: {
item: { type: Object, required: true },
},
setup(props) {
const processedContent = computed(() => {
let content = props.item.Content.trim();
return nl2br(content, false);
});
const toggleLike = async () => {
const itemId = props.item.ID
await toggleFavorite(itemId);

View File

@@ -0,0 +1,53 @@
<template>
<div v-if="hasContent" class="text-wrap font-sans" v-html="processedContent"></div>
</template>
<script>
import { computed, defineComponent } from "vue";
export default defineComponent({
components: {
},
name: "MediaContent",
props: {
content: { required: true },
},
setup(props) {
const hasContent = () => {
return props.content.trim().length > 0
};
const nl2br = function (content) {
var breakTag = typeof is_xhtml === "undefined" ? "<br />" : "<br>";
return (content + "").replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, "$1" + breakTag + "$2");
}
const replaceTags = (content) => {
content = content.replace(/#(\S+)/g, '<a href="/search?tag=$1">#$1</a>');
return content;
}
const replaceLinks = (content) => {
content = content.replace(/(https?:\/\/\S+)/g, '<a href="$1" target="_blank">$1</a>');
return content;
}
const processedContent = computed(() => {
let content = props.content.trim();
content = nl2br(content, false);
content = replaceTags(content)
content = replaceLinks(content)
return content;
});
return {
hasContent,
processedContent,
};
},
});
</script>