defmodule Notion.Object.Block do @moduledoc """ A block object represents content within Notion. Blocks can be text, lists, media, and more. A page is a type of block, too! https://developers.notion.com/reference/block """ alias Notion.Object # ###### ####### # # # # #### #### # # # # # ##### ###### #### # # # # # # # # # # # # # # # # # # ###### # # # # #### # # # # ##### #### # # # # # # # # # # # ##### # # # # # # # # # # # # # # # # # # # ###### ###### #### #### # # # # # ###### #### # # Paragraph blocks # Heading one blocks # Heading two blocks # Heading three blocks # Callout blocks # Quote blocks # Bulleted list item blocks # Numbered list item blocks # To do blocks # Toggle blocks # Code blocks # Child page blocks # Child database blocks # Embed blocks # Image blocks # Video blocks # File blocks # PDF blocks # Bookmark blocks # Equation blocks # Divider blocks # Table of contents blocks # Breadcrumb blocks # Column List and Column Blocks # Link Preview blocks # Template blocks # Link to page blocks # Synced Block blocks # Table blocks # Table row blocks # Some blocks have more content nested inside them. Some examples are indented paragraphs, lists, # and toggles. The nested content is called children, and children are blocks, too! # Block types which support children are "paragraph", "bulleted_list_item", "numbered_list_item", "toggle", # "to_do", "quote", "callout", "synced_block", "template", "column", "child_page", "child_database", and "table". @doc """ creates a heading 1 block with a singular rich text object https://developers.notion.com/reference/rich-text """ def paragraph_block(content, children \\ [], color \\ "default") def paragraph_block(content, children, color) when is_bitstring(content) and is_list(children) and is_bitstring(color) do %{ type: "paragraph", paragraph: %{ rich_text: [Object.plain_text(content)], color: color, children: children } } end def paragraph_block(content_list, children, color) when is_list(content_list) and is_list(children) and is_bitstring(color) do %{ type: "paragraph", paragraph: %{ rich_text: content_list, color: color, children: children } } end @doc """ This is not an official block, rather a paragraph block that holds a single URL """ def url_block(url, content, color \\ "default") when is_bitstring(content) and is_bitstring(url) and is_bitstring(color) do %{ type: "paragraph", paragraph: %{ rich_text: [ Object.url(url, content, color) ], color: color } } end @doc """ creates a heading 1 block with a singular rich text object """ def heading_1_block(content, color \\ "default") when is_bitstring(content) and is_bitstring(color) do heading_block("heading_1", content, color) end @doc """ creates a heading 2 block with a singular rich text object """ def heading_2_block(content, color \\ "default") when is_bitstring(content) and is_bitstring(color) do heading_block("heading_2", content, color) end @doc """ creates a heading 3 block with a singular rich text object """ def heading_3_block(content, color \\ "default") when is_bitstring(content) and is_bitstring(color) do heading_block("heading_3", content, color) end defp heading_block(type, content, color) when is_bitstring(type) and is_bitstring(content) and is_bitstring(color) do %{ String.to_atom(type) => %{ rich_text: [ Object.plain_text(content) ], color: color }, object: "block", type: type } end @doc """ returns a divider block %{type: "divider", divider: %{}} """ def divider_block() do %{type: "divider", divider: %{}} end end