notion_to_md 2.4.1 → 2.5.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: 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