jekyll-notion 1.1.1 → 2.1.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 +80 -33
- data/lib/jekyll-notion/abstract_notion_resource.rb +41 -0
- data/lib/jekyll-notion/factories/database_factory.rb +14 -0
- data/lib/jekyll-notion/factories/page_factory.rb +14 -0
- data/lib/jekyll-notion/generator.rb +25 -8
- data/lib/jekyll-notion/generators/abstract_generator.rb +15 -0
- data/lib/jekyll-notion/{collection_generator.rb → generators/collection_generator.rb} +7 -7
- data/lib/jekyll-notion/generators/data_generator.rb +59 -0
- data/lib/jekyll-notion/generators/page_generator.rb +30 -0
- data/lib/jekyll-notion/notion_database.rb +13 -31
- data/lib/jekyll-notion/notion_page.rb +21 -0
- data/lib/jekyll-notion/page_without_a_file.rb +32 -0
- data/lib/jekyll-notion/version.rb +1 -1
- data/lib/jekyll-notion.rb +9 -4
- metadata +16 -12
- data/lib/jekyll-notion/abstract_generator.rb +0 -15
- data/lib/jekyll-notion/data_generator.rb +0 -25
- data/lib/jekyll-notion/generator_factory.rb +0 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d730d8b3c38a4857f9a506b6219aeba97b31f9257fb6c6ecfefe5fe2c30e921c
|
4
|
+
data.tar.gz: 7ce7ce2738857027a3b2f48fc5b237b1e4725963d9a2a5273a12c92ba41477f0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cc4d474362dd91a1308a917654d725151877f81f348c768211aa272a265233e3af82119d47e75209e3aaeb205207a15a325a8795e18d2a4fd8c27ead79f947d8
|
7
|
+
data.tar.gz: bcf4276e64b3d2176a015b8ab81ced2d4f4e3cc2e8a2755f4a54502d1b0b28c6d43ca234b55d55765572d7c36ee69986f132475c4c200a052c2b0171538cf72a
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# jekyll-notion
|
2
2
|
|
3
|
-
Import notion pages to
|
3
|
+
Import notion pages to jekyll.
|
4
4
|
|
5
5
|
## Installation
|
6
6
|
|
@@ -22,29 +22,29 @@ plugins:
|
|
22
22
|
- jekyll-notion
|
23
23
|
```
|
24
24
|
|
25
|
-
##
|
25
|
+
## Usage
|
26
26
|
|
27
27
|
Before using the gem create an integration and generate a secret token. Check [notion getting started guide](https://developers.notion.com/docs/getting-started) to learn more.
|
28
28
|
|
29
|
-
|
29
|
+
Once you have youe secret, export it in an environment variable named `NOTION_TOKEN`.
|
30
30
|
|
31
31
|
```bash
|
32
32
|
$ export NOTION_TOKEN=<secret_...>
|
33
33
|
```
|
34
34
|
|
35
|
-
|
35
|
+
### Databases
|
36
|
+
|
37
|
+
Once your [notion database](https://www.notion.so/help/intro-to-databases) has been shared, specify the database `id` in your `_config.yml` as follows.
|
36
38
|
|
37
39
|
```yml
|
38
40
|
notion:
|
39
41
|
database:
|
40
|
-
id:
|
42
|
+
id: 5cfed4de3bdc4f43ae8ba653a7a2219b
|
41
43
|
```
|
42
44
|
|
43
|
-
|
44
|
-
|
45
|
-
### Mutiple dabatases
|
45
|
+
By default, the notion pages contained in the database will be loaded into the `posts` collection.
|
46
46
|
|
47
|
-
You can also define
|
47
|
+
You can also define __multiple databases__ as follows.
|
48
48
|
|
49
49
|
```yml
|
50
50
|
collections:
|
@@ -53,46 +53,93 @@ collections:
|
|
53
53
|
|
54
54
|
notion:
|
55
55
|
databases:
|
56
|
-
- id:
|
57
|
-
- id:
|
56
|
+
- id: b0e688e199af4295ae80b67eb52f2e2f
|
57
|
+
- id: 2190450d4cb34739a5c8340c4110fe21
|
58
58
|
collection: recipes
|
59
|
-
- id:
|
59
|
+
- id: e42383cd49754897b967ce453760499f
|
60
60
|
collection: films
|
61
61
|
```
|
62
62
|
|
63
|
-
|
63
|
+
After running `jekyll build` (or `serve`) command, the `posts`, `recipes` and `films` collections will be loaded with pages from the notion databases.
|
64
64
|
|
65
|
-
|
65
|
+
#### Database options
|
66
66
|
|
67
|
-
|
67
|
+
Each dabatase support the following options.
|
68
|
+
|
69
|
+
* `id`: the notion database unique identifier,
|
70
|
+
* `collection`: the collection each page belongs to (posts by default),
|
71
|
+
* `filter`: the database [filter property](https://developers.notion.com/reference/post-database-query-filter),
|
72
|
+
* `sorts`: the database [sorts criteria](https://developers.notion.com/reference/post-database-query-sort),
|
68
73
|
|
69
74
|
```yml
|
70
75
|
notion:
|
71
76
|
database:
|
72
|
-
id:
|
73
|
-
|
77
|
+
id: e42383cd49754897b967ce453760499f
|
78
|
+
collection: posts
|
79
|
+
filter: { "property": "Published", "checkbox": { "equals": true } }
|
80
|
+
sorts: [{ "timestamp": "created_time", "direction": "ascending" }]
|
74
81
|
```
|
75
82
|
|
76
|
-
|
83
|
+
### Pages
|
77
84
|
|
78
|
-
|
85
|
+
Individual Notion pages can also be loaded into Jekyll. Just define the `page` property as follows.
|
79
86
|
|
80
|
-
|
87
|
+
```yml
|
88
|
+
notion:
|
89
|
+
page:
|
90
|
+
id: 5cfed4de3bdc4f43ae8ba653a7a2219b
|
91
|
+
```
|
81
92
|
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
93
|
+
As databases, we can set up multiple pages.
|
94
|
+
|
95
|
+
```yaml
|
96
|
+
notion:
|
97
|
+
pages:
|
98
|
+
- id: e42383cd49754897b967ce453760499f
|
99
|
+
- id: b0e688e199af4295ae80b67eb52f2e2f
|
100
|
+
- id: 2190450d4cb34739a5c8340c4110fe21
|
101
|
+
```
|
102
|
+
|
103
|
+
The filename of the generated page is the notion page title. Check [below](#page-filename) for more info.
|
104
|
+
|
105
|
+
All properties assigned to a notion page will be interpreted by jekyll as front matter. For example, if the [permalink](https://jekyllrb.com/docs/permalinks/#front-matter) property is set to `/about/` in the notion page, jekyll will use it to create the corresponding path at the output directory at `/about/index.html`.
|
106
|
+
|
107
|
+
### Data
|
108
|
+
|
109
|
+
Instead of storing the notion pages in a collection or in the pages list, you can assign them to the data object.Just declare the `data` property next to the page or database id.
|
86
110
|
|
87
111
|
```yml
|
88
112
|
notion:
|
89
|
-
|
90
|
-
id:
|
91
|
-
|
92
|
-
|
93
|
-
|
113
|
+
databases:
|
114
|
+
- id: b0e688e199af4295ae80b67eb52f2e2f
|
115
|
+
- id: e42383cd49754897b967ce453760499f
|
116
|
+
data: films
|
117
|
+
pages:
|
118
|
+
- id: e42383cd49754897b967ce453760499f
|
119
|
+
- id: b0e688e199af4295ae80b67eb52f2e2f
|
120
|
+
data: about
|
94
121
|
```
|
95
122
|
|
123
|
+
Page properties and body of the notion page are stored as a hash object.
|
124
|
+
|
125
|
+
In the previous example, data objects can be accesses as follows.
|
126
|
+
|
127
|
+
```html
|
128
|
+
<ul>
|
129
|
+
{% for film in site.data.films %}
|
130
|
+
<li>{{ film.title }}</li>
|
131
|
+
{% endfor %}
|
132
|
+
</ul>
|
133
|
+
```
|
134
|
+
|
135
|
+
Notice, the page body is stored in the key `content`.
|
136
|
+
|
137
|
+
```html
|
138
|
+
{{ site.data.about.content }}
|
139
|
+
```
|
140
|
+
|
141
|
+
The rest of properties are mapped as expected. For more info go to [notion properties](#notion-properties).
|
142
|
+
|
96
143
|
### Watch
|
97
144
|
|
98
145
|
By default, databases are only requested during the first build. Subsequent builds use the results from the cache.
|
@@ -103,7 +150,7 @@ Set `fetch_on_watch` to true to allow request on each rebuild.
|
|
103
150
|
notion:
|
104
151
|
fetch_on_watch: true
|
105
152
|
database:
|
106
|
-
id:
|
153
|
+
id: e42383cd49754897b967ce453760499f
|
107
154
|
```
|
108
155
|
|
109
156
|
And that's all. Each page in the notion database will be included in the selected collection.
|
@@ -131,12 +178,12 @@ Please, refer to the [notion_to_md](https://github.com/emoriarty/notion_to_md/)
|
|
131
178
|
|
132
179
|
## Page filename
|
133
180
|
|
134
|
-
There are two kinds of
|
181
|
+
There are two kinds of documents in Jekyll: posts and others.
|
135
182
|
|
136
|
-
When the
|
183
|
+
When the document is a post, the filename format contains the `created_time` property plus the page title as specified in [jekyll docs](https://jekyllrb.com/docs/posts/#creating-posts).
|
137
184
|
|
138
185
|
```
|
139
186
|
YEAR-MONTH-DAY-title.MARKUP
|
140
187
|
```
|
141
188
|
|
142
|
-
|
189
|
+
The filename for any other document is the page title.
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module JekyllNotion
|
4
|
+
class AbstractNotionResource
|
5
|
+
def initialize(config:)
|
6
|
+
@notion = Notion::Client.new
|
7
|
+
@config = config
|
8
|
+
end
|
9
|
+
|
10
|
+
def config
|
11
|
+
@config || {}
|
12
|
+
end
|
13
|
+
|
14
|
+
def id
|
15
|
+
config["id"]
|
16
|
+
end
|
17
|
+
|
18
|
+
def fetch
|
19
|
+
raise "Do not use the AbstractNotionResource class. Implement the fetch method in a subclass."
|
20
|
+
end
|
21
|
+
|
22
|
+
def collection_name
|
23
|
+
raise "Do not use the AbstractGenerator class. Implement the collection_name method in a subclass."
|
24
|
+
end
|
25
|
+
|
26
|
+
def data_name
|
27
|
+
raise "Do not use the AbstractGenerator class. Implement the data_name method in a subclass."
|
28
|
+
end
|
29
|
+
|
30
|
+
protected
|
31
|
+
|
32
|
+
def id?
|
33
|
+
if id.nil? || id.empty?
|
34
|
+
Jekyll.logger.warn("Jekyll Notion:",
|
35
|
+
"Database or page id is not provided. Cannot read from Notion.")
|
36
|
+
return false
|
37
|
+
end
|
38
|
+
true
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module JekyllNotion
|
4
|
+
class DatabaseFactory
|
5
|
+
def self.for(notion_resource:, site:, plugin:)
|
6
|
+
if notion_resource.data_name.nil?
|
7
|
+
CollectionGenerator.new(:notion_resource => notion_resource, :site => site,
|
8
|
+
:plugin => plugin)
|
9
|
+
else
|
10
|
+
DataGenerator.new(:notion_resource => notion_resource, :site => site, :plugin => plugin)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module JekyllNotion
|
4
|
+
class PageFactory
|
5
|
+
def self.for(notion_resource:, site:, plugin:)
|
6
|
+
if notion_resource.data_name.nil?
|
7
|
+
PageGenerator.new(:notion_resource => notion_resource, :site => site,
|
8
|
+
:plugin => plugin)
|
9
|
+
else
|
10
|
+
DataGenerator.new(:notion_resource => notion_resource, :site => site, :plugin => plugin)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -9,18 +9,24 @@ module JekyllNotion
|
|
9
9
|
|
10
10
|
return unless notion_token? && config?
|
11
11
|
|
12
|
-
if fetch_on_watch? ||
|
13
|
-
|
12
|
+
if fetch_on_watch? || cache_empty?
|
13
|
+
read_notion_databases
|
14
|
+
read_notion_pages
|
14
15
|
else
|
15
16
|
collections.each_pair { |key, val| @site.collections[key] = val }
|
16
17
|
data.each_pair { |key, val| @site.data[key] = val }
|
18
|
+
pages.each { |page| @site.pages << page }
|
17
19
|
end
|
18
20
|
end
|
19
21
|
|
20
|
-
def
|
22
|
+
def config_databases
|
21
23
|
config["databases"] || [config["database"]]
|
22
24
|
end
|
23
25
|
|
26
|
+
def config_pages
|
27
|
+
config["pages"] || [config["page"]]
|
28
|
+
end
|
29
|
+
|
24
30
|
def collections
|
25
31
|
@collections ||= {}
|
26
32
|
end
|
@@ -29,16 +35,27 @@ module JekyllNotion
|
|
29
35
|
@data ||= {}
|
30
36
|
end
|
31
37
|
|
38
|
+
def pages
|
39
|
+
@pages ||= []
|
40
|
+
end
|
41
|
+
|
32
42
|
protected
|
33
43
|
|
34
|
-
def
|
35
|
-
collections.empty? && data.empty?
|
44
|
+
def cache_empty?
|
45
|
+
collections.empty? && pages.empty? && data.empty?
|
36
46
|
end
|
37
47
|
|
38
|
-
def
|
39
|
-
|
48
|
+
def read_notion_databases
|
49
|
+
config_databases.each do |db_config|
|
40
50
|
db = NotionDatabase.new(:config => db_config)
|
41
|
-
|
51
|
+
DatabaseFactory.for(:notion_resource => db, :site => @site, :plugin => self).generate
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def read_notion_pages
|
56
|
+
config_pages.each do |page_config|
|
57
|
+
page = NotionPage.new(:config => page_config)
|
58
|
+
PageFactory.for(:notion_resource => page, :site => @site, :plugin => self).generate
|
42
59
|
end
|
43
60
|
end
|
44
61
|
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module JekyllNotion
|
4
|
+
class AbstractGenerator
|
5
|
+
def initialize(notion_resource:, site:, plugin:)
|
6
|
+
@notion_resource = notion_resource
|
7
|
+
@site = site
|
8
|
+
@plugin = plugin
|
9
|
+
end
|
10
|
+
|
11
|
+
def generate
|
12
|
+
raise "Do not use the AbstractGenerator class. Implement the generate method in a subclass."
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -3,18 +3,18 @@
|
|
3
3
|
module JekyllNotion
|
4
4
|
class CollectionGenerator < AbstractGenerator
|
5
5
|
def generate
|
6
|
-
@
|
6
|
+
@notion_resource.fetch.each do |page|
|
7
7
|
next if file_exists?(make_path(page))
|
8
8
|
|
9
9
|
collection.docs << make_doc(page)
|
10
10
|
log_new_page(page)
|
11
11
|
end
|
12
12
|
# Caching current collection
|
13
|
-
@plugin.collections[@
|
13
|
+
@plugin.collections[@notion_resource.collection_name] = collection
|
14
14
|
end
|
15
15
|
|
16
16
|
def collection
|
17
|
-
@site.collections[@
|
17
|
+
@site.collections[@notion_resource.collection_name]
|
18
18
|
end
|
19
19
|
|
20
20
|
private
|
@@ -35,11 +35,11 @@ module JekyllNotion
|
|
35
35
|
end
|
36
36
|
|
37
37
|
def make_path(page)
|
38
|
-
"_#{@
|
38
|
+
"_#{@notion_resource.collection_name}/#{make_filename(page)}"
|
39
39
|
end
|
40
40
|
|
41
41
|
def make_filename(page)
|
42
|
-
if @
|
42
|
+
if @notion_resource.collection_name == "posts"
|
43
43
|
"#{page.created_time.to_date}-#{Jekyll::Utils.slugify(page.title,
|
44
44
|
:mode => "latin")}.md"
|
45
45
|
else
|
@@ -54,10 +54,10 @@ module JekyllNotion
|
|
54
54
|
def log_new_page(page)
|
55
55
|
Jekyll.logger.info("Jekyll Notion:", "Page => #{page.title}")
|
56
56
|
if @site.config.dig(
|
57
|
-
"collections", @
|
57
|
+
"collections", @notion_resource.collection_name, "output"
|
58
58
|
)
|
59
59
|
Jekyll.logger.info("",
|
60
|
-
"
|
60
|
+
"URL => #{collection.docs.last.url}")
|
61
61
|
end
|
62
62
|
Jekyll.logger.debug("", "Props => #{collection.docs.last.data.keys.inspect}")
|
63
63
|
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module JekyllNotion
|
4
|
+
class DataGenerator < AbstractGenerator
|
5
|
+
def generate
|
6
|
+
unless data.nil?
|
7
|
+
@site.data[@notion_resource.data_name] = data
|
8
|
+
# Caching current data in Generator instance (plugin)
|
9
|
+
@plugin.data[@notion_resource.data_name] = data
|
10
|
+
log_pages
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def data
|
17
|
+
@data ||= if @notion_resource.is_a?(NotionDatabase)
|
18
|
+
pages = @notion_resource.fetch
|
19
|
+
pages.map { |page| page.props.merge({ "content" => convert(page) }) }
|
20
|
+
else
|
21
|
+
page = @notion_resource.fetch
|
22
|
+
page&.props&.merge({ "content" => convert(page) })
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# Convert the notion page body using the site.converters.
|
27
|
+
#
|
28
|
+
# Returns String the converted content.
|
29
|
+
def convert(page)
|
30
|
+
converters.reduce(page.body) do |output, converter|
|
31
|
+
converter.convert(output)
|
32
|
+
rescue StandardError => e
|
33
|
+
Jekyll.logger.error "Conversion error:",
|
34
|
+
"#{converter.class} encountered an error while "\
|
35
|
+
"converting notion page '#{page.title}':"
|
36
|
+
Jekyll.logger.error("", e.to_s)
|
37
|
+
raise e
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def converters
|
42
|
+
@converters ||= @site.converters.select { |c| c.matches(".md") }.tap(&:sort!)
|
43
|
+
end
|
44
|
+
|
45
|
+
def log_pages
|
46
|
+
if data.is_a?(Array)
|
47
|
+
data.each { |page| log_page(page, Array.to_s) }
|
48
|
+
else
|
49
|
+
log_page(data, Hash.to_s)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def log_page(page, type)
|
54
|
+
Jekyll.logger.info("Jekyll Notion:", "Page => #{page["title"]}")
|
55
|
+
Jekyll.logger.info("", "#{type} => site.data.#{@notion_resource.data_name}")
|
56
|
+
Jekyll.logger.debug("", "Props => #{page.keys.inspect}")
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module JekyllNotion
|
4
|
+
class PageGenerator < AbstractGenerator
|
5
|
+
def generate
|
6
|
+
notion_page = @notion_resource.fetch
|
7
|
+
unless notion_page.nil?
|
8
|
+
page = make_page(notion_page)
|
9
|
+
@site.pages << page
|
10
|
+
log_page(notion_page)
|
11
|
+
@plugin.pages << page
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def make_page(notion_page)
|
16
|
+
JekyllNotion::PageWithoutAFile.new(@site, @site.source, "", "#{notion_page.title}.md",
|
17
|
+
make_md)
|
18
|
+
end
|
19
|
+
|
20
|
+
def log_page(notion_page)
|
21
|
+
Jekyll.logger.info("Jekyll Notion:", "Page => #{notion_page.title}")
|
22
|
+
Jekyll.logger.info("", "URL => #{@site.pages.last.url}")
|
23
|
+
Jekyll.logger.debug("", "Props => #{notion_page.props.keys.inspect}")
|
24
|
+
end
|
25
|
+
|
26
|
+
def make_md
|
27
|
+
NotionToMd::Converter.new(:page_id => @notion_resource.id).convert(:frontmatter => true)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -1,57 +1,39 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module JekyllNotion
|
4
|
-
class NotionDatabase
|
5
|
-
|
6
|
-
|
7
|
-
@config = config
|
8
|
-
end
|
9
|
-
|
10
|
-
def pages
|
4
|
+
class NotionDatabase < AbstractNotionResource
|
5
|
+
# Returns an empty array or a NotionToMd:Page array
|
6
|
+
def fetch
|
11
7
|
return [] unless id?
|
12
8
|
|
13
|
-
@
|
14
|
-
NotionToMd::Page.new(:page => page)
|
9
|
+
@fetch ||= @notion.database_query(query)[:results].map do |page|
|
10
|
+
NotionToMd::Page.new(:page => page, :blocks => @notion.block_children(:block_id => page.id))
|
15
11
|
end
|
16
12
|
end
|
17
13
|
|
18
|
-
def config
|
19
|
-
@config || {}
|
20
|
-
end
|
21
|
-
|
22
14
|
def filter
|
23
15
|
config["filter"]
|
24
16
|
end
|
25
17
|
|
26
|
-
def
|
27
|
-
config["sort"]
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
config["id"]
|
18
|
+
def sorts
|
19
|
+
if config["sort"]
|
20
|
+
Jekyll.logger.warn("Jekyll Notion:", "sort property will be deprecated, use sorts instead")
|
21
|
+
end
|
22
|
+
config["sorts"] || config["sort"]
|
32
23
|
end
|
33
24
|
|
34
|
-
def
|
25
|
+
def collection_name
|
35
26
|
config["collection"] || "posts"
|
36
27
|
end
|
37
28
|
|
38
|
-
def
|
29
|
+
def data_name
|
39
30
|
config["data"]
|
40
31
|
end
|
41
32
|
|
42
33
|
private
|
43
34
|
|
44
|
-
def id?
|
45
|
-
if id.nil? || id.empty?
|
46
|
-
Jekyll.logger.warn("Jekyll Notion:",
|
47
|
-
"database id is not provided. Cannot read from Notion.")
|
48
|
-
return false
|
49
|
-
end
|
50
|
-
true
|
51
|
-
end
|
52
|
-
|
53
35
|
def query
|
54
|
-
{ :
|
36
|
+
{ :database_id => id, :filter => filter, :sorts => sorts }.compact
|
55
37
|
end
|
56
38
|
end
|
57
39
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module JekyllNotion
|
4
|
+
class NotionPage < AbstractNotionResource
|
5
|
+
# Returns the nil or a NotionToMd::Page instance
|
6
|
+
def fetch
|
7
|
+
return nil unless id?
|
8
|
+
|
9
|
+
@fetch ||= NotionToMd::Page.new(:page => @notion.page({ :page_id => id }),
|
10
|
+
:blocks => @notion.block_children({ :block_id => id }))
|
11
|
+
end
|
12
|
+
|
13
|
+
def data_name
|
14
|
+
config["data"]
|
15
|
+
end
|
16
|
+
|
17
|
+
def collection_name
|
18
|
+
nil
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module JekyllNotion
|
4
|
+
class PageWithoutAFile < Jekyll::Page
|
5
|
+
def initialize(site, base, dir, name, new_content)
|
6
|
+
self.content = new_content
|
7
|
+
super(site, base, dir, name)
|
8
|
+
end
|
9
|
+
|
10
|
+
def read_yaml(base, name, _opts = {})
|
11
|
+
filename = @path || site.in_source_dir(base, name)
|
12
|
+
Jekyll.logger.debug "Reading:", relative_path
|
13
|
+
|
14
|
+
begin
|
15
|
+
if content =~ Jekyll::Document::YAML_FRONT_MATTER_REGEXP
|
16
|
+
self.content = Regexp.last_match.post_match
|
17
|
+
self.data = SafeYAML.load(Regexp.last_match(1))
|
18
|
+
end
|
19
|
+
rescue Psych::SyntaxError => e
|
20
|
+
Jekyll.logger.warn "YAML Exception reading page #{name}: #{e.message}"
|
21
|
+
raise e if site.config["strict_front_matter"]
|
22
|
+
end
|
23
|
+
|
24
|
+
self.data ||= {}
|
25
|
+
|
26
|
+
validate_data! filename
|
27
|
+
validate_permalink! filename
|
28
|
+
|
29
|
+
self.data
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/lib/jekyll-notion.rb
CHANGED
@@ -13,10 +13,15 @@ Notion.configure do |config|
|
|
13
13
|
end
|
14
14
|
|
15
15
|
module JekyllNotion
|
16
|
-
autoload :
|
17
|
-
autoload :
|
18
|
-
autoload :
|
19
|
-
autoload :DataGenerator, "jekyll-notion/data_generator"
|
16
|
+
autoload :DatabaseFactory, "jekyll-notion/factories/database_factory"
|
17
|
+
autoload :PageFactory, "jekyll-notion/factories/page_factory"
|
18
|
+
autoload :AbstractGenerator, "jekyll-notion/generators/abstract_generator"
|
19
|
+
autoload :DataGenerator, "jekyll-notion/generators/data_generator"
|
20
|
+
autoload :PageGenerator, "jekyll-notion/generators/page_generator"
|
21
|
+
autoload :CollectionGenerator, "jekyll-notion/generators/collection_generator"
|
20
22
|
autoload :DocumentWithoutAFile, "jekyll-notion/document_without_a_file"
|
23
|
+
autoload :PageWithoutAFile, "jekyll-notion/page_without_a_file"
|
24
|
+
autoload :AbstractNotionResource, "jekyll-notion/abstract_notion_resource"
|
21
25
|
autoload :NotionDatabase, "jekyll-notion/notion_database"
|
26
|
+
autoload :NotionPage, "jekyll-notion/notion_page"
|
22
27
|
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:
|
4
|
+
version: 2.1.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-04-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: jekyll
|
@@ -36,28 +36,28 @@ dependencies:
|
|
36
36
|
requirements:
|
37
37
|
- - "~>"
|
38
38
|
- !ruby/object:Gem::Version
|
39
|
-
version:
|
39
|
+
version: 1.0.0
|
40
40
|
type: :runtime
|
41
41
|
prerelease: false
|
42
42
|
version_requirements: !ruby/object:Gem::Requirement
|
43
43
|
requirements:
|
44
44
|
- - "~>"
|
45
45
|
- !ruby/object:Gem::Version
|
46
|
-
version:
|
46
|
+
version: 1.0.0
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: notion_to_md
|
49
49
|
requirement: !ruby/object:Gem::Requirement
|
50
50
|
requirements:
|
51
51
|
- - "~>"
|
52
52
|
- !ruby/object:Gem::Version
|
53
|
-
version:
|
53
|
+
version: 1.2.0
|
54
54
|
type: :runtime
|
55
55
|
prerelease: false
|
56
56
|
version_requirements: !ruby/object:Gem::Requirement
|
57
57
|
requirements:
|
58
58
|
- - "~>"
|
59
59
|
- !ruby/object:Gem::Version
|
60
|
-
version:
|
60
|
+
version: 1.2.0
|
61
61
|
- !ruby/object:Gem::Dependency
|
62
62
|
name: bundler
|
63
63
|
requirement: !ruby/object:Gem::Requirement
|
@@ -110,13 +110,18 @@ extra_rdoc_files:
|
|
110
110
|
files:
|
111
111
|
- README.md
|
112
112
|
- lib/jekyll-notion.rb
|
113
|
-
- lib/jekyll-notion/
|
114
|
-
- lib/jekyll-notion/collection_generator.rb
|
115
|
-
- lib/jekyll-notion/data_generator.rb
|
113
|
+
- lib/jekyll-notion/abstract_notion_resource.rb
|
116
114
|
- lib/jekyll-notion/document_without_a_file.rb
|
115
|
+
- lib/jekyll-notion/factories/database_factory.rb
|
116
|
+
- lib/jekyll-notion/factories/page_factory.rb
|
117
117
|
- lib/jekyll-notion/generator.rb
|
118
|
-
- lib/jekyll-notion/
|
118
|
+
- lib/jekyll-notion/generators/abstract_generator.rb
|
119
|
+
- lib/jekyll-notion/generators/collection_generator.rb
|
120
|
+
- lib/jekyll-notion/generators/data_generator.rb
|
121
|
+
- lib/jekyll-notion/generators/page_generator.rb
|
119
122
|
- lib/jekyll-notion/notion_database.rb
|
123
|
+
- lib/jekyll-notion/notion_page.rb
|
124
|
+
- lib/jekyll-notion/page_without_a_file.rb
|
120
125
|
- lib/jekyll-notion/version.rb
|
121
126
|
homepage: https://github.com/emoriarty/jekyll-notion
|
122
127
|
licenses:
|
@@ -137,8 +142,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
137
142
|
- !ruby/object:Gem::Version
|
138
143
|
version: '0'
|
139
144
|
requirements: []
|
140
|
-
|
141
|
-
rubygems_version: 2.7.3
|
145
|
+
rubygems_version: 3.1.6
|
142
146
|
signing_key:
|
143
147
|
specification_version: 4
|
144
148
|
summary: A Jekyll plugin to generate pages from Notion
|
@@ -1,15 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module JekyllNotion
|
4
|
-
class AbstractGenerator
|
5
|
-
def initialize(db:, site:, plugin:)
|
6
|
-
@db = db
|
7
|
-
@site = site
|
8
|
-
@plugin = plugin
|
9
|
-
end
|
10
|
-
|
11
|
-
def generate
|
12
|
-
raise "Do not use the AbstractGenerator class directly. Implement the generate method in a subclass."
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module JekyllNotion
|
4
|
-
class DataGenerator < AbstractGenerator
|
5
|
-
def generate
|
6
|
-
@site.data[@db.data] = data
|
7
|
-
# Caching current data
|
8
|
-
@plugin.data[@db.data] = data
|
9
|
-
log_pages
|
10
|
-
end
|
11
|
-
|
12
|
-
private
|
13
|
-
|
14
|
-
def data
|
15
|
-
@data ||= @db.pages.map(&:props)
|
16
|
-
end
|
17
|
-
|
18
|
-
def log_pages
|
19
|
-
@db.pages.each do |page|
|
20
|
-
Jekyll.logger.info("Jekyll Notion:", "Page => #{page.title}")
|
21
|
-
Jekyll.logger.debug("", "Props => #{page.props.keys.inspect}")
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
@@ -1,13 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module JekyllNotion
|
4
|
-
class GeneratorFactory
|
5
|
-
def self.for(db:, site:, plugin:)
|
6
|
-
if db.data.nil?
|
7
|
-
CollectionGenerator.new(:db => db, :site => site, :plugin => plugin)
|
8
|
-
else
|
9
|
-
DataGenerator.new(:db => db, :site => site, :plugin => plugin)
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|