aboutsummaryrefslogtreecommitdiff
path: root/src/mixins
diff options
context:
space:
mode:
Diffstat (limited to 'src/mixins')
-rw-r--r--src/mixins/header.pug12
-rw-r--r--src/mixins/post.pug105
-rw-r--r--src/mixins/postUtils.pug42
3 files changed, 108 insertions, 51 deletions
diff --git a/src/mixins/header.pug b/src/mixins/header.pug
index 9cf1e1a..7d56ff5 100644
--- a/src/mixins/header.pug
+++ b/src/mixins/header.pug
@@ -1,16 +1,18 @@
1mixin header(user) 1mixin header(user)
2 - var viewQuery = 'view=' + (query && query.view ? query.view : 'compact')
3 - var sortQuery = 'sort=' + (query ? (query.sort ? query.sort + (query.t ? '&t=' + query.t : '') : 'hot') : 'hot')
2 div.header 4 div.header
3 div.header-item 5 div.header-item
4 a(href=`/`) home 6 a(href=`/?${sortQuery}&${viewQuery}`) home
5 div.header-item 7 div.header-item
6 a(href=`/r/all`) all 8 a(href=`/r/all?${sortQuery}&${viewQuery}`) all
7 div.header-item 9 div.header-item
8 a(href=`/search`) search 10 a(href=`/search?${sortQuery}&${viewQuery}`) search
9 div.header-item 11 div.header-item
10 a(href=`/subs`) subs 12 a(href=`/subs?${sortQuery}&${viewQuery}`) subs
11 if user 13 if user
12 div.header-item 14 div.header-item
13 a(href='/dashboard') #{user.username} 15 a(href=`/dashboard?${sortQuery}&${viewQuery}`) #{user.username}
14 |  16 | 
15 a(href='/logout') (logout) 17 a(href='/logout') (logout)
16 else 18 else
diff --git a/src/mixins/post.pug b/src/mixins/post.pug
index 74a2b78..4022424 100644
--- a/src/mixins/post.pug
+++ b/src/mixins/post.pug
@@ -2,11 +2,13 @@ include ../utils
2include postUtils 2include postUtils
3mixin post(p, currentUrl) 3mixin post(p, currentUrl)
4 - var from = encodeURIComponent(currentUrl) 4 - var from = encodeURIComponent(currentUrl)
5 - var viewQuery = query && query.view ? query.view : 'compact'
6 - var sortQuery = query && query.sort ? query.sort + (query.t ? '&t=' + query.t : '') : 'hot'
5 article.post 7 article.post
6 div.post-container 8 div.post-container(class=`${query.view}`)
7 div.post-text 9 div.post-text(class=`${query.view}`)
8 div.title-container 10 div.title-container(class=`${query.view}`)
9 a(href=`/comments/${p.id}?from=${from}`) 11 a(class=`${query.view}`, href=`/comments/${p.id}?from=${from}&sort=${sortQuery}&view=${viewQuery}`)
10 != p.title 12 != p.title
11 span.domain (#{p.domain}) 13 span.domain (#{p.domain})
12 div.info-container 14 div.info-container
@@ -18,50 +20,73 @@ mixin post(p, currentUrl)
18 |  ·  20 |  · 
19 | #{timeDifference(Date.now(), p.created * 1000)} 21 | #{timeDifference(Date.now(), p.created * 1000)}
20 |  ·  22 |  · 
21 a(href=`/r/${p.subreddit}`) r/#{p.subreddit} 23 a(href=`/r/${p.subreddit}?sort=${sortQuery}&view=${viewQuery}`) r/#{p.subreddit}
22 |  ·  24 |  · 
23 a(href=`/comments/${p.id}?from=${from}`) #{fmtnum (p.num_comments)} ↩ 25 a(href=`/comments/${p.id}?from=${from}&sort=${sortQuery}&view=${viewQuery}`) #{fmtnum (p.num_comments)} ↩
24 div.media-preview 26 if (query.view == "card" && !isPostGallery(p) && !isPostImage(p) && !isPostVideo(p) && p.selftext_html)
27 div.self-text-overflow(class='card')
28 if query.view == "card" && (p.spoiler || p.over_18)
29 div.spoiler(id=`spoiler_${p.id}`, onclick=`javascript:document.getElementById('spoiler_${p.id}').style.display = 'none';`)
30 h2
31 != p.over_18 ? 'nsfw' : 'spoiler'
32 div.self-text(class='card')
33 != convertInlineImageLinks(p.selftext_html)
34 div.media-preview(class=`${query.view}`)
35 if query.view == "card" && (p.spoiler || p.over_18) && (isPostGallery(p) || isPostImage(p) || isPostVideo(p))
36 div.spoiler(id=`spoiler_${p.id}`, onclick=`javascript:document.getElementById('spoiler_${p.id}').style.display = 'none';`)
37 h2
38 != p.over_18 ? 'nsfw' : 'spoiler'
25 if isPostGallery(p) 39 if isPostGallery(p)
26 - var item = postGalleryItems(p)[0] 40 - var item = postGalleryItems(p)[0]
27 img(src=item.url onclick=`toggleDetails('${p.id}')`) 41 img(src=item.url onclick=`toggleDetails('${p.id}')`)
28 else if isPostImage(p) 42 else if isPostImage(p)
29 - var url = postThumbnail(p) 43 - var url = query.view == "card" ? p.url : postThumbnail(p)
30 img(src=url onclick=`toggleDetails('${p.id}')`) 44 img(src=url onclick=`toggleDetails('${p.id}')`)
31 else if isPostVideo(p) 45 else if isPostVideo(p)
32 - var url = p.secure_media.reddit_video.scrubber_media_url 46 - var decodedVideos = decodePostVideoUrls(p)
33 video(src=url data-dashjs-player width='100px' height='100px' onclick=`toggleDetails('${p.id}')`) 47 if query.view == "card"
48 video(controls="" muted="" data-dashjs-player="" preload="metadata" poster=decodedVideos[4])
49 // HLS
50 source(src=decodedVideos[0])
51 // Dash
52 source(src=decodedVideos[1])
53 // Fallback
54 source(src=decodedVideos[2])
55 else
56 video(autoplay="" muted="" data-dashjs-player="" onclick=`toggleDetails('${p.id}')` width="100px" height="100px")
57 // Scrubber
58 source(src=decodedVideos[3])
34 else if isPostLink(p) 59 else if isPostLink(p)
35 a(href=p.url) 60 a(href=p.url)
61 if (query.view == 'card')
62 | #{p.domain}
36 | ↗ 63 | ↗
37 64
38 if isPostGallery(p) 65 if (isPostGallery(p) || isPostImage(p) || isPostVideo(p))
39 details(id=`${p.id}`) 66 details(id=`${p.id}`,class=`${query.view}`)
40 summary.expand-post expand gallery 67 summary.expand-post expand media
41 div.gallery 68 div.image-viewer(class=`${query.view}`)
42 each item in postGalleryItems(p) 69 if isPostGallery(p)
43 div.gallery-item 70 div.gallery(class=`${query.view}`)
44 div.gallery-item-idx 71 each item in postGalleryItems(p)
45 | #{`${item.idx}/${item.total}`} 72 div.gallery-item(class=`${query.view}`)
46 a(href=`/media/${item.url}`) 73 div.gallery-item-idx(class=`${query.view}`)
47 img(src=item.url loading="lazy") 74 | #{`${item.idx}/${item.total}`}
48 button(onclick=`toggleDetails('${p.id}')`) close 75 a(href=`/media/${item.url}`)
49 else if isPostImage(p) 76 img(src=item.url loading="lazy")
50 details(id=`${p.id}`) 77 else if isPostImage(p)
51 summary.expand-post expand image 78 a(href=`/media/${p.url}`)
52 a(href=`/media/${p.url}`) 79 img(src=p.url loading="lazy").post-media
53 img(src=p.url loading="lazy").post-media 80 else if isPostVideo(p)
54 button(onclick=`toggleDetails('${p.id}')`) close 81 video(controls="" muted="" data-dashjs-player="" preload="metadata" playsinline="" poster=decodedVideos[4] objectfit="contain" loading="lazy").post-media
55 else if isPostVideo(p) 82 //HLS
56 details(id=`${p.id}`) 83 source(src=decodedVideos[0])
57 summary.expand-post expand video 84 // Dash
58 - var url = p.secure_media.reddit_video.dash_url 85 source(src=decodedVideos[1])
59 video(src=url controls data-dashjs-player loading="lazy").post-media 86 // Fallback
60 button(onclick=`toggleDetails('${p.id}')`) close 87 source(src=decodedVideos[2])
61 else if isPostLink(p) 88 button(onclick=`toggleDetails('${p.id}')`,class=`${query.view}`)
62 details(id=`${p.id}`) 89 if (query.view == 'card')
63 summary.expand-post expand link 90 | ╳
64 a(href=`${p.url}`) 91 else
65 | #{p.url} 92 | close
66 br
67 button(onclick=`toggleDetails('${p.id}')`) close
diff --git a/src/mixins/postUtils.pug b/src/mixins/postUtils.pug
index 816adf7..84add09 100644
--- a/src/mixins/postUtils.pug
+++ b/src/mixins/postUtils.pug
@@ -10,14 +10,14 @@
10 } 10 }
11- 11-
12 function postThumbnail(p) { 12 function postThumbnail(p) {
13 if (p.thumbnail == "image" || p.thumbnail == "") { 13 if (p.over_18) {
14 return p.url; 14 return "/nsfw.svg";
15 } else if (p.over_18) {
16 return "/nsfw.svg";
17 } else if (p.thumbnail == "spoiler") { 15 } else if (p.thumbnail == "spoiler") {
18 return "/spoiler.svg"; 16 return "/spoiler.svg";
17 } else if (p.thumbnail == "image" || p.thumbnail == "") {
18 return p.url;
19 } else { 19 } else {
20 return p.thumbnail; 20 return p.thumbnail;
21 } 21 }
22 } 22 }
23- 23-
@@ -51,3 +51,33 @@
51 return null; 51 return null;
52 } 52 }
53 } 53 }
54-
55 function convertInlineImageLinks(html) {
56 // Find all anchors that href to https://preview.redd.it
57 const expression = /<a href="https:\/\/preview\.redd\.it.*?">(.*?)<\/a>/g;
58 const matches = html.matchAll(expression);
59 var result = html;
60 matches.forEach((match) => {
61 // Replace each occurrence with an actual img tag
62 result = result.replace(match[0], '<a href="' + match[1] + '"><img src="' + match[1] + '"></a>');
63 })
64
65 return result;
66 }
67-
68 function decodePostVideoUrls(p) {
69 // Video URLs have querystring separators that are HTML-encoded, so replace them.
70 const expression = /&amp;/g;
71
72 var hls_url = p.secure_media && p.secure_media.reddit_video && p.secure_media.reddit_video.hls_url ? p.secure_media.reddit_video.hls_url.replace(expression, '&') : '';
73
74 var dash_url = p.secure_media && p.secure_media.reddit_video && p.secure_media.reddit_video.dash_url ? p.secure_media.reddit_video.dash_url.replace(expression, '&') : '';
75
76 var fallback_url = p.secure_media && p.secure_media.reddit_video && p.secure_media.reddit_video.fallback_url ? p.secure_media.reddit_video.fallback_url.replace(expression, '&') : '';
77
78 var scrubber_url = p.secure_media && p.secure_media.reddit_video && p.secure_media.reddit_video.scrubber_media_url ? p.secure_media.reddit_video.scrubber_media_url.replace(expression, '&') : '';
79
80 var poster_url = p.preview && p.preview.images ? p.preview.images[0].source.url.replace(expression, '&') : '';
81
82 return [hls_url, dash_url, fallback_url, scrubber_url, poster_url];
83 } \ No newline at end of file