jekyll-notion 0.1.4 → 0.2.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b38cf8b23326c2c3194070cf8524128f90b479a7f98f7380eaa0f43d1beaa211
4
- data.tar.gz: 359ffd254d24ad6fbc1d3fc5ca4ab389a098fae102577f2ed2ecb9f4b6ee1cb4
3
+ metadata.gz: 1c220aa475033e8ddb50ef928b9104c3b8d5da793bbe777062783eb5fbd1491e
4
+ data.tar.gz: c99b1e1b3cebbc00420d8b857e545fa9ae6ac83aad4da110fabf780a0c42a816
5
5
  SHA512:
6
- metadata.gz: 9c2b17935b8c5512650a1eb5bfa2dddfca7aad405ca3482ec2ae8a5cb2b4157b70df1be10956075c275d4ab839c1c3156366e85c533c64e34c206167204878de
7
- data.tar.gz: 2047c8d35e0713edc09253fb44ecd20bc364a6daa4a21620f9431951b5a41ac7c55c2171441364c3b21e474d1340bef2129612b2069b571930f9797c35d10c06
6
+ metadata.gz: 74c1c36de04d025b121fce5634bfdd739796880208114e1dcdac9f49ec2302b16188f54abb1f8bafc07b3911627a2753e6e6c8d750559384ea9bfb94f1c25cb0
7
+ data.tar.gz: a42ae853c9371cd60ffd6e4cd00cc47e02c9eee64d44579ec1ea88f1e4c0e64208a536cec7bc2fea0c6ab1b6ea00b6dcdde23d5aa1110190b48e7e3b6bceabc3
data/README.md CHANGED
@@ -32,13 +32,48 @@ Export the notion secret token in an environment variable named `NOTION_TOKEN`.
32
32
  $ export NOTION_TOKEN=<secret_...>
33
33
  ```
34
34
 
35
- Once your notion database has been shared, specify the `id` in your `_config.yml` as follows.
35
+ Once your notion database has been shared, specify the database `id` in your `_config.yml` as follows.
36
36
 
37
37
  ```yml
38
38
  notion:
39
- fetch_on_watch: false
40
39
  database:
41
- id: b91d5...
40
+ id: e42383cd-4975-4897-b967-ce453760499f
41
+ ```
42
+
43
+ ### Mutiple dabatases
44
+
45
+ You can also define multiple databases as follows.
46
+
47
+ ```yml
48
+ collections:
49
+ - recipes
50
+ - films
51
+
52
+ notion:
53
+ databases:
54
+ - id: b0e688e1-99af-4295-ae80-b67eb52f2e2f
55
+ - id: 2190450d-4cb3-4739-a5c8-340c4110fe21
56
+ collection: recipes
57
+ - id: e42383cd-4975-4897-b967-ce453760499f
58
+ collection: films
59
+ ```
60
+
61
+ When no collection is defined, the `posts` collection is used by default.
62
+
63
+ ### Database options
64
+
65
+ Each dabatase support the following options.
66
+
67
+ * `id`: the notion database unique identifier,
68
+ * `collection`: the collection each page belongs to (posts by default),
69
+ * `filter`: the database query filter,
70
+ * `sort`: the database query sort,
71
+ * `frontmatter`: additional front matter to append to each page in the collection.
72
+
73
+ ```yml
74
+ notion:
75
+ database:
76
+ id: e42383cd-4975-4897-b967-ce453760499f
42
77
  collection: posts
43
78
  filter: { "property": "Published", "checkbox": { "equals": true } }
44
79
  sort: { "property": "Last ordered", "direction": "ascending" }
@@ -46,47 +81,51 @@ notion:
46
81
  layout: post
47
82
  ```
48
83
 
49
- `fetch_on_watch` when set to `true` it allows fetching notion pages on each rebuild. By default is off, pages are only retrieved in the first build.
84
+ Note that you can also use [front matter defaults](https://jekyllrb.com/docs/configuration/front-matter-defaults/) to declare common key value pairs per collection.
50
85
 
51
- `database` properties are:
52
- * `id`: the notion database unique identifier,
53
- * `collection`: the collection each page belongs to (posts by default),
54
- * `filter`: the database query filter,
55
- * `sort`: the database query sort,
56
- * `frontmatter`: additional frontmatter to append to each page in the collection.
86
+ ### Watch
57
87
 
58
- Note: Only one notion database is available.
88
+ By default, databases are only requested during the first build. Subsequent builds use the results from the cache.
89
+
90
+ Set `fetch_on_watch` to true to allow request on each rebuild.
91
+
92
+ ```yml
93
+ notion:
94
+ fetch_on_watch: true
95
+ database:
96
+ id: e42383cd-4975-4897-b967-ce453760499f
97
+ ```
59
98
 
60
99
  And that's all. Each page in the notion database will be included in the selected collection.
61
100
 
62
101
  ## Notion properties
63
102
 
64
- Below, page notion default properties are set in each page frontmatter.
103
+ Below, default properties per notion page are set for each document front matter.
65
104
 
66
- Default properties include `title`, created_time`, `last_edited_time`, `icon` and `cover.
105
+ Notion properties include page `id`, `title`, `created_time`, `last_edited_time`, `icon` and `cover`.
67
106
 
68
107
  ```
69
108
  ---
70
- id: b2998...
71
- title: A title
109
+ id: e42383cd-4975-4897-b967-ce453760499f
110
+ title: An amazing post
72
111
  cover: https://img.bank.sh/an_image.jpg
73
112
  date: 2022-01-23T12:31:00.000Z
74
113
  icon: \U0001F4A5
75
114
  ---
76
115
  ```
77
116
 
78
- Any property provided in the frontmatter config that matches a default property will be overwritten by the default value.
117
+ Default properties prevail over custom properties declared in the front matter config.
79
118
 
80
119
  ### Custom properties
81
120
 
82
121
  In addition to default properties, custom properties are also supported.
83
122
 
84
- Custom properties are appended to page frontmatter by default. Every property name is snake-cased.
123
+ Custom properties are appended to the page frontmatter by default. Every property name are downcased and snake-cased.
85
124
  For example, two properties named `Multiple Options` and `Tags` will be transformed to `multiple_options` and `tags`, respectively.
86
125
 
87
126
  ```
88
127
  ---
89
- id: b2998...
128
+ id: 2190450d-4cb3-4739-a5c8-340c4110fe21
90
129
  title: A title
91
130
  cover: https://img.bank.sh/an_image.jpg
92
131
  date: 2022-01-23T12:31:00.000Z
@@ -96,7 +135,7 @@ multiple_options: option1, option2
96
135
  ---
97
136
  ```
98
137
 
99
- The supported properties are:
138
+ The supported property types are:
100
139
 
101
140
  * `number`
102
141
  * `select`
@@ -2,50 +2,79 @@
2
2
 
3
3
  module JekyllNotion
4
4
  class Generator < Jekyll::Generator
5
- attr_reader :current_page
5
+ attr_reader :current_page, :current_db
6
6
 
7
7
  def generate(site)
8
8
  @site = site
9
9
 
10
10
  return unless notion_token? && config?
11
11
 
12
- if fetch_on_watch? || docs.empty?
12
+ if fetch_on_watch? || collections.empty?
13
13
  read_notion_database
14
14
  else
15
- collection.docs = docs
15
+ collections.each_pair { |key, val| @site.collections[key] = val }
16
16
  end
17
17
  end
18
18
 
19
+ protected
20
+
19
21
  def read_notion_database
20
- @db = NotionDatabase.new(:config => config)
21
- @db.pages.each do |page|
22
- @current_page = page
23
- collection.docs << make_page
24
- Jekyll.logger.info("Jekyll Notion:", "New notion page at #{collection.docs.last.path}")
22
+ databases.each do |db_config|
23
+ @current_db = NotionDatabase.new(:config => db_config)
24
+ @current_db.pages.each do |page|
25
+ @current_page = page
26
+ next if file_exists?(make_path)
27
+
28
+ current_collection.docs << make_page
29
+ log_new_page
30
+ end
31
+ # Store current collection
32
+ collections[current_db.collection] = current_collection
25
33
  end
26
- @docs = collection.docs
27
34
  end
28
35
 
29
- def docs
30
- @docs ||= []
36
+ def databases
37
+ config["databases"] || [config["database"]]
38
+ end
39
+
40
+ def collections
41
+ @collections ||= {}
42
+ end
43
+
44
+ # Checks if a file already exists in the site source
45
+ def file_exists?(file_path)
46
+ File.exist? @site.in_source_dir(file_path)
31
47
  end
32
48
 
33
49
  def make_page
34
50
  new_post = DocumentWithoutAFile.new(
35
- "#{Dir.pwd}/_#{collection_name}/#{make_filename}",
36
- { :site => @site, :collection => collection }
51
+ make_path,
52
+ { :site => @site, :collection => current_collection }
37
53
  )
38
54
  new_post.content = "#{make_frontmatter}\n\n#{make_md}"
39
55
  new_post.read
40
56
  new_post
41
57
  end
42
58
 
59
+ def make_path
60
+ "_#{current_db.collection}/#{make_filename}"
61
+ end
62
+
63
+ def make_filename
64
+ if current_db.collection == "posts"
65
+ "#{current_page.created_date}-#{Jekyll::Utils.slugify(current_page.title,
66
+ :mode => "latin")}.md"
67
+ else
68
+ "#{current_page.title.downcase.parameterize}.md"
69
+ end
70
+ end
71
+
43
72
  def make_md
44
73
  NotionToMd::Converter.new(:page_id => current_page.id).convert
45
74
  end
46
75
 
47
76
  def make_frontmatter
48
- data = Jekyll::Utils.deep_merge_hashes(config_frontmatter, page_frontmatter)
77
+ data = Jekyll::Utils.deep_merge_hashes(current_db.frontmatter, page_frontmatter)
49
78
  frontmatter = data.to_a.map { |k, v| "#{k}: #{v}" }.join("\n")
50
79
  <<~CONTENT
51
80
  ---
@@ -58,25 +87,8 @@ module JekyllNotion
58
87
  Jekyll::Utils.deep_merge_hashes(current_page.custom_props, current_page.default_props)
59
88
  end
60
89
 
61
- def config_frontmatter
62
- config.dig("database", "frontmatter") || {}
63
- end
64
-
65
- def make_filename
66
- if collection_name == "posts"
67
- "#{current_page.created_date}-#{Jekyll::Utils.slugify(current_page.title,
68
- :mode => "latin")}.md"
69
- else
70
- "#{current_page.title.downcase.parameterize}.md"
71
- end
72
- end
73
-
74
- def collection_name
75
- config.dig("database", "collection") || "posts"
76
- end
77
-
78
- def collection
79
- @site.collections[collection_name]
90
+ def current_collection
91
+ @site.collections[current_db.collection]
80
92
  end
81
93
 
82
94
  def config
@@ -102,5 +114,16 @@ module JekyllNotion
102
114
  end
103
115
  true
104
116
  end
117
+
118
+ def log_new_page
119
+ Jekyll.logger.info("Jekyll Notion:", "Page => #{current_page.title}")
120
+ if @site.config.dig(
121
+ "collections", current_db.collection, "output"
122
+ )
123
+ Jekyll.logger.info("",
124
+ "Path => #{current_collection.docs.last.path}")
125
+ end
126
+ Jekyll.logger.debug("", "Props => #{page_frontmatter.keys.inspect}")
127
+ end
105
128
  end
106
129
  end
@@ -11,28 +11,40 @@ module JekyllNotion
11
11
  return [] unless id?
12
12
 
13
13
  @pages ||= @notion.database_query(query)[:results].map do |page|
14
- NotionPage.new(:page => page, :layout => config["layout"])
14
+ NotionPage.new(:page => page, :layout => layout)
15
15
  end
16
16
  end
17
17
 
18
- private
19
-
20
18
  def config
21
- @config["database"]
19
+ @config || {}
22
20
  end
23
21
 
24
22
  def filter
25
- @config.dig("database", "filter")
23
+ config["filter"]
26
24
  end
27
25
 
28
26
  def sort
29
- @config.dig("database", "sort")
27
+ config["sort"]
30
28
  end
31
29
 
32
30
  def id
33
- @config.dig("database", "id")
31
+ config["id"]
32
+ end
33
+
34
+ def frontmatter
35
+ config["frontmatter"] || {}
36
+ end
37
+
38
+ def collection
39
+ config["collection"] || "posts"
40
+ end
41
+
42
+ def layout
43
+ config["layout"]
34
44
  end
35
45
 
46
+ private
47
+
36
48
  def id?
37
49
  if id.nil? || id.empty?
38
50
  Jekyll.logger.warn("Jekyll Notion:",
@@ -43,7 +55,7 @@ module JekyllNotion
43
55
  end
44
56
 
45
57
  def query
46
- { :id => id, :filter => filter, :sort => sort }
58
+ { :id => id, :filter => filter, :sort => sort }.compact
47
59
  end
48
60
  end
49
61
  end
@@ -61,12 +61,12 @@ module JekyllNotion
61
61
 
62
62
  def default_props
63
63
  @default_props ||= {
64
- :id => id,
65
- :title => title,
66
- :date => created_datetime,
67
- :cover => cover,
68
- :icon => icon,
69
- :updated_date => updated_datetime,
64
+ "id" => id,
65
+ "title" => title,
66
+ "date" => created_datetime,
67
+ "cover" => cover,
68
+ "icon" => icon,
69
+ "updated_date" => updated_datetime,
70
70
  }
71
71
  end
72
72
 
@@ -113,6 +113,10 @@ module JekyllNotion
113
113
  def date(prop)
114
114
  prop.date.start
115
115
  end
116
+
117
+ def url(prop)
118
+ prop.url
119
+ end
116
120
  end
117
121
  end
118
122
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module JekyllNotion
4
- VERSION = "0.1.4"
4
+ VERSION = "0.2.1"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll-notion
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Enrique Arias
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-02-02 00:00:00.000000000 Z
11
+ date: 2022-02-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport