aboutsummaryrefslogtreecommitdiff
path: root/src/components
diff options
context:
space:
mode:
Diffstat (limited to 'src/components')
-rw-r--r--src/components/rich_content/rich_content.jsx66
-rw-r--r--src/components/rich_content/rich_content.scss0
-rw-r--r--src/components/status_content/status_content.js6
-rw-r--r--src/components/status_content/status_content.vue14
4 files changed, 76 insertions, 10 deletions
diff --git a/src/components/rich_content/rich_content.jsx b/src/components/rich_content/rich_content.jsx
new file mode 100644
index 00000000..3b29eb4c
--- /dev/null
+++ b/src/components/rich_content/rich_content.jsx
@@ -0,0 +1,66 @@
+import Vue from 'vue'
+import { mapGetters } from 'vuex'
+import { processHtml } from 'src/services/tiny_post_html_processor/tiny_post_html_processor.service.js'
+import { convertHtml, getTagName, processTextForEmoji, getAttrs } from 'src/services/mini_html_converter/mini_html_converter.service.js'
+import { mentionMatchesUrl, extractTagFromUrl } from 'src/services/matcher/matcher.service.js'
+import generateProfileLink from 'src/services/user_profile_link_generator/user_profile_link_generator'
+import StillImage from 'src/components/still-image/still-image.vue'
+
+import './rich_content.scss'
+
+export default Vue.component('RichContent', {
+ name: 'RichContent',
+ props: {
+ html: {
+ required: true,
+ type: String
+ },
+ emoji: {
+ required: true,
+ type: Array
+ }
+ },
+ render (h) {
+ const renderImage = (tag) => {
+ return <StillImage {...{ attrs: getAttrs(tag) }} />
+ }
+ const structure = convertHtml(this.html)
+ const processItem = (item) => {
+ if (typeof item === 'string') {
+ if (item.includes(':')) {
+ return processTextForEmoji(
+ item,
+ this.emoji,
+ ({ shortcode, url }) => {
+ return <StillImage
+ class="emoji"
+ src={url}
+ title={`:${shortcode}:`}
+ alt={`:${shortcode}:`}
+ />
+ }
+ )
+ } else {
+ return item
+ }
+ }
+ if (Array.isArray(item)) {
+ const [opener, children] = item
+ const Tag = getTagName(opener)
+ if (Tag === 'img') {
+ return renderImage(opener)
+ }
+ if (children !== undefined) {
+ return <Tag {...{ attrs: getAttrs(opener) }}>
+ { children.map(processItem) }
+ </Tag>
+ } else {
+ return <Tag/>
+ }
+ }
+ }
+ return <div>
+ { structure.map(processItem) }
+ </div>
+ }
+})
diff --git a/src/components/rich_content/rich_content.scss b/src/components/rich_content/rich_content.scss
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/src/components/rich_content/rich_content.scss
diff --git a/src/components/status_content/status_content.js b/src/components/status_content/status_content.js
index a6f79d76..571f1a78 100644
--- a/src/components/status_content/status_content.js
+++ b/src/components/status_content/status_content.js
@@ -1,6 +1,7 @@
import Attachment from '../attachment/attachment.vue'
import Poll from '../poll/poll.vue'
import Gallery from '../gallery/gallery.vue'
+import RichContent from 'src/components/rich_content/rich_content.jsx'
import LinkPreview from '../link-preview/link-preview.vue'
import generateProfileLink from 'src/services/user_profile_link_generator/user_profile_link_generator'
import fileType from 'src/services/file_type/file_type.service'
@@ -125,7 +126,7 @@ const StatusContent = {
return this.mergedConfig.maxThumbnails
},
postBodyHtml () {
- const html = this.status.statusnet_html
+ const html = this.status.raw_html
if (this.mergedConfig.greentext) {
try {
@@ -164,7 +165,8 @@ const StatusContent = {
Attachment,
Poll,
Gallery,
- LinkPreview
+ LinkPreview,
+ RichContent
},
methods: {
linkClicked (event) {
diff --git a/src/components/status_content/status_content.vue b/src/components/status_content/status_content.vue
index 90bfaf40..c1a78db9 100644
--- a/src/components/status_content/status_content.vue
+++ b/src/components/status_content/status_content.vue
@@ -1,5 +1,4 @@
<template>
- <!-- eslint-disable vue/no-v-html -->
<div class="StatusContent">
<slot name="header" />
<div
@@ -7,11 +6,11 @@
class="summary-wrapper"
:class="{ 'tall-subject': (longSubject && !showingLongSubject) }"
>
- <div
+ <RichContent
class="media-body summary"
@click.prevent="linkClicked"
- v-html="status.summary_html"
- />
+ :html="status.summary_raw_html"
+ :emoji="status.emojis"/>
<button
v-if="longSubject && showingLongSubject"
class="button-unstyled -link tall-subject-hider"
@@ -40,13 +39,13 @@
>
{{ $t("general.show_more") }}
</button>
- <div
+ <RichContent
v-if="!hideSubjectStatus"
:class="{ 'single-line': singleLine }"
class="status-content media-body"
@click.prevent="linkClicked"
- v-html="postBodyHtml"
- />
+ :html="postBodyHtml"
+ :emoji="status.emojis"/>
<button
v-if="hideSubjectStatus"
class="button-unstyled -link cw-status-hider"
@@ -127,7 +126,6 @@
</div>
<slot name="footer" />
</div>
- <!-- eslint-enable vue/no-v-html -->
</template>
<script src="./status_content.js" ></script>