diff --git a/css/components/rant.css b/css/components/rant.css
index a510d26..50d21d0 100644
--- a/css/components/rant.css
+++ b/css/components/rant.css
@@ -24,6 +24,11 @@ rant-content {
.content-text a {
color: var(--color-link);
+ text-decoration: none;
+}
+
+.content-text a:hover {
+ text-decoration: underline;
}
.content-text code {
diff --git a/js/components/comment-item.js b/js/components/comment-item.js
index a2a04f4..b2c1d12 100644
--- a/js/components/comment-item.js
+++ b/js/components/comment-item.js
@@ -91,6 +91,13 @@ class CommentItem extends BaseComponent {
`);
+
+ if (comment.links && comment.links.length > 0) {
+ const rantContent = this.$('rant-content');
+ if (rantContent) {
+ rantContent.setLinks(comment.links);
+ }
+ }
}
escapeAttr(str) {
diff --git a/js/components/rant-card.js b/js/components/rant-card.js
index eef6808..0a500a3 100644
--- a/js/components/rant-card.js
+++ b/js/components/rant-card.js
@@ -87,6 +87,13 @@ class RantCard extends BaseComponent {
`);
+
+ if (rant.links && rant.links.length > 0) {
+ const rantContent = this.$('rant-content');
+ if (rantContent) {
+ rantContent.setLinks(rant.links);
+ }
+ }
}
escapeAttr(str) {
diff --git a/js/components/rant-content.js b/js/components/rant-content.js
index 986922b..6b933e8 100644
--- a/js/components/rant-content.js
+++ b/js/components/rant-content.js
@@ -6,37 +6,59 @@
*/
import { BaseComponent } from './base-component.js';
-import { markdownRenderer } from '../utils/markdown.js';
-import { extractImageUrls, extractYoutubeUrls, extractNonMediaUrls } from '../utils/url.js';
+import { categorizeLinks, processTextWithLinks, extractImageUrls, extractYoutubeUrls, extractNonMediaUrls, sanitizeUrl } from '../utils/url.js';
class RantContent extends BaseComponent {
static get observedAttributes() {
- return ['text'];
+ return ['text', 'links'];
}
init() {
+ this.linksData = null;
+ this.render();
+ }
+
+ setLinks(links) {
+ this.linksData = links;
this.render();
}
render() {
const text = this.getAttr('text') || '';
+ const linksAttr = this.getAttr('links');
+ const links = this.linksData || (linksAttr ? JSON.parse(linksAttr) : null);
this.addClass('rant-content');
- const images = extractImageUrls(text);
- const youtubeLinks = extractYoutubeUrls(text);
- const otherLinks = extractNonMediaUrls(text);
+ let images = [];
+ let youtubeLinks = [];
+ let otherLinks = [];
+ let renderedText = '';
- const renderedText = markdownRenderer.render(text);
+ if (links && links.length > 0) {
+ const categorized = categorizeLinks(links);
+ images = categorized.images.map(l => l.url);
+ youtubeLinks = categorized.youtube.map(l => l.url);
+ otherLinks = categorized.other;
+ renderedText = processTextWithLinks(text, links);
+ renderedText = renderedText.replace(/\n/g, '
');
+ } else {
+ images = extractImageUrls(text);
+ youtubeLinks = extractYoutubeUrls(text);
+ const extractedOther = extractNonMediaUrls(text);
+ otherLinks = extractedOther.map(url => ({ url, title: url }));
+ renderedText = this.escapeHtml(text).replace(/\n/g, '
');
+ }
let html = `