feat(top-tags): surface top tags and genres across relevant views
This commit is contained in:
parent
e133fd959d
commit
4f15e88074
10 changed files with 94 additions and 9 deletions
14
package-lock.json
generated
14
package-lock.json
generated
|
@ -1,12 +1,12 @@
|
||||||
{
|
{
|
||||||
"name": "coryd.dev",
|
"name": "coryd.dev",
|
||||||
"version": "5.0.1",
|
"version": "5.1.2",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "coryd.dev",
|
"name": "coryd.dev",
|
||||||
"version": "5.0.1",
|
"version": "5.1.2",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"html-minifier-terser": "7.2.0",
|
"html-minifier-terser": "7.2.0",
|
||||||
|
@ -31,7 +31,7 @@
|
||||||
"postcss-import": "^16.1.0",
|
"postcss-import": "^16.1.0",
|
||||||
"postcss-import-ext-glob": "^2.1.1",
|
"postcss-import-ext-glob": "^2.1.1",
|
||||||
"rimraf": "^6.0.1",
|
"rimraf": "^6.0.1",
|
||||||
"terser": "^5.39.1",
|
"terser": "^5.39.2",
|
||||||
"truncate-html": "^1.2.1"
|
"truncate-html": "^1.2.1"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
|
@ -4486,13 +4486,13 @@
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/terser": {
|
"node_modules/terser": {
|
||||||
"version": "5.39.1",
|
"version": "5.39.2",
|
||||||
"resolved": "https://registry.npmjs.org/terser/-/terser-5.39.1.tgz",
|
"resolved": "https://registry.npmjs.org/terser/-/terser-5.39.2.tgz",
|
||||||
"integrity": "sha512-Mm6+uad0ZuDtcV8/4uOZQDQ8RuiC5Pu+iZRedJtF7yA/27sPL7d++In/AJKpWZlU3SYMPPkVfwetn6sgZ66pUA==",
|
"integrity": "sha512-yEPUmWve+VA78bI71BW70Dh0TuV4HHd+I5SHOAfS1+QBOmvmCiiffgjR8ryyEd3KIfvPGFqoADt8LdQ6XpXIvg==",
|
||||||
"license": "BSD-2-Clause",
|
"license": "BSD-2-Clause",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@jridgewell/source-map": "^0.3.3",
|
"@jridgewell/source-map": "^0.3.3",
|
||||||
"acorn": "^8.8.2",
|
"acorn": "^8.14.0",
|
||||||
"commander": "^2.20.0",
|
"commander": "^2.20.0",
|
||||||
"source-map-support": "~0.5.20"
|
"source-map-support": "~0.5.20"
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "coryd.dev",
|
"name": "coryd.dev",
|
||||||
"version": "5.0.2",
|
"version": "5.1.2",
|
||||||
"description": "The source for my personal site. Built using 11ty (and other tools).",
|
"description": "The source for my personal site. Built using 11ty (and other tools).",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"engines": {
|
"engines": {
|
||||||
|
@ -54,7 +54,7 @@
|
||||||
"postcss-import": "^16.1.0",
|
"postcss-import": "^16.1.0",
|
||||||
"postcss-import-ext-glob": "^2.1.1",
|
"postcss-import-ext-glob": "^2.1.1",
|
||||||
"rimraf": "^6.0.1",
|
"rimraf": "^6.0.1",
|
||||||
"terser": "^5.39.1",
|
"terser": "^5.39.2",
|
||||||
"truncate-html": "^1.2.1"
|
"truncate-html": "^1.2.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
37
queries/functions/get_top_tags.sql
Normal file
37
queries/functions/get_top_tags.sql
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
CREATE OR REPLACE FUNCTION get_top_tag_groups()
|
||||||
|
RETURNS JSON AS $$
|
||||||
|
BEGIN
|
||||||
|
RETURN json_build_object(
|
||||||
|
'tags', (
|
||||||
|
SELECT json_agg(t) FROM (
|
||||||
|
SELECT tag, COUNT(*) AS usage_count
|
||||||
|
FROM optimized_tagged_content
|
||||||
|
WHERE type IN ('article', 'link')
|
||||||
|
GROUP BY tag
|
||||||
|
ORDER BY usage_count DESC
|
||||||
|
LIMIT 10
|
||||||
|
) t
|
||||||
|
),
|
||||||
|
'watching_genres', (
|
||||||
|
SELECT json_agg(t) FROM (
|
||||||
|
SELECT tag, COUNT(*) AS usage_count
|
||||||
|
FROM optimized_tagged_content
|
||||||
|
WHERE type IN ('tv', 'movies')
|
||||||
|
GROUP BY tag
|
||||||
|
ORDER BY usage_count DESC
|
||||||
|
LIMIT 10
|
||||||
|
) t
|
||||||
|
),
|
||||||
|
'books_genres', (
|
||||||
|
SELECT json_agg(t) FROM (
|
||||||
|
SELECT tag, COUNT(*) AS usage_count
|
||||||
|
FROM optimized_tagged_content
|
||||||
|
WHERE type = 'books'
|
||||||
|
GROUP BY tag
|
||||||
|
ORDER BY usage_count DESC
|
||||||
|
LIMIT 10
|
||||||
|
) t
|
||||||
|
)
|
||||||
|
);
|
||||||
|
END;
|
||||||
|
$$ LANGUAGE plpgsql STABLE;
|
27
src/data/topTags.js
Normal file
27
src/data/topTags.js
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
import EleventyFetch from "@11ty/eleventy-fetch";
|
||||||
|
|
||||||
|
const { POSTGREST_URL, POSTGREST_API_KEY } = process.env;
|
||||||
|
|
||||||
|
const fetchTopTags = async () => {
|
||||||
|
try {
|
||||||
|
return await EleventyFetch(`${POSTGREST_URL}/rpc/get_top_tag_groups`, {
|
||||||
|
duration: "1h",
|
||||||
|
type: "json",
|
||||||
|
fetchOptions: {
|
||||||
|
method: "POST",
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
Authorization: `Bearer ${POSTGREST_API_KEY}`,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
console.error("Error fetching top tag entries:", error);
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export default async function () {
|
||||||
|
console.log(await fetchTopTags())
|
||||||
|
return await fetchTopTags();
|
||||||
|
}
|
1
src/includes/blocks/top-tags.liquid
Normal file
1
src/includes/blocks/top-tags.liquid
Normal file
|
@ -0,0 +1 @@
|
||||||
|
<p><mark>{{ label }}</mark>{%- for tag in tags %} <a href="/tags/{{ tag.tag }}">#{{ tag.tag }}</a>{%- endfor -%}</p>
|
|
@ -10,6 +10,10 @@ updated: "now"
|
||||||
{%- assign currentBookCount = books.currentYear | size -%}
|
{%- assign currentBookCount = books.currentYear | size -%}
|
||||||
<h2 class="page-title">Currently reading</h2>
|
<h2 class="page-title">Currently reading</h2>
|
||||||
<p>Here's what I'm reading at the moment. I've finished <mark>{{ currentBookCount }} books</mark> this year. I've read <mark>{{ books.daysRead }}</mark> days in a row and counting.</p>
|
<p>Here's what I'm reading at the moment. I've finished <mark>{{ currentBookCount }} books</mark> this year. I've read <mark>{{ books.daysRead }}</mark> days in a row and counting.</p>
|
||||||
|
{% render "blocks/top-tags.liquid"
|
||||||
|
label:"Top genres"
|
||||||
|
tags:topTags.books_genres
|
||||||
|
%}
|
||||||
<p class="book-years">{{ books.years | bookYearLinks }}</p>
|
<p class="book-years">{{ books.years | bookYearLinks }}</p>
|
||||||
{% render "blocks/banners/rss.liquid",
|
{% render "blocks/banners/rss.liquid",
|
||||||
url: "/feeds/books.xml",
|
url: "/feeds/books.xml",
|
||||||
|
|
|
@ -15,6 +15,10 @@ updated: "now"
|
||||||
%}
|
%}
|
||||||
<p>Here's all of the TV and movies I've been watching presented in what is (hopefully) an organized fashion.</p>
|
<p>Here's all of the TV and movies I've been watching presented in what is (hopefully) an organized fashion.</p>
|
||||||
<p><a href="/watching/shows/upcoming">You can see all of the shows I've got queued up here.</a></p>
|
<p><a href="/watching/shows/upcoming">You can see all of the shows I've got queued up here.</a></p>
|
||||||
|
{% render "blocks/top-tags.liquid"
|
||||||
|
label:"Top genres"
|
||||||
|
tags:topTags.watching_genres
|
||||||
|
%}
|
||||||
{% render "blocks/banners/rss.liquid",
|
{% render "blocks/banners/rss.liquid",
|
||||||
url: "/feeds/movies.xml",
|
url: "/feeds/movies.xml",
|
||||||
text: "Subscribe to my movies feed or follow along on this page"
|
text: "Subscribe to my movies feed or follow along on this page"
|
||||||
|
|
|
@ -9,6 +9,10 @@ permalink: "/links/{% if pagination.pageNumber > 0 %}{{ pagination.pageNumber }}
|
||||||
{% if pagination.pageNumber == 0 %}
|
{% if pagination.pageNumber == 0 %}
|
||||||
<h2 class="page-title">Links</h2>
|
<h2 class="page-title">Links</h2>
|
||||||
<p>These are links I've liked or otherwise found interesting. They're all added manually, after having been read and, I suppose, properly considered.</p>
|
<p>These are links I've liked or otherwise found interesting. They're all added manually, after having been read and, I suppose, properly considered.</p>
|
||||||
|
{% render "blocks/top-tags.liquid"
|
||||||
|
label:"Top tags"
|
||||||
|
tags:topTags.tags
|
||||||
|
%}
|
||||||
{% render "blocks/banners/rss.liquid",
|
{% render "blocks/banners/rss.liquid",
|
||||||
url: "/feeds/links.xml",
|
url: "/feeds/links.xml",
|
||||||
text: "Subscribe to my links feed or follow along on this page"
|
text: "Subscribe to my links feed or follow along on this page"
|
||||||
|
|
|
@ -9,6 +9,10 @@ permalink: "/posts/{% if pagination.pageNumber > 0 %}{{ pagination.pageNumber }}
|
||||||
<h2 class="page-title">Posts</h2>
|
<h2 class="page-title">Posts</h2>
|
||||||
<p>These are all of my blog posts on this site (I like some more than others).</p>
|
<p>These are all of my blog posts on this site (I like some more than others).</p>
|
||||||
<p>I tend to write about whatever strikes me, with a focus on development, technology, automation or issues I run into with these things. This is all typically light on editing with and heavy on spur of the moment thoughts.</p>
|
<p>I tend to write about whatever strikes me, with a focus on development, technology, automation or issues I run into with these things. This is all typically light on editing with and heavy on spur of the moment thoughts.</p>
|
||||||
|
{% render "blocks/top-tags.liquid"
|
||||||
|
label:"Top tags"
|
||||||
|
tags:topTags.tags
|
||||||
|
%}
|
||||||
{% render "blocks/banners/rss.liquid",
|
{% render "blocks/banners/rss.liquid",
|
||||||
url: "/feeds/posts.xml",
|
url: "/feeds/posts.xml",
|
||||||
text: "Subscribe to my posts feed or follow along on this page"
|
text: "Subscribe to my posts feed or follow along on this page"
|
||||||
|
|
|
@ -6,6 +6,10 @@ description: Search through posts and other content on my site.
|
||||||
|
|
||||||
<h2 class="page-title">Search</h2>
|
<h2 class="page-title">Search</h2>
|
||||||
<p>You can find <a href="/posts">posts</a>, <a href="/links">links</a>, <a href="/music/#artists">artists</a>, genres, <a href="/watching#movies">movies</a>, <a href="/watching#tv">shows</a> and <a href="/books">books</a> via the field below (though it only surfaces movies and shows I've watched and books I've written something about). <a href="/tags">You can also browse my tags list</a>.</p>
|
<p>You can find <a href="/posts">posts</a>, <a href="/links">links</a>, <a href="/music/#artists">artists</a>, genres, <a href="/watching#movies">movies</a>, <a href="/watching#tv">shows</a> and <a href="/books">books</a> via the field below (though it only surfaces movies and shows I've watched and books I've written something about). <a href="/tags">You can also browse my tags list</a>.</p>
|
||||||
|
{% render "blocks/top-tags.liquid"
|
||||||
|
label:"Top tags"
|
||||||
|
tags:topTags.tags
|
||||||
|
%}
|
||||||
<noscript>
|
<noscript>
|
||||||
<p><mark>If you're seeing this it means that you've (quite likely) disabled JavaScript (that's a totally valid choice!).</mark> You can search for anything on my site using the form below, but your query will be routed through <a href="https://duckduckgo.com">DuckDuckGo</a>.</p>
|
<p><mark>If you're seeing this it means that you've (quite likely) disabled JavaScript (that's a totally valid choice!).</mark> You can search for anything on my site using the form below, but your query will be routed through <a href="https://duckduckgo.com">DuckDuckGo</a>.</p>
|
||||||
<p><mark>Type something in and hit enter.</mark></p>
|
<p><mark>Type something in and hit enter.</mark></p>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue