hugo-notion 0.1.0.pre.alpha.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: a6bd4925e3b3a59530ce6240621fffc48526af50e7437d8fa1c412920a247a72
4
+ data.tar.gz: 3ce5c9c0170acaddade872e954566180a4b8bb5d0b29be542ac836e0d8ad6f15
5
+ SHA512:
6
+ metadata.gz: dbe275da44f5a7bde42180a20e889338935e1c3299c20bfc96860521220f0f394c887201c60bea65427b34ef224696329b49c017aaa1562f0e4994e9e9513f25
7
+ data.tar.gz: 87aa5d782b3461a21b95ac0e30a702f6b91fc7dadc7a8c779ce88ad6a07a37e7d408aad6ec02c824a32434539434afc02e21f752b408f7198a19a03a0d9bf4de
data/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # hugo-notion
2
+
3
+ Write in Notion. Publish with Hugo.
@@ -0,0 +1,126 @@
1
+ env_file_path = File.expand_path('../../.env', File.dirname(__FILE__))
2
+ if File.exist?(env_file_path)
3
+ require 'dotenv'
4
+ Dotenv.load(env_file_path)
5
+ end
6
+ notion_token = ENV['NOTION_TOKEN']
7
+ unless notion_token
8
+ throw "Please create a Notion integration, generate a secret and provide it in the 'NOTION_TOKEN' environment variable"
9
+ end
10
+
11
+ NOTION_TOKEN = ENV['NOTION_TOKEN']
12
+
13
+ require 'httparty'
14
+ require 'notion-ruby-client'
15
+ require 'notion_to_md'
16
+ require 'yaml'
17
+ require 'pry'
18
+
19
+ class NotionApi
20
+ BASE_URL = "https://api.notion.com/v1"
21
+
22
+ def initialize(api_secret)
23
+ @api_secret = api_secret
24
+ end
25
+
26
+ def get(path)
27
+ url = File.join(BASE_URL, path)
28
+ HTTParty.get(url, headers: {
29
+ "Notion-Version" => '2022-02-22',
30
+ "Authorization" => "Bearer #{@api_secret}"
31
+ })
32
+ end
33
+
34
+ def post(path)
35
+ url = File.join(BASE_URL, path)
36
+ HTTParty.post(url, headers: {
37
+ "Notion-Version" => '2022-02-22',
38
+ "Authorization" => "Bearer #{@api_secret}"
39
+ })
40
+ end
41
+ end
42
+
43
+ class Synchronizer
44
+ class << self
45
+ def run(options = {})
46
+ if options[:notion_page_id]
47
+ notion_page_id = options[:notion_page_id]
48
+ elsif options[:notion_database_id]
49
+ notion_database_id = options[:notion_database_id]
50
+ end
51
+ destination_dir = options[:destination_dir]
52
+ Dir.mkdir(destination_dir) unless Dir.exist?(destination_dir)
53
+
54
+ notion = NotionApi.new(NOTION_TOKEN)
55
+ response = if notion_database_id
56
+ notion.post("/databases/#{notion_database_id}/query")
57
+ elsif notion_page_id
58
+ notion.get("/blocks/#{notion_page_id}/children")
59
+ end
60
+ notion_blocks = response['results']
61
+
62
+ existing_page_file_names = Dir.entries(destination_dir).select { |f| !File.directory? f }
63
+ page_file_names = []
64
+ notion_blocks.each do |notion_block|
65
+ notion_block_id = notion_notion_block['id']
66
+
67
+ if notion_block['type'] == 'child_database'
68
+ notion_child_database_title = notion_block['child_database']['title']
69
+ run(
70
+ notion_database_id: notion_block_id,
71
+ destination_dir: File.join(destination_dir, notion_child_database_title)
72
+ )
73
+ next
74
+ end
75
+
76
+ block_last_edited_at = Time.parse(notion_block['last_edited_time'])
77
+
78
+ page_front_matter = {
79
+ 'date' => Time.parse(notion_block['created_time'])
80
+ }
81
+ if notion_block['properties']
82
+ if block.dig('properties', 'date', 'date', 'start')
83
+ page_front_matter['date'] = Time.parse(notion_block['properties']['date']['date']['start'])
84
+ end
85
+
86
+ if block.dig('properties', 'Name', 'title', 0, 'plain_text')
87
+ page_front_matter['title'] = notion_block['properties']['Name']['title'][0]['plain_text']
88
+ end
89
+ end
90
+ if notion_block['type'] == 'child_page'
91
+ page_front_matter['title'] = notion_block['child_page']['title']
92
+ page_front_matter['type'] = notion_block['child_page']['title']
93
+ end
94
+ page_title = page_front_matter['title']
95
+
96
+ # Ignore incomplete notion pages
97
+ next unless page_front_matter['date']
98
+ next unless page_front_matter['title']
99
+
100
+ page_file_name_without_extension = page_title.gsub(' ', '-')
101
+ page_file_name = "#{page_file_name_without_extension}.md"
102
+ page_file_names << page_file_name
103
+
104
+ page_path = File.join(destination_dir, page_file_name)
105
+ unless ENV['NOTION_SYNCHRONIZER_SKIP_OPTIMIZATIONS']
106
+ next if File.exist?(page_path) && File.mtime(page_path) >= block_last_edited_at
107
+ end
108
+
109
+ page_front_matter_yaml = page_front_matter.to_yaml.chomp
110
+ page_markdown = NotionToMd.convert(notion_page_id: notion_block_id, token: NOTION_TOKEN)
111
+ page_content = <<-page_CONTENT
112
+ #{page_front_matter_yaml}
113
+ ---
114
+
115
+ #{page_markdown}
116
+ page_CONTENT
117
+ File.write(page_path, page_content)
118
+ end
119
+ old_page_file_names = existing_page_file_names - page_file_names
120
+ old_page_file_names.each do |file_name|
121
+ file_path = File.join(destination_dir, file_name)
122
+ File.delete(file_path) if File.exist?(file_path) && !File.directory?(file_path)
123
+ end
124
+ end
125
+ end
126
+ end
@@ -0,0 +1,3 @@
1
+ class HugoNotion
2
+ VERSION = '0.1.0-alpha.1'
3
+ end
metadata ADDED
@@ -0,0 +1,101 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: hugo-notion
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0.pre.alpha.1
5
+ platform: ruby
6
+ authors:
7
+ - Nisanth Chunduru
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2024-04-15 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: httparty
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: notion_to_md
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: yaml
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description: Write in Notion. Publish with Hugo.
70
+ email:
71
+ - nisanth074@gmail.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - README.md
77
+ - lib/hugo_notion/synchronizer.rb
78
+ - lib/hugo_notion/version.rb
79
+ homepage: https://github.com/nisanthchunduru/hugo-notion
80
+ licenses: []
81
+ metadata: {}
82
+ post_install_message:
83
+ rdoc_options: []
84
+ require_paths:
85
+ - lib
86
+ required_ruby_version: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ required_rubygems_version: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">"
94
+ - !ruby/object:Gem::Version
95
+ version: 1.3.1
96
+ requirements: []
97
+ rubygems_version: 3.4.19
98
+ signing_key:
99
+ specification_version: 4
100
+ summary: Write in Notion. Publish with Hugo.
101
+ test_files: []