jekyll-notion 1.2.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +60 -38
- data/lib/jekyll-notion/{generator_factory.rb → factories/database_factory.rb} +2 -2
- data/lib/jekyll-notion/factories/page_factory.rb +14 -0
- data/lib/jekyll-notion/generator.rb +14 -9
- data/lib/jekyll-notion/{abstract_generator.rb → generators/abstract_generator.rb} +0 -0
- data/lib/jekyll-notion/{collection_generator.rb → generators/collection_generator.rb} +1 -1
- data/lib/jekyll-notion/{data_generator.rb → generators/data_generator.rb} +9 -7
- data/lib/jekyll-notion/generators/page_generator.rb +30 -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 +8 -5
- metadata +9 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 79520a9f4d598b024d2934fd68140f0f34775e2611ff601b1352ba60f67e9dd3
|
4
|
+
data.tar.gz: bcd325965c4eec49a498fe99c2101fa238f6c67587cb13723927abe0b8e83c1f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 17ca3742b0b48a22dd7cca185c25f9368565e7af35ccdc3e9add259faa20aa101e908aac961363c1ecf2b0d2f6822153e6b7d4a6bc53a3dc1d49697cb1199bc1
|
7
|
+
data.tar.gz: 0a46f5e5ce29f09bc1966ac4199a080da5eea58cedcaa37062cf5fd3bc77b35a8ad45bbf1067d01d32ca9094e53e36e21223187b8c3d94970ef092eb09ca56d0
|
data/README.md
CHANGED
@@ -22,16 +22,18 @@ 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
|
+
### Databases
|
36
|
+
|
35
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
|
@@ -40,12 +42,9 @@ notion:
|
|
40
42
|
id: 5cfed4de3bdc4f43ae8ba653a7a2219b
|
41
43
|
```
|
42
44
|
|
43
|
-
|
44
|
-
|
45
|
+
By default, the notion pages contained in the database will be loaded into the `posts` collection.
|
45
46
|
|
46
|
-
|
47
|
-
|
48
|
-
You can also define multiple databases as follows.
|
47
|
+
You can also define __multiple databases__ as follows.
|
49
48
|
|
50
49
|
```yml
|
51
50
|
collections:
|
@@ -61,63 +60,86 @@ notion:
|
|
61
60
|
collection: films
|
62
61
|
```
|
63
62
|
|
64
|
-
|
63
|
+
After running `jekyll build` (or `serve`) command, the `posts`, `recipes` and `films` collections will be loaded with pages from the notion databases.
|
65
64
|
|
66
|
-
|
65
|
+
#### Database options
|
66
|
+
|
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 query filter,
|
72
|
+
* `sort`: the database query sort,
|
67
73
|
|
68
74
|
```yml
|
69
75
|
notion:
|
70
76
|
database:
|
71
77
|
id: e42383cd49754897b967ce453760499f
|
72
|
-
|
78
|
+
collection: posts
|
79
|
+
filter: { "property": "Published", "checkbox": { "equals": true } }
|
80
|
+
sort: { "property": "Last ordered", "direction": "ascending" }
|
73
81
|
```
|
74
82
|
|
75
|
-
|
83
|
+
### Pages
|
76
84
|
|
77
|
-
|
85
|
+
Individual Notion pages can also be loaded into Jekyll. Just define the `page` property as follows.
|
78
86
|
|
79
|
-
```
|
80
|
-
|
87
|
+
```yml
|
88
|
+
notion:
|
89
|
+
page:
|
90
|
+
id: 5cfed4de3bdc4f43ae8ba653a7a2219b
|
81
91
|
```
|
82
92
|
|
83
|
-
|
84
|
-
|
85
|
-
### Pages
|
86
|
-
|
87
|
-
Individual Notion pages can also be mapped to data. Just define the `pages` or `page` property as follows.
|
93
|
+
As databases, we can set up multiple pages.
|
88
94
|
|
89
95
|
```yaml
|
90
96
|
notion:
|
91
97
|
pages:
|
92
98
|
- id: e42383cd49754897b967ce453760499f
|
93
|
-
data: about
|
94
99
|
- id: b0e688e199af4295ae80b67eb52f2e2f
|
95
|
-
data: contact
|
96
100
|
- id: 2190450d4cb34739a5c8340c4110fe21
|
97
|
-
data: footer
|
98
|
-
|
99
101
|
```
|
100
102
|
|
101
|
-
|
103
|
+
The filename of the generated page is the notion page title. Check [below](#page-filename) for more info.
|
102
104
|
|
103
|
-
|
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`.
|
104
106
|
|
105
|
-
|
107
|
+
### Data
|
106
108
|
|
107
|
-
|
108
|
-
* `collection`: the collection each page belongs to (posts by default),
|
109
|
-
* `filter`: the database query filter,
|
110
|
-
* `sort`: the database query sort,
|
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.
|
111
110
|
|
112
111
|
```yml
|
113
112
|
notion:
|
114
|
-
|
115
|
-
id:
|
116
|
-
|
117
|
-
|
118
|
-
|
113
|
+
databases:
|
114
|
+
- id: b0e688e199af4295ae80b67eb52f2e2f
|
115
|
+
- id: e42383cd49754897b967ce453760499f
|
116
|
+
data: films
|
117
|
+
pages:
|
118
|
+
- id: e42383cd49754897b967ce453760499f
|
119
|
+
- id: b0e688e199af4295ae80b67eb52f2e2f
|
120
|
+
data: about
|
119
121
|
```
|
120
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
|
+
|
121
143
|
### Watch
|
122
144
|
|
123
145
|
By default, databases are only requested during the first build. Subsequent builds use the results from the cache.
|
@@ -156,12 +178,12 @@ Please, refer to the [notion_to_md](https://github.com/emoriarty/notion_to_md/)
|
|
156
178
|
|
157
179
|
## Page filename
|
158
180
|
|
159
|
-
There are two kinds of
|
181
|
+
There are two kinds of documents in Jekyll: posts and others.
|
160
182
|
|
161
|
-
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).
|
162
184
|
|
163
185
|
```
|
164
186
|
YEAR-MONTH-DAY-title.MARKUP
|
165
187
|
```
|
166
188
|
|
167
|
-
|
189
|
+
The filename for any other document is the page title.
|
@@ -1,9 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module JekyllNotion
|
4
|
-
class
|
4
|
+
class DatabaseFactory
|
5
5
|
def self.for(notion_resource:, site:, plugin:)
|
6
|
-
if notion_resource.
|
6
|
+
if notion_resource.data_name.nil?
|
7
7
|
CollectionGenerator.new(:notion_resource => notion_resource, :site => site,
|
8
8
|
:plugin => plugin)
|
9
9
|
else
|
@@ -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,20 +9,21 @@ module JekyllNotion
|
|
9
9
|
|
10
10
|
return unless notion_token? && config?
|
11
11
|
|
12
|
-
if fetch_on_watch? ||
|
12
|
+
if fetch_on_watch? || cache_empty?
|
13
13
|
read_notion_databases
|
14
14
|
read_notion_pages
|
15
15
|
else
|
16
16
|
collections.each_pair { |key, val| @site.collections[key] = val }
|
17
17
|
data.each_pair { |key, val| @site.data[key] = val }
|
18
|
+
pages.each { |page| @site.pages << page }
|
18
19
|
end
|
19
20
|
end
|
20
21
|
|
21
|
-
def
|
22
|
+
def config_databases
|
22
23
|
config["databases"] || [config["database"]]
|
23
24
|
end
|
24
25
|
|
25
|
-
def
|
26
|
+
def config_pages
|
26
27
|
config["pages"] || [config["page"]]
|
27
28
|
end
|
28
29
|
|
@@ -34,23 +35,27 @@ module JekyllNotion
|
|
34
35
|
@data ||= {}
|
35
36
|
end
|
36
37
|
|
38
|
+
def pages
|
39
|
+
@pages ||= []
|
40
|
+
end
|
41
|
+
|
37
42
|
protected
|
38
43
|
|
39
|
-
def
|
40
|
-
collections.empty? && data.empty?
|
44
|
+
def cache_empty?
|
45
|
+
collections.empty? && pages.empty? && data.empty?
|
41
46
|
end
|
42
47
|
|
43
48
|
def read_notion_databases
|
44
|
-
|
49
|
+
config_databases.each do |db_config|
|
45
50
|
db = NotionDatabase.new(:config => db_config)
|
46
|
-
|
51
|
+
DatabaseFactory.for(:notion_resource => db, :site => @site, :plugin => self).generate
|
47
52
|
end
|
48
53
|
end
|
49
54
|
|
50
55
|
def read_notion_pages
|
51
|
-
|
56
|
+
config_pages.each do |page_config|
|
52
57
|
page = NotionPage.new(:config => page_config)
|
53
|
-
|
58
|
+
PageFactory.for(:notion_resource => page, :site => @site, :plugin => self).generate
|
54
59
|
end
|
55
60
|
end
|
56
61
|
|
File without changes
|
@@ -57,7 +57,7 @@ module JekyllNotion
|
|
57
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
|
@@ -28,7 +28,7 @@ module JekyllNotion
|
|
28
28
|
# Returns String the converted content.
|
29
29
|
def convert(page)
|
30
30
|
converters.reduce(page.body) do |output, converter|
|
31
|
-
converter.convert
|
31
|
+
converter.convert(output)
|
32
32
|
rescue StandardError => e
|
33
33
|
Jekyll.logger.error "Conversion error:",
|
34
34
|
"#{converter.class} encountered an error while "\
|
@@ -44,14 +44,16 @@ module JekyllNotion
|
|
44
44
|
|
45
45
|
def log_pages
|
46
46
|
if data.is_a?(Array)
|
47
|
-
data.each
|
48
|
-
Jekyll.logger.info("Jekyll Notion:", "Page => #{page["title"]}")
|
49
|
-
Jekyll.logger.debug("", "Props => #{page.keys.inspect}")
|
50
|
-
end
|
47
|
+
data.each { |page| log_page(page, Array.to_s) }
|
51
48
|
else
|
52
|
-
|
53
|
-
Jekyll.logger.debug("", "Props => #{data.keys.inspect}")
|
49
|
+
log_page(data, Hash.to_s)
|
54
50
|
end
|
55
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
|
56
58
|
end
|
57
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
|
@@ -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,12 +13,15 @@ Notion.configure do |config|
|
|
13
13
|
end
|
14
14
|
|
15
15
|
module JekyllNotion
|
16
|
-
autoload :
|
17
|
-
autoload :
|
18
|
-
autoload :
|
19
|
-
autoload :
|
20
|
-
autoload :
|
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"
|
21
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"
|
22
25
|
autoload :NotionDatabase, "jekyll-notion/notion_database"
|
23
26
|
autoload :NotionPage, "jekyll-notion/notion_page"
|
24
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.0.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-03-
|
11
|
+
date: 2022-03-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: jekyll
|
@@ -110,15 +110,18 @@ extra_rdoc_files:
|
|
110
110
|
files:
|
111
111
|
- README.md
|
112
112
|
- lib/jekyll-notion.rb
|
113
|
-
- lib/jekyll-notion/abstract_generator.rb
|
114
113
|
- lib/jekyll-notion/abstract_notion_resource.rb
|
115
|
-
- lib/jekyll-notion/collection_generator.rb
|
116
|
-
- lib/jekyll-notion/data_generator.rb
|
117
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
|
118
117
|
- lib/jekyll-notion/generator.rb
|
119
|
-
- 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
|
120
122
|
- lib/jekyll-notion/notion_database.rb
|
121
123
|
- lib/jekyll-notion/notion_page.rb
|
124
|
+
- lib/jekyll-notion/page_without_a_file.rb
|
122
125
|
- lib/jekyll-notion/version.rb
|
123
126
|
homepage: https://github.com/emoriarty/jekyll-notion
|
124
127
|
licenses:
|