notion_to_md 2.4.1 → 2.5.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d2c563b14bee2d927bd6f37cbbc18f59f52545bdc02bcb74e865657231a8d926
4
- data.tar.gz: e99d9b5e01e3c042e26818ea5eb8b7652701fca9d3a1d94f1c4b5cc41efdca8b
3
+ metadata.gz: 4137f1edccac5aceec8f5195beb513019ec2ad84c52c5495a1d9842098dd2b4d
4
+ data.tar.gz: 51a57a1bf294d1c2cf3d0be1e24c693aa633c3c873fe864a9f2864fec6194ecb
5
5
  SHA512:
6
- metadata.gz: 0f523319dad22eeae015ab2e52bbd24f04d34acf9f654e4d92a9dcebed1e3a0255f08d8492af371347d2fc81d3acf24d0ef0e51d3a0708a2d143485056e783b9
7
- data.tar.gz: 8d01b8e6d570da473aa38eb32391f26841ec49e75809ea5733f94974a37a495d731200f3c24a2e3909579ee9ffc1d7d3fcb8b1523fb3070a9d87a711af2be8d9
6
+ metadata.gz: 32e4a48a21d956bba91ba88d3aa3db0fdb6f7b0f54f55fcd44fdb07dd15842247ab6150b06f0f82a828ef8f0f632d158e746f54007afdd85357c41e75167b203
7
+ data.tar.gz: b9aa39eeb9b5cb105a8ebf48ca78fe4e88c0a9a7c013f63dc0057dc3adf0ffcfd0cbd2c72df87b83d5e5eafaaa9605e26a0c44f63852af4be9e87e37f752d6cc
data/README.md CHANGED
@@ -1,6 +1,8 @@
1
1
  # notion_to_md
2
2
  Notion Markdown Exporter in Ruby.
3
3
 
4
+ The generated document is compliant with the [GitHub Flavored Markdown specification](https://github.github.com/gfm/).
5
+
4
6
  ## Installation
5
7
  Use gem to install.
6
8
  ```bash
@@ -28,8 +30,6 @@ md = notion_converter.convert
28
30
  Since v2.3 you can also use the convenient `convert` method from the root module.
29
31
 
30
32
  ```ruby
31
- require 'notion_to_md'
32
-
33
33
  md = NotionToMd.convert(page_id: 'b91d5...', token: 'secret_...')
34
34
  ```
35
35
 
@@ -40,15 +40,27 @@ $ export NOTION_TOKEN=<secret_...>
40
40
  ```
41
41
 
42
42
  ```ruby
43
- require 'notion_to_md'
44
-
45
43
  notion_converter = NotionToMd::Converter.new(page_id: 'b91d5...')
46
44
  md = notion_converter.convert
47
45
  # or
48
46
  md = NotionToMd.convert(page_id: 'b91d5...')
49
47
  ```
50
48
 
51
- And that's all. The `md` is a string variable containing the notion page formatted in markdown.
49
+ And that's all. The `md` is a string variable containing the notion document formatted in markdown.
50
+
51
+ ### Callable
52
+
53
+ From version 2.5.0, the `call` method is also available. It's an alias for `convert`.
54
+
55
+ ```ruby
56
+ md = NotionToMd.call(page_id: 'b91d5...')
57
+ ```
58
+
59
+ The `call` method also supports the passing of a block.
60
+
61
+ ```ruby
62
+ NotionToMd.call(page_id: 'b91d5...') { puts _1 }
63
+ ```
52
64
 
53
65
  ## Blocks
54
66
 
@@ -69,6 +81,10 @@ Everything in a notion page body is a [block object](https://developers.notion.c
69
81
  * `table`
70
82
  * `embed`
71
83
  * `code`
84
+ * `link_preview`
85
+ * `file`
86
+ * `pdf`
87
+ * `video`
72
88
 
73
89
  ### Nested blocks
74
90
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  require 'forwardable'
4
4
 
5
- module NotionToMd
5
+ class NotionToMd
6
6
  module Blocks
7
7
  class Block
8
8
  extend Forwardable
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module NotionToMd
3
+ class NotionToMd
4
4
  module Blocks
5
5
  class Builder
6
6
  ##
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module NotionToMd
3
+ class NotionToMd
4
4
  module Blocks
5
5
  class BulletedListBlock < Block
6
6
  def initialize(children: [])
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module NotionToMd
3
+ class NotionToMd
4
4
  module Blocks
5
5
  class BulletedListItemBlock < Block
6
6
  def newline
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module NotionToMd
3
+ class NotionToMd
4
4
  module Blocks
5
5
  class Factory
6
6
  def self.build(block:, children: [])
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module NotionToMd
3
+ class NotionToMd
4
4
  module Blocks
5
5
  class Normalizer
6
6
  # === Parameters
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module NotionToMd
3
+ class NotionToMd
4
4
  module Blocks
5
5
  class NumberedListBlock < BulletedListBlock
6
6
  def type
@@ -2,7 +2,7 @@
2
2
 
3
3
  require_relative './bulleted_list_item_block'
4
4
 
5
- module NotionToMd
5
+ class NotionToMd
6
6
  module Blocks
7
7
  class NumberedListItemBlock < BulletedListItemBlock
8
8
  # === Parameters:
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module NotionToMd
3
+ class NotionToMd
4
4
  module Blocks
5
5
  class TableBlock < Block
6
6
  def to_md
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module NotionToMd
3
+ class NotionToMd
4
4
  module Blocks
5
5
  class TableRowBlock < Block
6
6
  def newline
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module NotionToMd
3
+ class NotionToMd
4
4
  module Blocks
5
5
  class ToDoListBlock < BulletedListBlock
6
6
  def type
@@ -2,7 +2,7 @@
2
2
 
3
3
  require_relative './bulleted_list_item_block'
4
4
 
5
- module NotionToMd
5
+ class NotionToMd
6
6
  module Blocks
7
7
  class ToDoListItemBlock < BulletedListItemBlock
8
8
  def newline
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module NotionToMd
3
+ class NotionToMd
4
4
  module Blocks
5
5
  class Types
6
6
  class << self
@@ -89,6 +89,28 @@ module NotionToMd
89
89
  "|#{block[:cells].map(&method(:convert_table_row)).join('|')}|"
90
90
  end
91
91
 
92
+ def link_preview(block)
93
+ url = block[:url]
94
+
95
+ "[#{url}](#{url})"
96
+ end
97
+
98
+ def file(block)
99
+ type = block[:type].to_sym
100
+ url = block.dig(type, :url)
101
+ caption = convert_caption(block)
102
+
103
+ "[#{url}](#{url})\n\n#{caption}"
104
+ end
105
+
106
+ def pdf(block)
107
+ file(block)
108
+ end
109
+
110
+ def video(block)
111
+ file(block)
112
+ end
113
+
92
114
  private
93
115
 
94
116
  def convert_table_row(cells)
@@ -14,7 +14,7 @@ require_relative './blocks/numbered_list_item_block'
14
14
  require_relative './blocks/to_do_list_block'
15
15
  require_relative './blocks/to_do_list_item_block'
16
16
 
17
- module NotionToMd
17
+ class NotionToMd
18
18
  module Blocks
19
19
  # === Parameters
20
20
  # block_id::
@@ -1,15 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module NotionToMd
4
- ##
3
+ class NotionToMd
5
4
  # The Converter class allows to transform notion pages to markdown documents.
6
5
  # Just create a new Converter instance by providing the page_id:
7
6
  # page_converter = NotionToMd::Converter.new(page_id: '9dc17c9c9d2e469dbbf0f9648f3288d3')
8
7
  # Then, call for convert to obtain the markdown document:
9
8
  # page_converter.convert
10
-
11
9
  class Converter
12
- attr_reader :page_id
10
+ include Callee
11
+
12
+ attr_reader :page_id, :frontmatter
13
13
 
14
14
  # === Parameters
15
15
  # page_id::
@@ -20,9 +20,10 @@ module NotionToMd
20
20
  # === Returns
21
21
  # A NotionToMd::Converter object.
22
22
  #
23
- def initialize(page_id:, token: nil)
23
+ def initialize(page_id:, token: nil, frontmatter: false)
24
24
  @notion = Notion::Client.new(token: token || ENV['NOTION_TOKEN'])
25
25
  @page_id = page_id
26
+ @frontmatter = frontmatter
26
27
  end
27
28
 
28
29
  # === Parameters
@@ -40,6 +41,14 @@ module NotionToMd
40
41
  MD
41
42
  end
42
43
 
44
+ def call
45
+ md = convert frontmatter: frontmatter
46
+
47
+ yield md if block_given?
48
+
49
+ md
50
+ end
51
+
43
52
  private
44
53
 
45
54
  def page
@@ -1,4 +1,4 @@
1
- module NotionToMd
1
+ class NotionToMd
2
2
  module Helpers
3
3
  module YamlSanitizer
4
4
  # Escape the frontmatter value if it contains a colon or a dash followed by a space
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module NotionToMd
3
+ class NotionToMd
4
4
  class Logger
5
5
  @logger = ::Logger.new($stdout)
6
6
 
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module NotionToMd
3
+ class NotionToMd
4
4
  class Page
5
5
  include Helpers::YamlSanitizer
6
6
 
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module NotionToMd
3
+ class NotionToMd
4
4
  class PageProperty
5
5
  class << self
6
6
  include Helpers::YamlSanitizer
@@ -1,4 +1,4 @@
1
- module NotionToMd
1
+ class NotionToMd
2
2
  class Text
3
3
  class << self
4
4
  def text(text)
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module NotionToMd
3
+ class NotionToMd
4
4
  ##
5
5
  # Append the text type:
6
6
  # * italic: boolean,
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module NotionToMd
4
- VERSION = '2.4.1'
3
+ class NotionToMd
4
+ VERSION = '2.5.0'
5
5
  end
data/lib/notion_to_md.rb CHANGED
@@ -4,6 +4,7 @@ require 'notion'
4
4
  require 'logger'
5
5
  require 'active_support/inflector'
6
6
  require 'active_support/core_ext/object/blank'
7
+ require 'callee'
7
8
  require_relative './notion_to_md/helpers'
8
9
  require_relative './notion_to_md/version'
9
10
  require_relative './notion_to_md/converter'
@@ -14,7 +15,18 @@ require_relative './notion_to_md/blocks'
14
15
  require_relative './notion_to_md/text'
15
16
  require_relative './notion_to_md/text_annotation'
16
17
 
17
- module NotionToMd
18
+ # The NotionToMd class allows to transform notion pages to markdown documents.
19
+ class NotionToMd
20
+ include Callee
21
+
22
+ attr_reader :page_id, :token, :frontmatter
23
+
24
+ def initialize(page_id:, token: nil, frontmatter: false)
25
+ @page_id = page_id
26
+ @token = token || ENV['NOTION_TOKEN']
27
+ @frontmatter = frontmatter
28
+ end
29
+
18
30
  # === Parameters
19
31
  # page_id::
20
32
  # A string representing the notion page id.
@@ -29,4 +41,12 @@ module NotionToMd
29
41
  def self.convert(page_id:, token: nil, frontmatter: false)
30
42
  Converter.new(page_id: page_id, token: token).convert(frontmatter: frontmatter)
31
43
  end
44
+
45
+ def call
46
+ md = self.class.convert(page_id: page_id, token: token, frontmatter: frontmatter)
47
+
48
+ yield md if block_given?
49
+
50
+ md
51
+ end
32
52
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: notion_to_md
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.4.1
4
+ version: 2.5.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: 2023-12-20 00:00:00.000000000 Z
11
+ date: 2024-04-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '7'
27
+ - !ruby/object:Gem::Dependency
28
+ name: callee
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.3.6
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.3.6
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: notion-ruby-client
29
43
  requirement: !ruby/object:Gem::Requirement