diff --git a/gridsome.server.js b/gridsome.server.js index f98c566..c1d8c6b 100644 --- a/gridsome.server.js +++ b/gridsome.server.js @@ -5,6 +5,7 @@ const redditChannels = require("./data/redditChannels"); const podcasts = require("./data/podcasts"); const blogs = require("./data/blogs"); const learningPlatforms = require("./data/learningPlatforms"); +const createSlug = require("./src/utils/slugify"); let id_list = videoTutorials.map((tech) => tech.videoTutorials.map((video) => video.url) @@ -131,8 +132,9 @@ module.exports = function(api) { data.allVideo.edges.forEach(({ node }) => { if (node.category !== "playlist") { + const SLUG_NAME = createSlug(node.name); createPage({ - path: `/video-tutorials/${node.name}/${node.id}`, + path: `/video-tutorials/${SLUG_NAME}/${node.id}`, component: "./src/templates/VideoPage.vue", context: { id: node.id, @@ -149,8 +151,9 @@ module.exports = function(api) { videoTutorials.forEach((category) => { if (category.category !== "playlist") { + const SLUG_NAME = createSlug(category.name); createPage({ - path: `/video-tutorials/${category.name.toLowerCase()}`, + path: `/video-tutorials/${SLUG_NAME}`, component: "./src/templates/TechnologyPage.vue", context: { technology: category.name.toLowerCase(), @@ -161,9 +164,9 @@ module.exports = function(api) { }, }); } else if (category.category === "playlist") { - const PRETTY_PATH = category.name.replace(" ", "-").toLowerCase(); + const SLUG_NAME = createSlug(category.name); createPage({ - path: `/video-tutorials/playlists/${PRETTY_PATH}`, + path: `/video-tutorials/playlists/${SLUG_NAME}`, component: "./src/templates/PlaylistPage.vue", context: { name: category.name.toLowerCase(), diff --git a/src/components/PlaylistCard.vue b/src/components/PlaylistCard.vue index 09e5773..c2f987d 100644 --- a/src/components/PlaylistCard.vue +++ b/src/components/PlaylistCard.vue @@ -2,7 +2,7 @@
diff --git a/src/components/TechCard.vue b/src/components/TechCard.vue index fd302ad..20f71f8 100644 --- a/src/components/TechCard.vue +++ b/src/components/TechCard.vue @@ -4,7 +4,7 @@ >
@@ -56,6 +56,7 @@ import AppIcon from "~/components/UI/AppIcon"; import ExternalIcon from "~/components/UI/ExternalIcon"; import YoutubeIcon from "~/components/UI/YoutubeIcon"; +import createSlug from "~/utils/slugify"; export default { props: { name: String, @@ -82,6 +83,12 @@ export default { "--color-hover": this.color, }; }, + tutorialPath() { + if (!this.name) return '/video-tutorials'; + + const slug = createSlug(this.name); + return `/video-tutorials/${slug}`; + }, }, }; diff --git a/src/components/VideoCard.vue b/src/components/VideoCard.vue index edf7a0c..f7f2e88 100644 --- a/src/components/VideoCard.vue +++ b/src/components/VideoCard.vue @@ -2,7 +2,7 @@
diff --git a/src/templates/TechnologyPage.vue b/src/templates/TechnologyPage.vue index 0e41eda..f6a0f57 100644 --- a/src/templates/TechnologyPage.vue +++ b/src/templates/TechnologyPage.vue @@ -114,6 +114,7 @@ import VideoCard from "~/components/VideoCard"; import PlaylistCard from "~/components/PlaylistCard"; import AppIcon from "~/components/UI/AppIcon"; +import createSlug from "~/utils/slugify"; export default { components: { VideoCard, @@ -160,8 +161,9 @@ export default { if (this.currentPage + 1 > this.$page.videos.pageInfo.totalPages) { $state.complete(); } else { + const slug = createSlug(this.$context.technology); const { data } = await this.$fetch( - `/video-tutorials/${this.$context.technology}/${this.currentPage + 1}` + `/video-tutorials/${slug}/${this.currentPage + 1}` ); if (data.videos.edges.length) { this.currentPage = data.videos.pageInfo.currentPage; diff --git a/src/templates/VideoPage.vue b/src/templates/VideoPage.vue index 66c122c..db193f6 100644 --- a/src/templates/VideoPage.vue +++ b/src/templates/VideoPage.vue @@ -6,7 +6,7 @@ >
import AppLoader from "~/components/UI/AppLoader"; import AppIcon from "~/components/UI/AppIcon"; +import createSlug from "~/utils/slugify"; export default { components: { AppLoader, @@ -88,6 +89,10 @@ export default { direction() { return this.isHebrew ? "rtl" : "ltr"; }, + backPath() { + const slug = createSlug(this.$context.name); + return `video-tutorials/${slug}`; + }, description() { return this.showMore diff --git a/src/utils/slugify.js b/src/utils/slugify.js new file mode 100644 index 0000000..160c86e --- /dev/null +++ b/src/utils/slugify.js @@ -0,0 +1,12 @@ +module.exports = function (name) { + if (!name) return ''; + + return name.toString().toLowerCase() + .replace(/#/g, '-sharp') + .replace(/\+/g, '-plus') + .replace(/\s+/g, '-') + .replace(/[^\w\-]+/g, '') + .replace(/\-\-+/g, '-') + .replace(/^-+/, '') + .replace(/-+$/, ''); +}; \ No newline at end of file