summary refs log tree commit diff
diff options
context:
space:
mode:
authorPatryk Niedźwiedziński <pniedzwiedzinski19@gmail.com>2021-01-10 09:05:43 +0100
committerGitHub <noreply@github.com>2021-01-10 09:05:43 +0100
commitb358a212fda6be6c43eb864979e1c58bd6f5200e (patch)
tree36a0858f99424571bf9fba978a1ae6a3a12af352
parent01f77f86cea0a6b2b7b74b2105720ee7142d6767 (diff)
parent3bbeb33e6df1aac21ec2e92931f4628b992f4013 (diff)
downloadkronikarz-b358a212fda6be6c43eb864979e1c58bd6f5200e.tar.gz
kronikarz-b358a212fda6be6c43eb864979e1c58bd6f5200e.zip
Merge pull request #22 from pniedzwiedzinski/pages v2.3.0
Pages
-rw-r--r--lib/generateApi.ts44
-rw-r--r--package.json2
-rw-r--r--shell.nix (renamed from default.nix)0
-rw-r--r--test/generatePages.spec.ts13
4 files changed, 52 insertions, 7 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/package.json b/package.json
index 1a12e34..09d3705 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "kronikarz",
-  "version": "2.2.0",
+  "version": "2.3.0",
   "description": "System elektronicznej kroniki",
   "main": "dist/index.js",
   "types": "dist/index.d.ts",
diff --git a/default.nix b/shell.nix
index 65e3443..65e3443 100644
--- a/default.nix
+++ b/shell.nix
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);
+  });
+})