jekyll-notion 0.1.3 → 0.2.0
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 +4 -4
- data/README.md +55 -16
- data/lib/jekyll-notion/generator.rb +48 -22
- data/lib/jekyll-notion/notion_database.rb +20 -8
- data/lib/jekyll-notion/notion_page.rb +10 -6
- data/lib/jekyll-notion/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: '051289989a623c954ef76ca1299a79a4499649dea4b94dfe49ac75f9a67d4bbc'
|
|
4
|
+
data.tar.gz: 5de9f6860672c7eb8cdc355b5c5af3257fdc476cba3a5d20b4a420f330189f7e
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 211bcfcf58c3d5e0d1e9d684a7a8483e31882e9b2d81df5e8770a24a62ed7c82334d9481a9138dc6c3285fa3e0585facca6f2f68bcbb1b6d769595c5d9051774
|
|
7
|
+
data.tar.gz: 3d5d03c0223c1e891f5ba1102defb082638b67bd9e07cbfc56e2beeadc93e650ed8b2b758543a0a8afe6f8c36a2ad6ca33dd300955fbbc009b7260e509a7e21d
|
data/README.md
CHANGED
|
@@ -32,12 +32,44 @@ 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
39
|
database:
|
|
40
|
-
id:
|
|
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
|
+
notion:
|
|
49
|
+
databases:
|
|
50
|
+
- id: b0e688e1-99af-4295-ae80-b67eb52f2e2f
|
|
51
|
+
- id: 2190450d-4cb3-4739-a5c8-340c4110fe21
|
|
52
|
+
collection: recipes
|
|
53
|
+
- id: e42383cd-4975-4897-b967-ce453760499f
|
|
54
|
+
collection: films
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
When no collection is defined, the `posts` collection is used by default.
|
|
58
|
+
|
|
59
|
+
### Database options
|
|
60
|
+
|
|
61
|
+
Each dabatase support the following options.
|
|
62
|
+
|
|
63
|
+
* `id`: the notion database unique identifier,
|
|
64
|
+
* `collection`: the collection each page belongs to (posts by default),
|
|
65
|
+
* `filter`: the database query filter,
|
|
66
|
+
* `sort`: the database query sort,
|
|
67
|
+
* `frontmatter`: additional front matter to append to each page in the collection.
|
|
68
|
+
|
|
69
|
+
```yml
|
|
70
|
+
notion:
|
|
71
|
+
database:
|
|
72
|
+
id: e42383cd-4975-4897-b967-ce453760499f
|
|
41
73
|
collection: posts
|
|
42
74
|
filter: { "property": "Published", "checkbox": { "equals": true } }
|
|
43
75
|
sort: { "property": "Last ordered", "direction": "ascending" }
|
|
@@ -45,44 +77,51 @@ notion:
|
|
|
45
77
|
layout: post
|
|
46
78
|
```
|
|
47
79
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
* `sort`: the database query sort,
|
|
52
|
-
* `frontmatter`: additional frontmatter to append to each page in the collection.
|
|
80
|
+
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.
|
|
81
|
+
|
|
82
|
+
### Watch
|
|
53
83
|
|
|
54
|
-
|
|
84
|
+
By default, databases are only requested during the first build. Subsequent builds use the results from the cache.
|
|
85
|
+
|
|
86
|
+
Set `fetch_on_watch` to true to allow request on each rebuild.
|
|
87
|
+
|
|
88
|
+
```yml
|
|
89
|
+
notion:
|
|
90
|
+
fetch_on_watch: true
|
|
91
|
+
database:
|
|
92
|
+
id: e42383cd-4975-4897-b967-ce453760499f
|
|
93
|
+
```
|
|
55
94
|
|
|
56
95
|
And that's all. Each page in the notion database will be included in the selected collection.
|
|
57
96
|
|
|
58
97
|
## Notion properties
|
|
59
98
|
|
|
60
|
-
Below,
|
|
99
|
+
Below, default properties per notion page are set for each document front matter.
|
|
61
100
|
|
|
62
|
-
|
|
101
|
+
Notion properties include page `id`, `title`, `created_time`, `last_edited_time`, `icon` and `cover`.
|
|
63
102
|
|
|
64
103
|
```
|
|
65
104
|
---
|
|
66
|
-
id:
|
|
67
|
-
title:
|
|
105
|
+
id: e42383cd-4975-4897-b967-ce453760499f
|
|
106
|
+
title: An amazing post
|
|
68
107
|
cover: https://img.bank.sh/an_image.jpg
|
|
69
108
|
date: 2022-01-23T12:31:00.000Z
|
|
70
109
|
icon: \U0001F4A5
|
|
71
110
|
---
|
|
72
111
|
```
|
|
73
112
|
|
|
74
|
-
|
|
113
|
+
Default properties prevail over custom properties declared in the front matter config.
|
|
75
114
|
|
|
76
115
|
### Custom properties
|
|
77
116
|
|
|
78
117
|
In addition to default properties, custom properties are also supported.
|
|
79
118
|
|
|
80
|
-
Custom properties are appended to page frontmatter by default. Every property name
|
|
119
|
+
Custom properties are appended to the page frontmatter by default. Every property name are downcased and snake-cased.
|
|
81
120
|
For example, two properties named `Multiple Options` and `Tags` will be transformed to `multiple_options` and `tags`, respectively.
|
|
82
121
|
|
|
83
122
|
```
|
|
84
123
|
---
|
|
85
|
-
id:
|
|
124
|
+
id: 2190450d-4cb3-4739-a5c8-340c4110fe21
|
|
86
125
|
title: A title
|
|
87
126
|
cover: https://img.bank.sh/an_image.jpg
|
|
88
127
|
date: 2022-01-23T12:31:00.000Z
|
|
@@ -92,7 +131,7 @@ multiple_options: option1, option2
|
|
|
92
131
|
---
|
|
93
132
|
```
|
|
94
133
|
|
|
95
|
-
The supported
|
|
134
|
+
The supported property types are:
|
|
96
135
|
|
|
97
136
|
* `number`
|
|
98
137
|
* `select`
|
|
@@ -2,29 +2,47 @@
|
|
|
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
|
-
|
|
12
|
+
if fetch_on_watch? || collections.empty?
|
|
13
|
+
read_notion_database
|
|
14
|
+
else
|
|
15
|
+
collections.each_pair { |key, val| @site.collections[key] = val }
|
|
16
|
+
end
|
|
13
17
|
end
|
|
14
18
|
|
|
19
|
+
protected
|
|
20
|
+
|
|
15
21
|
def read_notion_database
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
@
|
|
19
|
-
|
|
20
|
-
|
|
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
|
+
current_collection.docs << make_page
|
|
27
|
+
log_new_page
|
|
28
|
+
end
|
|
29
|
+
# Store current collection
|
|
30
|
+
collections[current_db.collection] = current_collection
|
|
21
31
|
end
|
|
22
32
|
end
|
|
23
33
|
|
|
34
|
+
def databases
|
|
35
|
+
config["databases"] || [config["database"]]
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def collections
|
|
39
|
+
@collections ||= {}
|
|
40
|
+
end
|
|
41
|
+
|
|
24
42
|
def make_page
|
|
25
43
|
new_post = DocumentWithoutAFile.new(
|
|
26
|
-
"#{Dir.pwd}/_#{
|
|
27
|
-
{ :site => @site, :collection =>
|
|
44
|
+
"#{Dir.pwd}/_#{current_db.collection}/#{make_filename}",
|
|
45
|
+
{ :site => @site, :collection => current_collection }
|
|
28
46
|
)
|
|
29
47
|
new_post.content = "#{make_frontmatter}\n\n#{make_md}"
|
|
30
48
|
new_post.read
|
|
@@ -36,7 +54,7 @@ module JekyllNotion
|
|
|
36
54
|
end
|
|
37
55
|
|
|
38
56
|
def make_frontmatter
|
|
39
|
-
data = Jekyll::Utils.deep_merge_hashes(
|
|
57
|
+
data = Jekyll::Utils.deep_merge_hashes(current_db.frontmatter, page_frontmatter)
|
|
40
58
|
frontmatter = data.to_a.map { |k, v| "#{k}: #{v}" }.join("\n")
|
|
41
59
|
<<~CONTENT
|
|
42
60
|
---
|
|
@@ -49,30 +67,27 @@ module JekyllNotion
|
|
|
49
67
|
Jekyll::Utils.deep_merge_hashes(current_page.custom_props, current_page.default_props)
|
|
50
68
|
end
|
|
51
69
|
|
|
52
|
-
def config_frontmatter
|
|
53
|
-
config.dig("database", "frontmatter") || {}
|
|
54
|
-
end
|
|
55
|
-
|
|
56
70
|
def make_filename
|
|
57
|
-
if
|
|
58
|
-
"#{current_page.created_date}-#{current_page.title
|
|
71
|
+
if current_db.collection == "posts"
|
|
72
|
+
"#{current_page.created_date}-#{Jekyll::Utils.slugify(current_page.title,
|
|
73
|
+
:mode => "latin")}.md"
|
|
59
74
|
else
|
|
60
75
|
"#{current_page.title.downcase.parameterize}.md"
|
|
61
76
|
end
|
|
62
77
|
end
|
|
63
78
|
|
|
64
|
-
def
|
|
65
|
-
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
def collection
|
|
69
|
-
@site.collections[collection_name]
|
|
79
|
+
def current_collection
|
|
80
|
+
@site.collections[current_db.collection]
|
|
70
81
|
end
|
|
71
82
|
|
|
72
83
|
def config
|
|
73
84
|
@config ||= @site.config["notion"] || {}
|
|
74
85
|
end
|
|
75
86
|
|
|
87
|
+
def fetch_on_watch?
|
|
88
|
+
config["fetch_on_watch"].present?
|
|
89
|
+
end
|
|
90
|
+
|
|
76
91
|
def notion_token?
|
|
77
92
|
if ENV["NOTION_TOKEN"].nil? || ENV["NOTION_TOKEN"].empty?
|
|
78
93
|
Jekyll.logger.warn("Jekyll Notion:", "NOTION_TOKEN not provided. Cannot read from Notion.")
|
|
@@ -88,5 +103,16 @@ module JekyllNotion
|
|
|
88
103
|
end
|
|
89
104
|
true
|
|
90
105
|
end
|
|
106
|
+
|
|
107
|
+
def log_new_page
|
|
108
|
+
Jekyll.logger.info("Jekyll Notion:", "Page => #{current_page.title}")
|
|
109
|
+
if @site.config.dig(
|
|
110
|
+
"collections", current_db.collection, "output"
|
|
111
|
+
)
|
|
112
|
+
Jekyll.logger.info("",
|
|
113
|
+
"Path => #{current_collection.docs.last.path}")
|
|
114
|
+
end
|
|
115
|
+
Jekyll.logger.debug("", "Props => #{page_frontmatter.keys.inspect}")
|
|
116
|
+
end
|
|
91
117
|
end
|
|
92
118
|
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 =>
|
|
14
|
+
NotionPage.new(:page => page, :layout => layout)
|
|
15
15
|
end
|
|
16
16
|
end
|
|
17
17
|
|
|
18
|
-
private
|
|
19
|
-
|
|
20
18
|
def config
|
|
21
|
-
@config
|
|
19
|
+
@config || {}
|
|
22
20
|
end
|
|
23
21
|
|
|
24
22
|
def filter
|
|
25
|
-
|
|
23
|
+
config["filter"]
|
|
26
24
|
end
|
|
27
25
|
|
|
28
26
|
def sort
|
|
29
|
-
|
|
27
|
+
config["sort"]
|
|
30
28
|
end
|
|
31
29
|
|
|
32
30
|
def id
|
|
33
|
-
|
|
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
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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
|
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.
|
|
4
|
+
version: 0.2.0
|
|
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-
|
|
11
|
+
date: 2022-02-06 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: activesupport
|