gatsby-source-notion-churnotion 1.0.65 → 1.0.66

Sign up to get free protection for your applications and to get access to all the features.
@@ -139,7 +139,7 @@ const getPages = async ({ databaseId, reporter, getCache, actions, createNode, c
139
139
  });
140
140
  }
141
141
  const bookId = page.properties?.book?.relation?.[0]?.id || null;
142
- const [imageNode, tableOfContents, updatedBlocks] = await (0, processor_1.processor)(pageData.results, actions, getCache, createNodeId, reporter);
142
+ const [imageNode, tableOfContents, updatedBlocks, rawText] = await (0, processor_1.processor)(pageData.results, actions, getCache, createNodeId, reporter);
143
143
  const postNode = {
144
144
  id: nodeId,
145
145
  category: parentCategoryId,
@@ -167,6 +167,7 @@ const getPages = async ({ databaseId, reporter, getCache, actions, createNode, c
167
167
  parent: null,
168
168
  url: `${constants_1.COMMON_URI}/${constants_1.POST_URI}${parentCategoryUrl}/${slug}`,
169
169
  thumbnail: imageNode,
170
+ rawText,
170
171
  };
171
172
  await createNode(postNode);
172
173
  // book과 post 부모-자식 관계 설정
@@ -7,6 +7,7 @@ export declare const NODE_TYPE: {
7
7
  Tag: string;
8
8
  Book: string;
9
9
  Metadata: string;
10
+ RelatedPost: string;
10
11
  };
11
12
  export declare const COMMON_URI = "blog";
12
13
  export declare const POST_URI = "post";
package/dist/constants.js CHANGED
@@ -11,6 +11,7 @@ exports.NODE_TYPE = {
11
11
  Tag: `NTag`,
12
12
  Book: `NBook`,
13
13
  Metadata: `NMetadata`,
14
+ RelatedPost: `RelatedPost`,
14
15
  };
15
16
  ///////////////url resource///////////////////////
16
17
  exports.COMMON_URI = `blog`;
@@ -22,6 +22,7 @@ const createSchemaCustomization = ({ actions }) => {
22
22
  category_list: [${constants_1.NODE_TYPE.Category}]
23
23
  url: String!
24
24
  thumbnail: File @link(by: "id", from: "thumbnail")
25
+ rawText: String!
25
26
  }
26
27
 
27
28
  type ${constants_1.NODE_TYPE.Tag} implements Node {
@@ -61,6 +62,10 @@ const createSchemaCustomization = ({ actions }) => {
61
62
  image: String,
62
63
  url: String,
63
64
  }
65
+
66
+ type ${constants_1.NODE_TYPE.RelatedPost} implements Node {
67
+ posts: [${constants_1.NODE_TYPE.RelatedPost}]
68
+ }
64
69
  `);
65
70
  };
66
71
  exports.createSchemaCustomization = createSchemaCustomization;
@@ -1,4 +1,4 @@
1
1
  export type { IPluginOptions } from "./types";
2
- export { onPluginInit } from "./on-plugin-init";
2
+ export { onPluginInit } from "./onPluginInit";
3
3
  export { sourceNodes } from "./source-nodes";
4
4
  export { createSchemaCustomization } from "./createSchemaCustomization";
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createSchemaCustomization = exports.sourceNodes = exports.onPluginInit = void 0;
4
- var on_plugin_init_1 = require("./on-plugin-init");
5
- Object.defineProperty(exports, "onPluginInit", { enumerable: true, get: function () { return on_plugin_init_1.onPluginInit; } });
4
+ var onPluginInit_1 = require("./onPluginInit");
5
+ Object.defineProperty(exports, "onPluginInit", { enumerable: true, get: function () { return onPluginInit_1.onPluginInit; } });
6
6
  var source_nodes_1 = require("./source-nodes");
7
7
  Object.defineProperty(exports, "sourceNodes", { enumerable: true, get: function () { return source_nodes_1.sourceNodes; } });
8
8
  var createSchemaCustomization_1 = require("./createSchemaCustomization");
@@ -2,6 +2,6 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.onPluginInit = void 0;
4
4
  const onPluginInit = ({ reporter }) => {
5
- reporter.info(`Example plugin loaded...`);
5
+ reporter.info(`Churnotion plugin loaded...`);
6
6
  };
7
7
  exports.onPluginInit = onPluginInit;
File without changes
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ // import { GatsbyNode } from "gatsby";
3
+ // import { TfIdf, TfIdfTerm } from "natural";
4
+ // import { NODE_TYPE } from "./constants";
5
+ // import crypto from "crypto";
6
+ // const md5 = (str: string): string => {
7
+ // const md5 = crypto.createHash("md5");
8
+ // return md5.update(str, "binary").digest("hex");
9
+ // };
10
+ // const getSpaceSeparatedDoc: {
11
+ // [key: string]: (doc: string) => Promise<string[]>;
12
+ // } = {
13
+ // en: async (doc) => {
14
+ // return doc.toLowerCase().split(' ');
15
+ // },
16
+ // ja: async (doc) => {
17
+ // if (kuromoji_tokenizer === null)
18
+ // kuromoji_tokenizer = await getKuromojiTokenizer();
19
+ // return kuromoji_tokenizer
20
+ // .tokenize(doc)
21
+ // .filter(
22
+ // (x) =>
23
+ // x.pos === '名詞' &&
24
+ // ['一般', '固有名詞'].indexOf(x.pos_detail_1) !== -1
25
+ // )
26
+ // .map((x) => (x.basic_form !== '*' ? x.basic_form : x.surface_form));
27
+ // },
28
+ // };
29
+ // export const onPostBootstrap: GatsbyNode["onPostBootstrap"] = async ({
30
+ // actions,
31
+ // getNode,
32
+ // getNodesByType,
33
+ // createNodeId,
34
+ // reporter,
35
+ // cache,
36
+ // }) => {
37
+ // const nodes = getNodesByType(NODE_TYPE.Post);
38
+ // const docs: Record<string, string>[] = nodes.map((node) => ({
39
+ // id: node.id,
40
+ // text: node.rawText as string,
41
+ // }));
42
+ // const tfidf = new TfIdf();
43
+ // for (let doc of docs) {
44
+ // const key = `${md5(doc.text)}-related-post`;
45
+ // const cached_ssd = await cache.get(key);
46
+ // if (cached_ssd !== undefined) {
47
+ // tfidf.addDocument(cached_ssd);
48
+ // continue;
49
+ // }
50
+ // const ssd = await getSpaceSeparatedDoc[option.doc_lang](
51
+ // getTextFromMarkdown(doc.text)
52
+ // );
53
+ // tfidf.addDocument(ssd);
54
+ // await cache.set(key, ssd);
55
+ // }
56
+ // // generate bow vectors
57
+ // type Term = TfIdfTerm & {
58
+ // tf: number;
59
+ // idf: number;
60
+ // };
61
+ // //// extract keywords from each document
62
+ // const doc_terms = docs.map((_, i) =>
63
+ // (tfidf.listTerms(i) as Term[])
64
+ // .map((x) => ({ ...x, tfidf: (x as Term).tf * (x as Term).idf }))
65
+ // .sort((x, y) => y.tfidf - x.tfidf)
66
+ // );
67
+ // // DEBUG: print terms
68
+ // // doc_terms.forEach((x, i) =>
69
+ // // console.log(
70
+ // // docs[i].id,
71
+ // // x.map((x) => x.term)
72
+ // // )
73
+ // //);
74
+ // const all_keywords = new Set<string>();
75
+ // const tfidf_map_for_each_doc: Map<string, number>[] = [];
76
+ // doc_terms.forEach((x, i) => {
77
+ // tfidf_map_for_each_doc[i] = new Map<string, number>();
78
+ // x.slice(0, option.each_bow_size).forEach((x) => {
79
+ // all_keywords.add(x.term);
80
+ // tfidf_map_for_each_doc[i].set(x.term, x.tfidf);
81
+ // });
82
+ // });
83
+ // //// generate vectors
84
+ // const bow_vectors = new Map<string, BowVector>();
85
+ // docs.forEach((x, i) => {
86
+ // if (bow_vectors === null) return;
87
+ // bow_vectors.set(
88
+ // x.id,
89
+ // Array.from(all_keywords)
90
+ // .map((x) => tfidf_map_for_each_doc[i].get(x))
91
+ // .map((x) => (x === undefined ? 0 : x))
92
+ // );
93
+ // });
94
+ // reporter.info(
95
+ // `[related-posts] bow vectors generated, dimention: ${all_keywords.size}`
96
+ // );
97
+ // // create related nodes
98
+ // nodes.forEach((node) => {
99
+ // const related_nodes = getRelatedPosts(node.id, bow_vectors)
100
+ // .slice(1)
101
+ // .map((id) => getNode(id));
102
+ // const digest = `${node.id} >>> related${option.target_node}s`;
103
+ // actions.createNode({
104
+ // id: createNodeId(digest),
105
+ // parent: node.id,
106
+ // internal: {
107
+ // type: `related${option.target_node}s`,
108
+ // contentDigest: digest,
109
+ // },
110
+ // posts: related_nodes,
111
+ // });
112
+ // });
113
+ // };
@@ -4,4 +4,4 @@ export declare const processor: (blocks: BaseContentBlock[], actions: Actions, g
4
4
  type: string;
5
5
  hash: string;
6
6
  title: string;
7
- }[], BaseContentBlock[]]>;
7
+ }[], BaseContentBlock[], string]>;
@@ -5,22 +5,49 @@ const gatsby_source_filesystem_1 = require("gatsby-source-filesystem");
5
5
  const metadataProcessor_1 = require("./metadataProcessor");
6
6
  const tableOfContent_1 = require("./tableOfContent");
7
7
  const processor = async (blocks, actions, getCache, createNodeId, reporter) => {
8
- const { thumbnail, tableOfContents, updatedBlocks } = await processBlocksForContent(blocks, actions, getCache, createNodeId, reporter);
8
+ const { thumbnail, tableOfContents, updatedBlocks, rawText } = await processBlocksForContent(blocks, actions, getCache, createNodeId, reporter);
9
9
  await (0, metadataProcessor_1.processMetadata)(blocks, actions, createNodeId, reporter);
10
- return [thumbnail, tableOfContents, updatedBlocks];
10
+ return [thumbnail, tableOfContents, updatedBlocks, rawText];
11
11
  };
12
12
  exports.processor = processor;
13
13
  const processBlocksForContent = async (blocks, actions, getCache, createNodeId, reporter) => {
14
14
  const tableOfContents = [];
15
15
  let thumbnail = null;
16
+ let rawText = "";
16
17
  const updatedBlocks = (await Promise.all(blocks.map(async (block) => {
17
18
  await (0, tableOfContent_1.processTableOfContents)(block, tableOfContents);
19
+ const plainText = extractPlainText(block);
20
+ if (plainText) {
21
+ rawText += plainText + " ";
22
+ }
18
23
  if (isImageBlock(block)) {
19
- return await processImageBlock(block, actions, getCache, createNodeId, reporter);
24
+ const updatedBlock = await processImageBlock(block, actions, getCache, createNodeId, reporter);
25
+ if (!thumbnail && updatedBlock?.image?.fileId) {
26
+ thumbnail = updatedBlock.image.fileId;
27
+ }
28
+ return updatedBlock;
20
29
  }
21
30
  return block;
22
31
  }))).filter((block) => block !== null);
23
- return { thumbnail, tableOfContents, updatedBlocks };
32
+ return { thumbnail, tableOfContents, updatedBlocks, rawText };
33
+ };
34
+ const isTextContentBlock = (block) => {
35
+ return [
36
+ "paragraph",
37
+ "heading_1",
38
+ "heading_2",
39
+ "heading_3",
40
+ "quote",
41
+ "bulleted_list_item",
42
+ "numbered_list_item",
43
+ ].includes(block.type);
44
+ };
45
+ const extractPlainText = (block) => {
46
+ if (isTextContentBlock(block)) {
47
+ const richTextArray = block[block.type]?.rich_text || [];
48
+ return richTextArray.map((text) => text.plain_text).join(" ");
49
+ }
50
+ return null;
24
51
  };
25
52
  const isImageBlock = (block) => {
26
53
  return block.type === "image" && "image" in block;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "gatsby-source-notion-churnotion",
3
3
  "description": "Gatsby plugin that can connect with One Notion Database RECURSIVELY using official API",
4
- "version": "1.0.65",
4
+ "version": "1.0.66",
5
5
  "skipLibCheck": true,
6
6
  "license": "0BSD",
7
7
  "main": "./dist/gatsby-node.js",
@@ -45,6 +45,7 @@
45
45
  "metascraper-image": "^5.45.27",
46
46
  "metascraper-title": "^5.45.25",
47
47
  "metascraper-url": "^5.45.25",
48
+ "natural": "^8.0.1",
48
49
  "node-fetch": "^3.3.2",
49
50
  "notion-to-md": "^3.1.1",
50
51
  "notion-types": "^7.1.5",
File without changes