gatsby-source-notion-churnotion 1.0.65 → 1.0.66

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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