diff --git a/src/components/Breadcrumbs.astro b/src/components/Breadcrumbs.astro
index 951391e17..e8841a18c 100644
--- a/src/components/Breadcrumbs.astro
+++ b/src/components/Breadcrumbs.astro
@@ -12,8 +12,6 @@ const { breadcrumbs, roadmapId } = Astro.props;
- Roadmaps
- ·
{ breadcrumbs.map((breadcrumb, counter) => {
const isLast = counter === breadcrumbs.length - 1;
diff --git a/src/lib/topic.ts b/src/lib/topic.ts
index cc6969b0b..c95662a83 100644
--- a/src/lib/topic.ts
+++ b/src/lib/topic.ts
@@ -80,6 +80,7 @@ export interface TopicFileContentType {
export interface TopicFileType {
url: string;
+ text: string;
file: TopicFileContentType;
roadmap: RoadmapFrontmatter;
roadmapId: string;
@@ -101,9 +102,8 @@ export async function getTopicFiles(): Promise> {
const fileHeadings = fileContent.getHeadings();
const firstHeading = fileHeadings[0];
- const [, roadmapId, pathInsideContent] =
+ const [, roadmapId] =
filePath.match(/^\/src\/roadmaps\/(.+)?\/content\/(.+)?$/) || [];
-
const topicUrl = generateTopicUrl(filePath);
const currentRoadmap = await import(
@@ -112,6 +112,7 @@ export async function getTopicFiles(): Promise> {
mapping[topicUrl] = {
url: topicUrl,
+ text: firstHeading?.text,
file: fileContent,
roadmap: currentRoadmap.frontmatter,
roadmapId: roadmapId,
@@ -130,6 +131,10 @@ export async function getTopicFiles(): Promise> {
// Breadcrumbs for the file
const breadcrumbs: BreadcrumbItem[] = [
+ {
+ title: 'Roadmaps',
+ url: '/roadmaps',
+ },
{
title: currentRoadmap.featuredTitle,
url: `${roadmapUrl}`,
@@ -146,3 +151,17 @@ export async function getTopicFiles(): Promise> {
return mapping;
}
+
+/**
+ * Gets the the topics for a given roadmap
+ * @param roadmapId Roadmap id for which you want the topics
+ * @returns Promise
+ */
+export async function getTopicsByRoadmapId(roadmapId: string): Promise {
+ const topicFileMapping = await getTopicFiles();
+ const allTopics = Object.values(topicFileMapping);
+
+ return Object.values(allTopics).filter(
+ (topic) => topic.roadmapId === roadmapId
+ );
+}
\ No newline at end of file
diff --git a/src/pages/[roadmapId].astro b/src/pages/[roadmapId].astro
deleted file mode 100644
index f34ce91a4..000000000
--- a/src/pages/[roadmapId].astro
+++ /dev/null
@@ -1,47 +0,0 @@
----
-import InteractiveRoadamp from "../components/InteractiveRoadmap/InteractiveRoadmap.astro";
-import MarkdownRoadmap from "../components/MarkdownRoadmap.astro";
-import RoadmapHeader from "../components/RoadmapHeader.astro";
-import BaseLayout from "../layouts/BaseLayout.astro";
-import { getRoadmapIds, RoadmapFrontmatter } from "../lib/roadmap";
-
-export async function getStaticPaths() {
- const roadmapIds = await getRoadmapIds();
-
- return roadmapIds.map((roadmapId) => ({
- params: { roadmapId },
- }));
-}
-
-interface Params extends Record {
- roadmapId: string;
-}
-
-const { roadmapId } = Astro.params as Params;
-const file = await import(`../roadmaps/${roadmapId}/${roadmapId}.md`);
-const frontmatter = file.frontmatter as RoadmapFrontmatter;
----
-
-
-
-
- {
- frontmatter.jsonUrl && (
-
- )
- }
-
-
-
-
-
diff --git a/src/pages/[roadmapId]/index.astro b/src/pages/[roadmapId]/index.astro
new file mode 100644
index 000000000..a4db75e32
--- /dev/null
+++ b/src/pages/[roadmapId]/index.astro
@@ -0,0 +1,47 @@
+---
+import InteractiveRoadamp from '../../components/InteractiveRoadmap/InteractiveRoadmap.astro';
+import MarkdownRoadmap from '../../components/MarkdownRoadmap.astro';
+import RoadmapHeader from '../../components/RoadmapHeader.astro';
+import BaseLayout from '../../layouts/BaseLayout.astro';
+import { getRoadmapIds, RoadmapFrontmatter } from '../../lib/roadmap';
+
+export async function getStaticPaths() {
+ const roadmapIds = await getRoadmapIds();
+
+ return roadmapIds.map((roadmapId) => ({
+ params: { roadmapId },
+ }));
+}
+
+interface Params extends Record {
+ roadmapId: string;
+}
+
+const { roadmapId } = Astro.params as Params;
+const roadmapFile = await import(`../../roadmaps/${roadmapId}/${roadmapId}.md`);
+const roadmapData = roadmapFile.frontmatter as RoadmapFrontmatter;
+---
+
+
+
+
+ {
+ roadmapData.jsonUrl && (
+
+ )
+ }
+
+
+
+
+
diff --git a/src/pages/[roadmapId]/topics.astro b/src/pages/[roadmapId]/topics.astro
new file mode 100644
index 000000000..f2091270d
--- /dev/null
+++ b/src/pages/[roadmapId]/topics.astro
@@ -0,0 +1,66 @@
+---
+import RoadmapHeader from '../../components/RoadmapHeader.astro';
+import BaseLayout from '../../layouts/BaseLayout.astro';
+import { getRoadmapIds, RoadmapFrontmatter } from '../../lib/roadmap';
+import { getTopicsByRoadmapId } from '../../lib/topic';
+
+interface Params extends Record {
+ roadmapId: string;
+}
+
+export async function getStaticPaths() {
+ const roadmapIds = await getRoadmapIds();
+
+ return roadmapIds.map((roadmapId) => ({
+ params: { roadmapId },
+ }));
+}
+
+const { roadmapId } = Astro.params as Params;
+const topics = await getTopicsByRoadmapId(roadmapId);
+const roadmapFile = await import(`../../roadmaps/${roadmapId}/${roadmapId}.md`);
+const roadmapData = roadmapFile.frontmatter as RoadmapFrontmatter;
+---
+
+
+
+
+
+
+ {
+ topics.map((topic) => {
+ // Breadcrumbs have three additional items e.g.
+ //
+ // Roadmaps / Frontend / Topics / Internet / HTTP
+ // ---^----------^---------^----
+ //
+ // Subtracting 3 to get the total parent count
+ const totalParentCount = topic.breadcrumbs.length - 3;
+
+ return (
+
+ {topic.text}
+
+ );
+ })
+ }
+
+
+