jekyll-notion 0.0.0.alpha.2 → 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c85349b9010ff1ccbbc88b83e46315f8e31bc9b489943dce0c75c7a503820db3
4
- data.tar.gz: f0ae3ebe202b1cd3d184fe232d350b6024148a2bffe298a771c9221e1ac0684b
3
+ metadata.gz: 72643f8e9760b1f45a30fd87a8448cf16b1f85a63bcec6c83b4d4b3dea8b4c21
4
+ data.tar.gz: 95b0c61bdfc5e7c6dc018798474dcd40e6ec0728c0836d552249b9b7da8213bf
5
5
  SHA512:
6
- metadata.gz: 1c98f9f772b8290d78e0ab393c5dbd55b419518a9f9baccd84906218e6a650d903027f10b85f120a779c71364f9a3d3ec2d8bd88fddf284f59fe2ffc80c1e3de
7
- data.tar.gz: 0fe7d15ad3c33de0929072ad7ba7df7f8c0ed22cb4aefb9084bfc868a2aa23641c08d3f1d8f6c22b8ac35b765b938a2e2798f02a028a2c37e4d41d4bfa51fca0
6
+ metadata.gz: daf22fba12e6385aaa5842103c390ee6f58c093bf5ee1b199700c769a45d7736f04600f71cc0bcdedd77018a547024f8bdaf517a842cd88d58f13af4a77d57c9
7
+ data.tar.gz: 4d28a3d8319345e1a936ac3112009568a1d693cbd3314783fdea12d4c1cca38da33f701b25d870eb1cebf0fc11347f849979fcfee94a9d98173d33e376e50bec
data/README.md CHANGED
@@ -1,2 +1,81 @@
1
1
  # jekyll-notion
2
- Import pages from notion.
2
+
3
+ Import notion pages to a jekyll collection.
4
+
5
+ ## Installation
6
+
7
+ Use gem to install.
8
+ ```bash
9
+ $ gem install 'jekyll-notion'
10
+ ```
11
+
12
+ Or add it to the `Gemfile`.
13
+ ```ruby
14
+ # Gemfile
15
+ gem 'jekyll-notion'
16
+ ```
17
+
18
+ And update your jekyll plugins property in `_config.yml`.
19
+
20
+ ```yml
21
+ plugins:
22
+ - jekyll-notion
23
+ ```
24
+
25
+ ## Setup
26
+
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
+
29
+ Export the notion secret token in an environment variable named `NOTION_TOKEN`.
30
+
31
+ ```bash
32
+ $ export NOTION_TOKEN=<secret_...>
33
+ ```
34
+
35
+ Once your notion database has been shared, specify the `id` in your `_config.yml` as follows.
36
+
37
+ ```yml
38
+ notion:
39
+ database:
40
+ id: b91d5...
41
+ collection: posts
42
+ filter: { "property": "Published", "checkbox": { "equals": true } }
43
+ sort: { "propery": "Last ordered", "direction": "ascending" }
44
+ frontmatter:
45
+ layout: post
46
+ ```
47
+
48
+ The other properties are:
49
+ * `collection`: the collection each page belongs to (posts by default),
50
+ * `filter`: the database query filter,
51
+ * `sort`: the database query sort,
52
+ * `frontmatter`: additional frontmatter to append to each page in the collection.
53
+
54
+ Note: Only one database is available.
55
+
56
+ And that's all. Each page in the notion database will be included in the selected collection.
57
+
58
+ ## Notion properties
59
+
60
+ Below, page notion default properties are set in each page frontmatter.
61
+
62
+ ```
63
+ ---
64
+ id: id
65
+ title: properties > Name > title > plain_text
66
+ cover: cover > external > url
67
+ date: created_time
68
+ ---
69
+ ```
70
+
71
+ ## Page filename
72
+
73
+ There are two kinds of collections: posts and others.
74
+
75
+ When the collection is posts, the filename format contains the `created_time` property plus the page title as specified in [jekyll docs](https://jekyllrb.com/docs/posts/#creating-posts).
76
+
77
+ ```
78
+ YEAR-MONTH-DAY-title.MARKUP
79
+ ```
80
+
81
+ Any other collection, the filename is the page title.
@@ -2,9 +2,9 @@
2
2
 
3
3
  module JekyllNotion
4
4
  class DocumentWithoutAFile < Jekyll::Document
5
- def read_content(new_content, **opts)
5
+ def read_content(_new_content, **_opts)
6
6
  if content =~ YAML_FRONT_MATTER_REGEXP
7
- self.content = $POSTMATCH
7
+ self.content = Regexp.last_match.post_match
8
8
  data_file = SafeYAML.load(Regexp.last_match(1))
9
9
  merge_data!(data_file, :source => "YAML front matter") if data_file
10
10
  end
@@ -4,24 +4,27 @@ module JekyllNotion
4
4
  class Generator < Jekyll::Generator
5
5
  attr_reader :current_page
6
6
 
7
- def initialize(plugin)
8
- super(plugin)
9
- end
10
-
11
7
  def generate(site)
12
8
  @site = site
13
- @db = NotionDatabase.new(config: config)
14
- @db.pages do |page|
9
+
10
+ return unless notion_token? && config?
11
+
12
+ read_notion_database
13
+ end
14
+
15
+ def read_notion_database
16
+ @db = NotionDatabase.new(:config => config)
17
+ @db.pages.each do |page|
15
18
  @current_page = page
16
- site.posts.docs << make_page
17
- Jekyll.logger.info("New page from notion", site.posts.docs.last.path)
19
+ collection.docs << make_page
20
+ Jekyll.logger.info("Jekyll Notion:", "New notion page at #{collection.docs.last.path}")
18
21
  end
19
22
  end
20
23
 
21
24
  def make_page
22
25
  new_post = DocumentWithoutAFile.new(
23
- "#{Dir.pwd}/_#{config['collection']}/#{make_filename}",
24
- { site: @site, collection: collection }
26
+ "#{Dir.pwd}/_#{collection_name}/#{make_filename}",
27
+ { :site => @site, :collection => collection }
25
28
  )
26
29
  new_post.content = "#{make_frontmatter}\n\n#{make_md}"
27
30
  new_post.read
@@ -29,31 +32,59 @@ module JekyllNotion
29
32
  end
30
33
 
31
34
  def make_md
32
- NotionToMd::Converter.new(page_id: current_page.id).convert
35
+ NotionToMd::Converter.new(:page_id => current_page.id).convert
33
36
  end
34
37
 
35
38
  def make_frontmatter
36
- <<-CONTENT
37
- #{config['frontmatter'].to_yaml}
38
- id: #{current_page.id}
39
- layout: #{current_page.layout}
40
- title: #{current_page.title}
41
- date: #{current_page.created_datetime.to_s}
42
- cover: #{current_page.cover}
43
- ---
39
+ <<~CONTENT
40
+ ---
41
+ id: #{current_page.id}
42
+ title: #{current_page.title}
43
+ date: #{current_page.created_datetime}
44
+ cover: #{current_page.cover}
45
+ #{frontmatter}
46
+ ---
44
47
  CONTENT
45
48
  end
46
49
 
50
+ def frontmatter
51
+ config.dig("database", "frontmatter").to_a.map { |k, v| "#{k}: #{v}" }.join("\n")
52
+ end
53
+
47
54
  def make_filename
48
- "#{current_page.created_date.to_s}-#{current_page.title.downcase.parameterize}.md"
55
+ if collection_name == "posts"
56
+ "#{current_page.created_date}-#{current_page.title.downcase.parameterize}.md"
57
+ else
58
+ "#{current_page.title.downcase.parameterize}.md"
59
+ end
60
+ end
61
+
62
+ def collection_name
63
+ config.dig("database", "collection") || "posts"
49
64
  end
50
65
 
51
66
  def collection
52
- @site.send(config['collection'].to_sym)
67
+ @collection ||= @site.collections[collection_name]
53
68
  end
54
69
 
55
70
  def config
56
71
  @config ||= @site.config["notion"] || {}
57
72
  end
73
+
74
+ def notion_token?
75
+ if ENV["NOTION_TOKEN"].nil? || ENV["NOTION_TOKEN"].empty?
76
+ Jekyll.logger.warn("Jekyll Notion:", "NOTION_TOKEN not provided. Cannot read from Notion.")
77
+ return false
78
+ end
79
+ true
80
+ end
81
+
82
+ def config?
83
+ if config.empty?
84
+ Jekyll.logger.warn("Jekyll Notion:", "No config provided.")
85
+ return false
86
+ end
87
+ true
88
+ end
58
89
  end
59
90
  end
@@ -8,31 +8,42 @@ module JekyllNotion
8
8
  end
9
9
 
10
10
  def pages
11
+ return [] unless id?
12
+
11
13
  @pages ||= @notion.database_query(query)[:results].map do |page|
12
- NotionPage.new(page: page, layout: @config['layout'])
14
+ NotionPage.new(:page => page, :layout => config["layout"])
13
15
  end
14
-
15
- return @pages unless block_given?
16
-
17
- @pages.each { |page| yield page }
18
16
  end
19
17
 
20
18
  private
21
19
 
20
+ def config
21
+ @config["database"]
22
+ end
23
+
22
24
  def filter
23
- @config.dig('database', 'filter')
25
+ @config.dig("database", "filter")
24
26
  end
25
27
 
26
28
  def sort
27
- @config.dig('database', 'sort')
29
+ @config.dig("database", "sort")
28
30
  end
29
31
 
30
32
  def id
31
- @config.dig('database', 'id')
33
+ @config.dig("database", "id")
34
+ end
35
+
36
+ def id?
37
+ if id.nil? || id.empty?
38
+ Jekyll.logger.warn("Jekyll Notion:",
39
+ "database id is not provided. Cannot read from Notion.")
40
+ return false
41
+ end
42
+ true
32
43
  end
33
44
 
34
- def query
35
- { id: id, filter: filter, sort: sort }
45
+ def query
46
+ { :id => id, :filter => filter, :sort => sort }
36
47
  end
37
48
  end
38
49
  end
@@ -10,7 +10,7 @@ module JekyllNotion
10
10
  end
11
11
 
12
12
  def title
13
- page.dig(:properties, :Name, :title).inject('') do |acc, slug|
13
+ page.dig(:properties, :Name, :title).inject("") do |acc, slug|
14
14
  acc + slug[:plain_text]
15
15
  end
16
16
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module JekyllNotion
4
- VERSION = '0.0.0.alpha.2'
4
+ VERSION = "0.0.0"
5
5
  end
data/lib/jekyll-notion.rb CHANGED
@@ -1,20 +1,20 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'jekyll'
4
- require 'notion'
5
- require 'notion_to_md'
6
- require 'logger'
7
- require 'active_support/inflector'
8
- require 'jekyll-notion/generator'
3
+ require "jekyll"
4
+ require "notion"
5
+ require "notion_to_md"
6
+ require "logger"
7
+ require "active_support/inflector"
8
+ require "jekyll-notion/generator"
9
9
 
10
10
  NotionToMd::Logger.level = Logger::ERROR
11
11
 
12
12
  Notion.configure do |config|
13
- config.token = ENV['NOTION_TOKEN']
13
+ config.token = ENV["NOTION_TOKEN"]
14
14
  end
15
15
 
16
16
  module JekyllNotion
17
- autoload :DocumentWithoutAFile, 'jekyll-notion/document_without_a_file'
18
- autoload :NotionDatabase, 'jekyll-notion/notion_database'
19
- autoload :NotionPage, 'jekyll-notion/notion_page'
17
+ autoload :DocumentWithoutAFile, "jekyll-notion/document_without_a_file"
18
+ autoload :NotionDatabase, "jekyll-notion/notion_database"
19
+ autoload :NotionPage, "jekyll-notion/notion_page"
20
20
  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.0.0.alpha.2
4
+ version: 0.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-01-14 00:00:00.000000000 Z
11
+ date: 2022-01-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -45,7 +45,7 @@ dependencies:
45
45
  - !ruby/object:Gem::Version
46
46
  version: '5.0'
47
47
  - !ruby/object:Gem::Dependency
48
- name: notion_to_md
48
+ name: notion-ruby-client
49
49
  requirement: !ruby/object:Gem::Requirement
50
50
  requirements:
51
51
  - - "~>"
@@ -59,7 +59,7 @@ dependencies:
59
59
  - !ruby/object:Gem::Version
60
60
  version: '0'
61
61
  - !ruby/object:Gem::Dependency
62
- name: notion-ruby-client
62
+ name: notion_to_md
63
63
  requirement: !ruby/object:Gem::Requirement
64
64
  requirements:
65
65
  - - "~>"
@@ -86,6 +86,34 @@ dependencies:
86
86
  - - "~>"
87
87
  - !ruby/object:Gem::Version
88
88
  version: '2'
89
+ - !ruby/object:Gem::Dependency
90
+ name: rspec
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '3.0'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '3.0'
103
+ - !ruby/object:Gem::Dependency
104
+ name: rubocop-jekyll
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: 0.12.0
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: 0.12.0
89
117
  description:
90
118
  email:
91
119
  - emoriarty81@gmail.com
@@ -116,9 +144,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
116
144
  version: 2.5.0
117
145
  required_rubygems_version: !ruby/object:Gem::Requirement
118
146
  requirements:
119
- - - ">"
147
+ - - ">="
120
148
  - !ruby/object:Gem::Version
121
- version: 1.3.1
149
+ version: '0'
122
150
  requirements: []
123
151
  rubyforge_project:
124
152
  rubygems_version: 2.7.3