notion_to_md 2.5.0 → 2.5.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4137f1edccac5aceec8f5195beb513019ec2ad84c52c5495a1d9842098dd2b4d
4
- data.tar.gz: 51a57a1bf294d1c2cf3d0be1e24c693aa633c3c873fe864a9f2864fec6194ecb
3
+ metadata.gz: bb8852f9013936bcb404e0779e4930e84831e2db4235b2f0bca8268a9e4edaf0
4
+ data.tar.gz: d3b9fe50d279cfc14abf20d7f8468d1534b043b73e00ee8123248556c03b43bf
5
5
  SHA512:
6
- metadata.gz: 32e4a48a21d956bba91ba88d3aa3db0fdb6f7b0f54f55fcd44fdb07dd15842247ab6150b06f0f82a828ef8f0f632d158e746f54007afdd85357c41e75167b203
7
- data.tar.gz: b9aa39eeb9b5cb105a8ebf48ca78fe4e88c0a9a7c013f63dc0057dc3adf0ffcfd0cbd2c72df87b83d5e5eafaaa9605e26a0c44f63852af4be9e87e37f752d6cc
6
+ metadata.gz: e49f3a1d040fb7381e8369c774cff8a31a510909c3e7813c4ba8016085075d613d01808a23a8075d9d9246335eadd1e08347225d287c702c07753df44f3f3af7
7
+ data.tar.gz: 52806a867c8d24e96e993c4a07741ff13322d14151e0285351c341237a772579f7084913764112f703435e963d598754e326e0c047c29f2d74f4ce6b58f68951
data/README.md CHANGED
@@ -85,6 +85,7 @@ Everything in a notion page body is a [block object](https://developers.notion.c
85
85
  * `file`
86
86
  * `pdf`
87
87
  * `video`
88
+ * `equation`
88
89
 
89
90
  ### Nested blocks
90
91
 
@@ -4,6 +4,9 @@ require 'forwardable'
4
4
 
5
5
  class NotionToMd
6
6
  module Blocks
7
+ # === NotionToMd::Blocks::Block
8
+ #
9
+ # This class is responsible for converting Notion blocks to markdown.
7
10
  class Block
8
11
  extend Forwardable
9
12
 
@@ -2,6 +2,9 @@
2
2
 
3
3
  class NotionToMd
4
4
  module Blocks
5
+ # === NotionToMd::Blocks::Builder
6
+ #
7
+ # This class is responsible for building a tree of blocks from the Notion API.
5
8
  class Builder
6
9
  ##
7
10
  # Array containing the block types allowed to have nested blocks (children).
@@ -2,7 +2,11 @@
2
2
 
3
3
  class NotionToMd
4
4
  module Blocks
5
+ # === NotionToMd::Blocks::Factory
6
+ #
7
+ # Factory class to create block instances based on the block type
5
8
  class Factory
9
+ # rubocop:disable Metrics/MethodLength
6
10
  def self.build(block:, children: [])
7
11
  case block.type.to_sym
8
12
  when :table
@@ -19,6 +23,7 @@ class NotionToMd
19
23
  Blocks::Block.new(block: block, children: children)
20
24
  end
21
25
  end
26
+ # rubocop:enable Metrics/MethodLength
22
27
  end
23
28
  end
24
29
  end
@@ -2,6 +2,9 @@
2
2
 
3
3
  class NotionToMd
4
4
  module Blocks
5
+ # === NotionToMd::Blocks::Normalizer
6
+ #
7
+ # This class is responsible for normalizing blocks of the same type
5
8
  class Normalizer
6
9
  # === Parameters
7
10
  # blocks::
@@ -27,27 +30,37 @@ class NotionToMd
27
30
  new_blocks = []
28
31
 
29
32
  normalized_blocks.each do |block|
30
- if block.type.to_sym == type
33
+ if block_of_type?(block, type)
31
34
  blocks_to_normalize << block
32
35
  else
33
36
  # When we encounter a block that is not of the provided type,
34
37
  # we need to normalize the blocks we've collected so far.
35
38
  # Then we add the current block to the new blocks array.
36
- # This is because we want to keep the order of the blocks.
37
- new_blocks << new_block_and_reset_blocks_to_normalize(type) unless blocks_to_normalize.empty?
39
+ # This is to keep the order of the blocks as they are in the original array.
40
+ flush_blocks_to_normalize_into(new_blocks, type)
38
41
  new_blocks << block
39
42
  end
40
43
  end
41
44
 
42
45
  # If the last block is the provided type, it won't be added to the new blocks array.
43
46
  # So, we need to normalize the blocks we've collected so far.
44
- new_blocks << new_block_and_reset_blocks_to_normalize(type) unless blocks_to_normalize.empty?
47
+ flush_blocks_to_normalize_into(new_blocks, type)
45
48
 
46
49
  normalized_blocks.replace(new_blocks)
47
50
  end
48
51
 
49
52
  private
50
53
 
54
+ def block_of_type?(block, type)
55
+ block.type.to_sym == type
56
+ end
57
+
58
+ def flush_blocks_to_normalize_into(new_blocks, type)
59
+ return if blocks_to_normalize.empty?
60
+
61
+ new_blocks << new_block_and_reset_blocks_to_normalize(type)
62
+ end
63
+
51
64
  def new_block_and_reset_blocks_to_normalize(type)
52
65
  new_block = new_block_for(type, blocks_to_normalize)
53
66
  @blocks_to_normalize = []
@@ -111,6 +111,10 @@ class NotionToMd
111
111
  file(block)
112
112
  end
113
113
 
114
+ def equation(block)
115
+ "$$#{block['expression']}$$"
116
+ end
117
+
114
118
  private
115
119
 
116
120
  def convert_table_row(cells)
@@ -15,6 +15,9 @@ require_relative './blocks/to_do_list_block'
15
15
  require_relative './blocks/to_do_list_item_block'
16
16
 
17
17
  class NotionToMd
18
+ # === NotionToMd::Blocks
19
+ #
20
+ # This module is responsible for building Notion blocks.
18
21
  module Blocks
19
22
  # === Parameters
20
23
  # block_id::
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class NotionToMd
2
4
  module Helpers
3
5
  module YamlSanitizer
@@ -1 +1,3 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative './helpers/yaml_sanitizer'
@@ -1,6 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class NotionToMd
4
+ # === NotionToMd::Page
5
+ #
6
+ # This class is responsible for representing a Notion page.
4
7
  class Page
5
8
  include Helpers::YamlSanitizer
6
9
 
@@ -81,17 +84,10 @@ class NotionToMd
81
84
  end
82
85
 
83
86
  def custom_props
84
- @custom_props ||= page.properties.each_with_object({}) do |prop, memo|
85
- name = prop.first
86
- value = prop.last # Notion::Messages::Message
87
- type = value.type
88
-
89
- next memo unless CustomProperty.respond_to?(type.to_sym)
90
-
91
- memo[name.parameterize.underscore] = CustomProperty.send(type, value)
92
- end.reject { |_k, v| v.presence.nil? }
87
+ @custom_props ||= filtered_custom_properties
93
88
  end
94
89
 
90
+ # rubocop:disable Metrics/MethodLength
95
91
  def default_props
96
92
  @default_props ||= {
97
93
  'id' => id,
@@ -107,10 +103,35 @@ class NotionToMd
107
103
  'last_edited_by_id' => last_edited_by_id
108
104
  }
109
105
  end
106
+ # rubocop:enable Metrics/MethodLength
110
107
 
111
108
  # This class is kept for retro compatibility reasons.
112
109
  # Use instead the PageProperty class.
113
110
  class CustomProperty < PageProperty
114
111
  end
112
+
113
+ private
114
+
115
+ def filtered_custom_properties
116
+ build_custom_properties.reject { |_k, v| v.presence.nil? }
117
+ end
118
+
119
+ def build_custom_properties
120
+ page.properties.each_with_object({}) do |(name, value), memo|
121
+ type = value.type
122
+ next unless valid_custom_property_type?(type)
123
+
124
+ key = name.parameterize.underscore
125
+ memo[key] = build_custom_property(type, value)
126
+ end
127
+ end
128
+
129
+ def valid_custom_property_type?(type)
130
+ CustomProperty.respond_to?(type.to_sym)
131
+ end
132
+
133
+ def build_custom_property(type, value)
134
+ CustomProperty.send(type, value)
135
+ end
115
136
  end
116
137
  end
@@ -66,7 +66,7 @@ class NotionToMd
66
66
  end
67
67
 
68
68
  def checkbox(prop)
69
- prop[:checkbox].nil? ? nil : prop[:checkbox].to_s
69
+ prop[:checkbox]&.to_s
70
70
  rescue NoMethodError
71
71
  nil
72
72
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class NotionToMd
2
4
  class Text
3
5
  class << self
@@ -6,7 +8,7 @@ class NotionToMd
6
8
  end
7
9
 
8
10
  def equation(text)
9
- "$$ #{text[:plain_text]} $$"
11
+ "$`#{text[:plain_text]}`$"
10
12
  end
11
13
  end
12
14
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class NotionToMd
4
- VERSION = '2.5.0'
4
+ VERSION = '2.5.1'
5
5
  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.5.0
4
+ version: 2.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Enrique Arias
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-04-10 00:00:00.000000000 Z
11
+ date: 2025-04-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport