summary refs log tree commit diff
diff options
context:
space:
mode:
authorPatryk Niedźwiedziński <pniedzwiedzinski19@gmail.com>2021-01-10 09:02:27 +0100
committerPatryk Niedźwiedziński <pniedzwiedzinski19@gmail.com>2021-01-10 09:02:27 +0100
commit61a831565a49be3daafd4cb523caa1d2823a2b59 (patch)
treea050462496e8cc24ddfb9f2799480c5c9d034af5
parent88c1e8f2621612e146740536b7d82c697b5251a1 (diff)
downloadkronikarz-61a831565a49be3daafd4cb523caa1d2823a2b59.tar.gz
kronikarz-61a831565a49be3daafd4cb523caa1d2823a2b59.zip
Add generatePages
-rw-r--r--lib/generateApi.ts44
-rw-r--r--test/generatePages.spec.ts13
2 files changed, 51 insertions, 6 deletions
diff --git a/lib/generateApi.ts b/lib/generateApi.ts
index 0024d9f..c8b20ce 100644
--- a/lib/generateApi.ts
+++ b/lib/generateApi.ts
@@ -49,21 +49,52 @@ export function saveApiEntry(post: Post, path: string) {
   );
 }
 
+//#Source https://bit.ly/2neWfJ2
+function chunk (arr: Array<Post>, size: number): Array<Array<Post>> {
+  return Array.from({ length: Math.ceil(arr.length / size) }, (v, i) =>
+             arr.slice(i * size, i * size + size)
+            );
+}
+
+function parsePosts(post: Post) {
+  const apiEntry = post.toApi();
+  delete apiEntry.content;
+  return apiEntry;
+}
+
 /*
- * This function generates paged api index on path `/api/posts`
+ * This function generates api index on path `/api/posts`
  */
 function generateApiIndex(posts: Array<Post>, path: string) {
-  const parsedPosts = posts.map((post) => {
-    const apiEntry = post.toApi();
-    delete apiEntry.content;
-    return apiEntry;
-  });
+  const parsedPosts = posts.map(parsePosts);
   const filePath = `${path}/api/posts.json`;
   fs.writeFile(filePath, JSON.stringify(parsedPosts), (err) =>
     err ? console.log(err) : null
   );
 }
 
+/*
+ * This function generates pages on path `/api/page/<number>`
+ */
+function generatePages(posts: Array<Post>, path: string, len: number = 8) {
+  const parsedPosts = posts.map(parsePosts);
+  const pages = chunk(posts, len);
+  mkDirByPathSync(`${path}/api/page`);
+  pages.forEach((posts: Array<Post>, index: number) => {
+    const pageNumber = index + 1;
+    const page = { posts, next : pageNumber + 1 };
+    if (pageNumber == pages.length) {
+      delete page.next;
+    }
+    fs.writeFile(`${path}/api/page/${pageNumber}.json`, JSON.stringify(page), (err) =>
+                 err ? console.log(err) : null
+                );
+  })
+}
+
+
+
+
 function generateCategories(posts: Array<Post>, path: string) {
   const categories: PlainObject = {};
   posts.forEach((post) => {
@@ -92,6 +123,7 @@ export function generateApi(posts: Array<Post>, path: string) {
   try {
     generateApiIndex(posts, path);
     generateCategories(posts, path);
+    generatePages(posts, path);
     posts.forEach((post) => saveApiEntry(post, path));
   } catch (err) {
     console.log(err);
diff --git a/test/generatePages.spec.ts b/test/generatePages.spec.ts
new file mode 100644
index 0000000..2312e48
--- /dev/null
+++ b/test/generatePages.spec.ts
@@ -0,0 +1,13 @@
+import * as fs from "fs";
+import Kronikarz from "../dist";
+
+const k = new Kronikarz(__dirname + "/samples");
+const dir = "./tmp";
+
+test("generate pages", () => {
+  k.generateApi(dir);
+  fs.readFile("./tmp/api/page/1.json", "utf-8", (err, data) => {
+    const page = JSON.parse(data);
+    expect(page.posts.length).toBe(2);
+  });
+})