Markdown to EPUB Converter Skill This skill transforms markdown documents into professional EPUB ebook files. Perfect for converting research documents, blog posts, articles, or chat conversation summaries into portable, device-agnostic ebook formats. Overview The skill accepts markdown content in multiple formats and generates a properly formatted EPUB3 file that works across all major ebook readers including: - Apple Books - Amazon Kindle (via Kindle for Mac/Windows/iOS/Android) - Google Play Books - Kobo and other EPUB readers - Any standard EPUB reader Input Formats Option 1: Raw Markdown…

, content, re.MULTILINE)\n if h1_match:\n self.metadata.title = h1_match.group(1).strip()\n\n def _parse_chapters(self, content: str) -> List[Chapter]:\n \"\"\"\n Parse markdown into chapters.\n\n Chapters are delimited by H1 headers. Content between H1s\n becomes a chapter with potential subsections (H2-H6).\n\n Args:\n content: Markdown content\n\n Returns:\n List of Chapter objects\n \"\"\"\n # First, remove code blocks to avoid matching headers inside them\n # We'll use a placeholder to mark where code blocks were\n code_blocks = []\n code_block_pattern = r'```[^\\n]*\\n.*?```'\n\n def save_code_block(match):\n code_blocks.append(match.group(0))\n return f'\\n__CODE_BLOCK_{len(code_blocks)-1}__\\n'\n\n content_no_code = re.sub(code_block_pattern, save_code_block, content, flags=re.DOTALL)\n\n # Split by H1 headers (now safe from code blocks)\n h1_pattern = r'^# (.+)

Markdown to EPUB Converter Skill This skill transforms markdown documents into professional EPUB ebook files. Perfect for converting research documents, blog posts, articles, or chat conversation summaries into portable, device-agnostic ebook formats. Overview The skill accepts markdown content in multiple formats and generates a properly formatted EPUB3 file that works across all major ebook readers including: - Apple Books - Amazon Kindle (via Kindle for Mac/Windows/iOS/Android) - Google Play Books - Kobo and other EPUB readers - Any standard EPUB reader Input Formats Option 1: Raw Markdown…

\n chapters = []\n\n # Find all H1 headers and their positions in content WITHOUT code blocks\n h1_matches = list(re.finditer(h1_pattern, content_no_code, re.MULTILINE))\n\n if not h1_matches:\n # No chapters, treat entire content as single chapter\n if content.strip():\n sections = self._parse_sections(content, 2) # Start from H2\n chapters.append(Chapter(\n title=\"Untitled\",\n content=\"\",\n sections=sections\n ))\n return chapters\n\n # Process each chapter\n # We need to map positions from content_no_code back to original content\n for i, match in enumerate(h1_matches):\n title = match.group(1).strip()\n start_no_code = match.end()\n\n # Find next H1 or end of content\n if i + 1 \u003c len(h1_matches):\n end_no_code = h1_matches[i + 1].start()\n else:\n end_no_code = len(content_no_code)\n\n # Get the chapter content from content_no_code\n chapter_content_no_code = content_no_code[start_no_code:end_no_code]\n\n # Restore code blocks\n def restore_code_block(match):\n idx = int(match.group(1))\n return code_blocks[idx]\n\n chapter_content = re.sub(r'__CODE_BLOCK_(\\d+)__', restore_code_block, chapter_content_no_code).rstrip()\n\n # Parse sections within this chapter\n sections = self._parse_sections(chapter_content, 2)\n\n # Extract direct content (before first H2)\n direct_content = \"\"\n if sections:\n first_h2_pos = chapter_content.find('\\n##')\n if first_h2_pos == -1:\n direct_content = chapter_content\n else:\n direct_content = chapter_content[:first_h2_pos].strip()\n else:\n direct_content = chapter_content\n\n chapters.append(Chapter(\n title=title,\n content=direct_content,\n sections=sections\n ))\n\n return chapters\n\n def _parse_sections(self, content: str, min_level: int = 2) -> List[Section]:\n \"\"\"\n Parse sections from content (H2 and below).\n\n Args:\n content: Markdown content\n min_level: Minimum header level to parse (2-6)\n\n Returns:\n List of Section objects\n \"\"\"\n sections = []\n\n # Build pattern for headers from min_level to 6\n header_pattern = r'^(#{' + str(min_level) + r',6}) (.+)

Markdown to EPUB Converter Skill This skill transforms markdown documents into professional EPUB ebook files. Perfect for converting research documents, blog posts, articles, or chat conversation summaries into portable, device-agnostic ebook formats. Overview The skill accepts markdown content in multiple formats and generates a properly formatted EPUB3 file that works across all major ebook readers including: - Apple Books - Amazon Kindle (via Kindle for Mac/Windows/iOS/Android) - Google Play Books - Kobo and other EPUB readers - Any standard EPUB reader Input Formats Option 1: Raw Markdown…

\n matches = list(re.finditer(header_pattern, content, re.MULTILINE))\n\n if not matches:\n return sections\n\n for i, match in enumerate(matches):\n hashes = match.group(1)\n level = len(hashes)\n title = match.group(2).strip()\n start = match.end()\n\n # Find next header or end\n if i + 1 \u003c len(matches):\n end = matches[i + 1].start()\n else:\n end = len(content)\n\n section_content = content[start:end].rstrip()\n\n sections.append(Section(\n title=title,\n level=level,\n content=section_content\n ))\n\n return sections\n\n def _build_toc(self) -> List[Dict]:\n \"\"\"\n Build table of contents from chapters and sections.\n\n Returns:\n List of TOC entries with links and hierarchy\n \"\"\"\n toc = []\n\n for chapter in self.chapters:\n chapter_entry = {\n 'title': chapter.title,\n 'anchor': chapter.anchor,\n 'level': 1,\n 'subsections': []\n }\n\n for section in chapter.sections:\n section_entry = {\n 'title': section.title,\n 'anchor': section.anchor,\n 'level': section.level\n }\n chapter_entry['subsections'].append(section_entry)\n\n toc.append(chapter_entry)\n\n return toc\n\n @staticmethod\n def markdown_to_html(markdown_text: str) -> str:\n \"\"\"\n Convert markdown to HTML.\n\n This is a simplified converter for common markdown elements.\n\n Args:\n markdown_text: Markdown text\n\n Returns:\n HTML string\n \"\"\"\n if not markdown_text or not markdown_text.strip():\n return \"\u003cp>\u003c/p>\"\n\n lines = markdown_text.split('\\n')\n html_parts = []\n in_code_block = False\n code_block_content = []\n code_block_language = None\n in_table = False\n table_lines = []\n current_paragraph = []\n\n for line in lines:\n # Handle code blocks\n if line.strip().startswith('```'):\n if in_code_block:\n # End code block\n code_html = '\\n'.join(code_block_content)\n # Add line numbers and syntax highlighting\n code_html = MarkdownProcessor._add_line_numbers_and_highlighting(\n code_html, code_block_language\n )\n html_parts.append(code_html)\n code_block_content = []\n code_block_language = None\n in_code_block = False\n else:\n # Start code block\n if current_paragraph:\n paragraph_text = ' '.join(current_paragraph).strip()\n if paragraph_text:\n html_parts.append(f'\u003cp>{MarkdownProcessor._render_inline(paragraph_text)}\u003c/p>')\n current_paragraph = []\n # Extract language if specified\n lang = line.strip()[3:].strip()\n code_block_language = lang if lang else None\n in_code_block = True\n continue\n\n if in_code_block:\n code_block_content.append(line)\n continue\n\n # Handle tables\n if '|' in line and line.strip().startswith('|') or (line.count('|') >= 2):\n if not in_table:\n # Start table\n if current_paragraph:\n paragraph_text = ' '.join(current_paragraph).strip()\n if paragraph_text:\n html_parts.append(f'\u003cp>{MarkdownProcessor._render_inline(paragraph_text)}\u003c/p>')\n current_paragraph = []\n in_table = True\n table_lines.append(line)\n continue\n elif in_table:\n # End of table\n table_html = MarkdownProcessor._parse_table(table_lines)\n if table_html:\n html_parts.append(table_html)\n table_lines = []\n in_table = False\n # Fall through to process current line\n\n # Handle blockquotes\n if line.strip().startswith('>'):\n if current_paragraph:\n paragraph_text = ' '.join(current_paragraph).strip()\n if paragraph_text:\n html_parts.append(f'\u003cp>{MarkdownProcessor._render_inline(paragraph_text)}\u003c/p>')\n current_paragraph = []\n quote_text = line.lstrip('> ').strip()\n html_parts.append(f'\u003cblockquote>{MarkdownProcessor._render_inline(quote_text)}\u003c/blockquote>')\n continue\n\n # Handle headers\n if line.startswith('#'):\n if current_paragraph:\n paragraph_text = ' '.join(current_paragraph).strip()\n if paragraph_text:\n html_parts.append(f'\u003cp>{MarkdownProcessor._render_inline(paragraph_text)}\u003c/p>')\n current_paragraph = []\n\n level = len(line) - len(line.lstrip('#'))\n header_text = line.lstrip('# ').strip()\n if level \u003c= 6:\n html_parts.append(f'\u003ch{level}>{MarkdownProcessor._render_inline(header_text)}\u003c/h{level}>')\n continue\n\n # Handle lists\n if line.strip().startswith(('- ', '* ')) or re.match(r'^\\d+\\.\\s', line.strip()):\n if current_paragraph:\n paragraph_text = ' '.join(current_paragraph).strip()\n if paragraph_text:\n html_parts.append(f'\u003cp>{MarkdownProcessor._render_inline(paragraph_text)}\u003c/p>')\n current_paragraph = []\n\n list_item = re.sub(r'^[-*\\d.]\\s+', '', line.strip())\n html_parts.append(f'\u003cli>{MarkdownProcessor._render_inline(list_item)}\u003c/li>')\n continue\n\n # Handle horizontal rules\n if line.strip() in ('---', '***', '___'):\n if current_paragraph:\n paragraph_text = ' '.join(current_paragraph).strip()\n if paragraph_text:\n html_parts.append(f'\u003cp>{MarkdownProcessor._render_inline(paragraph_text)}\u003c/p>')\n current_paragraph = []\n html_parts.append('\u003chr/>')\n continue\n\n # Handle empty lines (paragraph break)\n if not line.strip():\n if current_paragraph:\n paragraph_text = ' '.join(current_paragraph).strip()\n if paragraph_text:\n html_parts.append(f'\u003cp>{MarkdownProcessor._render_inline(paragraph_text)}\u003c/p>')\n current_paragraph = []\n continue\n\n # Add to current paragraph\n current_paragraph.append(line.strip())\n\n # Finish any remaining paragraph\n if current_paragraph:\n paragraph_text = ' '.join(current_paragraph).strip()\n if paragraph_text:\n html_parts.append(f'\u003cp>{MarkdownProcessor._render_inline(paragraph_text)}\u003c/p>')\n\n # Finish any remaining table\n if in_table and table_lines:\n table_html = MarkdownProcessor._parse_table(table_lines)\n if table_html:\n html_parts.append(table_html)\n\n html = '\\n'.join(html_parts) if html_parts else '\u003cp>\u003c/p>'\n return html\n\n @staticmethod\n def _render_inline(text: str) -> str:\n \"\"\"\n Render inline markdown elements (bold, italic, links, code).\n\n Args:\n text: Text with inline markdown\n\n Returns:\n HTML string\n \"\"\"\n # Escape HTML special characters first, but be careful with our markers\n text = (text\n .replace('&', '&')\n .replace('\u003c', '<')\n .replace('>', '>'))\n\n # Bold\n text = re.sub(r'\\*\\*(.+?)\\*\\*', r'\u003cstrong>\\1\u003c/strong>', text)\n text = re.sub(r'__(.+?)__', r'\u003cstrong>\\1\u003c/strong>', text)\n\n # Italic\n text = re.sub(r'\\*(.+?)\\*', r'\u003cem>\\1\u003c/em>', text)\n text = re.sub(r'_(.+?)_', r'\u003cem>\\1\u003c/em>', text)\n\n # Inline code\n text = re.sub(r'`(.+?)`', r'\u003ccode>\\1\u003c/code>', text)\n\n # Links\n text = re.sub(r'\\[(.+?)\\]\\((.+?)\\)', r'\u003ca href=\"\\2\">\\1\u003c/a>', text)\n\n return text\n\n @staticmethod\n def _parse_table(table_lines: List[str]) -> str:\n \"\"\"\n Parse markdown table into HTML.\n\n Args:\n table_lines: List of table lines\n\n Returns:\n HTML table string\n \"\"\"\n if not table_lines or len(table_lines) \u003c 2:\n return \"\"\n\n # Remove empty lines\n table_lines = [line.strip() for line in table_lines if line.strip()]\n\n if len(table_lines) \u003c 2:\n return \"\"\n\n # Parse header\n header_line = table_lines[0]\n headers = [cell.strip() for cell in header_line.split('|')]\n headers = [h for h in headers if h] # Remove empty cells\n\n # Skip separator line (second line with dashes)\n if len(table_lines) \u003c 2:\n return \"\"\n\n # Check if second line is separator\n separator = table_lines[1]\n if not re.match(r'^[\\s|:-]+

Markdown to EPUB Converter Skill This skill transforms markdown documents into professional EPUB ebook files. Perfect for converting research documents, blog posts, articles, or chat conversation summaries into portable, device-agnostic ebook formats. Overview The skill accepts markdown content in multiple formats and generates a properly formatted EPUB3 file that works across all major ebook readers including: - Apple Books - Amazon Kindle (via Kindle for Mac/Windows/iOS/Android) - Google Play Books - Kobo and other EPUB readers - Any standard EPUB reader Input Formats Option 1: Raw Markdown…

, separator):\n # Not a valid table\n return \"\"\n\n # Parse data rows\n rows = []\n for line in table_lines[2:]:\n cells = [cell.strip() for cell in line.split('|')]\n cells = [c for c in cells if c] # Remove empty cells from leading/trailing pipes\n if cells:\n rows.append(cells)\n\n # Build HTML table\n html_parts = ['\u003ctable>']\n\n # Header\n html_parts.append('\u003cthead>\u003ctr>')\n for header in headers:\n html_parts.append(f'\u003cth>{MarkdownProcessor._render_inline(header)}\u003c/th>')\n html_parts.append('\u003c/tr>\u003c/thead>')\n\n # Body\n if rows:\n html_parts.append('\u003ctbody>')\n for row in rows:\n html_parts.append('\u003ctr>')\n for i, cell in enumerate(row):\n if i \u003c len(headers): # Don't exceed header count\n html_parts.append(f'\u003ctd>{MarkdownProcessor._render_inline(cell)}\u003c/td>')\n # Fill missing cells\n for i in range(len(row), len(headers)):\n html_parts.append('\u003ctd>\u003c/td>')\n html_parts.append('\u003c/tr>')\n html_parts.append('\u003c/tbody>')\n\n html_parts.append('\u003c/table>')\n\n return '\\n'.join(html_parts)\n\n @staticmethod\n def escape_html(text: str) -> str:\n \"\"\"Escape HTML special characters.\"\"\"\n return (text\n .replace('&', '&')\n .replace('\u003c', '<')\n .replace('>', '>')\n .replace('\"', '"')\n .replace(\"'\", '''))\n\n @staticmethod\n def _add_line_numbers_and_highlighting(code: str, language: Optional[str] = None) -> str:\n \"\"\"\n Add line numbers and syntax highlighting to code block using Pygments.\n\n Args:\n code: Raw code string\n language: Programming language identifier\n\n Returns:\n HTML string with line numbers and syntax highlighting\n \"\"\"\n if PYGMENTS_AVAILABLE and language:\n try:\n # Get the appropriate lexer for the language\n lexer = get_lexer_by_name(language, stripall=False)\n\n # Use Pygments to tokenize and highlight\n from pygments import lex\n from pygments.token import Token\n\n lines = code.split('\\n')\n html_lines = []\n\n for line_num, line in enumerate(lines, 1):\n # Tokenize this line\n tokens = list(lex(line + '\\n', lexer))\n highlighted_parts = []\n\n for token_type, value in tokens:\n # Skip the newline at the end\n if value == '\\n':\n continue\n\n # Escape HTML in the value\n value = (value\n .replace('&', '&')\n .replace('\u003c', '<')\n .replace('>', '>'))\n\n # Map Pygments token types to our CSS classes\n css_class = MarkdownProcessor._get_token_css_class(token_type)\n\n if css_class:\n highlighted_parts.append(f'\u003cspan class=\"{css_class}\">{value}\u003c/span>')\n else:\n highlighted_parts.append(value)\n\n # Add line number and content\n html_lines.append(\n f'\u003cspan class=\"line-number\">{line_num:3d}\u003c/span>'\n f'\u003cspan class=\"line-content\">{\"\".join(highlighted_parts)}\\n\u003c/span>'\n )\n\n # Build final HTML\n safe_lang = re.sub(r'[^a-zA-Z0-9_-]', '', language)\n lang_class = f' language-{safe_lang}' if safe_lang else ''\n return f'\u003cpre class=\"code-block{lang_class}\">\u003ccode>{\"\".join(html_lines)}\u003c/code>\u003c/pre>'\n\n except ClassNotFound:\n # Language not found, fall back to plain text\n pass\n except Exception:\n # Any other error, fall back to plain text\n pass\n\n # Fallback: no syntax highlighting, just line numbers and escaping\n code = (code\n .replace('&', '&')\n .replace('\u003c', '<')\n .replace('>', '>'))\n\n lines = code.split('\\n')\n html_lines = []\n\n for i, line in enumerate(lines, 1):\n html_lines.append(\n f'\u003cspan class=\"line-number\">{i:3d}\u003c/span>'\n f'\u003cspan class=\"line-content\">{line}\\n\u003c/span>'\n )\n\n # Build final HTML\n if language:\n safe_lang = re.sub(r'[^a-zA-Z0-9_-]', '', language)\n lang_class = f' language-{safe_lang}' if safe_lang else ''\n else:\n lang_class = ''\n\n return f'\u003cpre class=\"code-block{lang_class}\">\u003ccode>{\"\".join(html_lines)}\u003c/code>\u003c/pre>'\n\n @staticmethod\n def _get_token_css_class(token_type) -> Optional[str]:\n \"\"\"\n Map Pygments token types to our CSS classes.\n\n Args:\n token_type: Pygments token type\n\n Returns:\n CSS class name or None\n \"\"\"\n from pygments.token import Token\n\n # Map token types to our simpler CSS classes\n if token_type in Token.Keyword:\n return 'syn-keyword'\n elif token_type in Token.String:\n return 'syn-string'\n elif token_type in Token.Comment:\n return 'syn-comment'\n elif token_type in Token.Number:\n return 'syn-number'\n elif token_type in Token.Name.Function:\n return 'syn-function'\n elif token_type in Token.Name.Class:\n return 'syn-class'\n else:\n return None\n\n","content_type":"text/x-python; charset=utf-8","language":"python","size":24090,"content_sha256":"0f9ce77d61e32f832aaca173b1dab4ac19e1e476853dbf469168983836d3cdbf"}],"content_json":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"text":"Markdown to EPUB Converter Skill","type":"text"}]},{"type":"paragraph","content":[{"text":"This skill transforms markdown documents into professional EPUB ebook files. Perfect for converting research documents, blog posts, articles, or chat conversation summaries into portable, device-agnostic ebook formats.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Overview","type":"text"}]},{"type":"paragraph","content":[{"text":"The skill accepts markdown content in multiple formats and generates a properly formatted EPUB3 file that works across all major ebook readers including:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Apple Books","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Amazon Kindle (via Kindle for Mac/Windows/iOS/Android)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Google Play Books","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Kobo and other EPUB readers","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Any standard EPUB reader","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Input Formats","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Option 1: Raw Markdown Text","type":"text"}]},{"type":"paragraph","content":[{"text":"Provide markdown content directly in your message:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"Convert this markdown to EPUB:\n# My Book Title\n## Chapter 1\nThis is chapter one content...","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Option 2: File Path","type":"text"}]},{"type":"paragraph","content":[{"text":"Provide a path to a markdown file to be converted.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"How It Works","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Markdown Parsing","type":"text","marks":[{"type":"strong"}]},{"text":": Analyzes your markdown and automatically:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Treats H1 headers (","type":"text"},{"text":"#","type":"text","marks":[{"type":"code_inline"}]},{"text":") as chapter boundaries","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Treats H2 headers (","type":"text"},{"text":"##","type":"text","marks":[{"type":"code_inline"}]},{"text":") as section headings within chapters","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Preserves formatting (bold, italic, links, lists, code blocks)","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Structure Generation","type":"text","marks":[{"type":"strong"}]},{"text":": Creates proper EPUB structure:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Automatic table of contents from chapters","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Navigation document (EPUB3 standard)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Metadata (title, language, etc.)","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"File Creation","type":"text","marks":[{"type":"strong"}]},{"text":": Generates a valid EPUB3 file ready for download and use","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Usage Examples","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Example 1: Convert a Blog Post","type":"text"}]},{"type":"paragraph","content":[{"text":"\"Convert this markdown blog post to EPUB:","type":"text"}]},{"type":"heading","attrs":{"level":1},"content":[{"text":"How to Build a Simple Web Server","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Introduction","type":"text"}]},{"type":"paragraph","content":[{"text":"...content...\"","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Example 2: Convert a Research Summary","type":"text"}]},{"type":"paragraph","content":[{"text":"\"I have research notes in markdown format. Convert them to an EPUB ebook. The content is:","type":"text"}]},{"type":"heading","attrs":{"level":1},"content":[{"text":"Research Project: Machine Learning Basics","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Chapter 1: Fundamentals","type":"text"}]},{"type":"paragraph","content":[{"text":"...\"","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Example 3: Convert a Chat Summary","type":"text"}]},{"type":"paragraph","content":[{"text":"\"Summarize our conversation so far as markdown and convert it to an EPUB for reference\"","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Output","type":"text"}]},{"type":"paragraph","content":[{"text":"The skill generates a downloadable EPUB file that includes:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Professional formatting","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Automatic table of contents","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Proper chapter structure","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Support for markdown formatting elements:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Headers (all levels)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Bold and italic text","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Hyperlinks","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Lists (ordered and unordered)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Code blocks and inline code","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Blockquotes","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Horizontal rules","type":"text"}]}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Markdown Elements Supported","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Element","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Markdown","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Support","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Notes","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Headers","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"# H1","type":"text","marks":[{"type":"code_inline"}]},{"text":" through ","type":"text"},{"text":"###### H6","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Full","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Auto TOC generation","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Bold","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"**text**","type":"text","marks":[{"type":"code_inline"}]},{"text":" or ","type":"text"},{"text":"__text__","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Full","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph"}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Italic","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"*text*","type":"text","marks":[{"type":"code_inline"}]},{"text":" or ","type":"text"},{"text":"_text_","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Full","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph"}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Links","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"[text](url)","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Full","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Clickable in ebooks","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Lists","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"- item","type":"text","marks":[{"type":"code_inline"}]},{"text":" or ","type":"text"},{"text":"1. item","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Full","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Nested lists supported","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Code blocks","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"```language","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Enhanced","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Syntax highlighting ready, monospace fonts","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Inline code","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":" ","type":"text","marks":[{"type":"code_inline"}]},{"text":"code","type":"text"},{"text":" ","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Enhanced","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Styled background, borders","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Tables","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Markdown tables","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Enhanced","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Styled headers, alternating rows","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Blockquotes","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"> quote","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Full","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Styled with left border","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Horizontal rule","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"---","type":"text","marks":[{"type":"code_inline"}]},{"text":" or ","type":"text"},{"text":"***","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Full","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Advanced Features","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Enhanced Code Block Support","type":"text"}]},{"type":"paragraph","content":[{"text":"Code blocks are beautifully formatted with:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Premium monospace fonts","type":"text","marks":[{"type":"strong"}]},{"text":": SF Mono, Monaco, Fira Code, Consolas, and more","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Styled backgrounds","type":"text","marks":[{"type":"strong"}]},{"text":": Subtle gray background with blue accent border","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Language detection","type":"text","marks":[{"type":"strong"}]},{"text":": Specify language after ","type":"text"},{"text":"```","type":"text","marks":[{"type":"code_inline"}]},{"text":" for future syntax highlighting","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Proper escaping","type":"text","marks":[{"type":"strong"}]},{"text":": HTML characters are safely escaped","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Overflow handling","type":"text","marks":[{"type":"strong"}]},{"text":": Horizontal scrolling for long lines","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Example:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"python"},"content":[{"text":"def fibonacci(n):\n if n \u003c= 1:\n return n\n return fibonacci(n-1) + fibonacci(n-2)","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Enhanced Table Support","type":"text"}]},{"type":"paragraph","content":[{"text":"Tables are rendered with professional styling:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Styled headers","type":"text","marks":[{"type":"strong"}]},{"text":": Blue background with white text","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Alternating rows","type":"text","marks":[{"type":"strong"}]},{"text":": Zebra striping for readability","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Cell padding","type":"text","marks":[{"type":"strong"}]},{"text":": Comfortable spacing for easy reading","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Inline formatting","type":"text","marks":[{"type":"strong"}]},{"text":": Code, bold, italic, and links work in cells","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Responsive","type":"text","marks":[{"type":"strong"}]},{"text":": Tables adapt to different screen sizes","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Example:","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Feature","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Status","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Notes","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Headers","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"✓","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Full support","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Code","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"✓","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Enhanced styling","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Tables","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"✓","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Professional layout","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Custom Title and Metadata","type":"text"}]},{"type":"paragraph","content":[{"text":"You can specify EPUB metadata:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Book title (defaults to first H1 header)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Author name","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Language","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Publication date","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Chapter Organization","type":"text"}]},{"type":"paragraph","content":[{"text":"Chapters are automatically detected from:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"H1 headers (","type":"text"},{"text":"#","type":"text","marks":[{"type":"code_inline"}]},{"text":") as primary chapter breaks","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Logical content sections between H1s","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Automatic page breaks between chapters","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Styling","type":"text"}]},{"type":"paragraph","content":[{"text":"The generated EPUB uses clean, readable default styling that:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Respects the reader's font preferences","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Works on all screen sizes","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Maintains proper spacing and hierarchy","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Includes appropriate margins and padding","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Technical Details","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Format","type":"text","marks":[{"type":"strong"}]},{"text":": EPUB3 (compatible with all modern readers)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Encoding","type":"text","marks":[{"type":"strong"}]},{"text":": UTF-8","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"HTML Version","type":"text","marks":[{"type":"strong"}]},{"text":": XHTML 1.1","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"CSS Support","type":"text","marks":[{"type":"strong"}]},{"text":": Responsive styling","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Downloading Your EPUB","type":"text"}]},{"type":"paragraph","content":[{"text":"After generation, the file will be available for download. You can then:","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Download the EPUB to your computer","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Open it with your preferred ebook reader","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Transfer to your Kindle, iPad, or other device","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Upload directly to Kindle via email or cloud","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Tips for Best Results","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Use Proper Markdown Structure","type":"text","marks":[{"type":"strong"}]},{"text":": The skill works best when markdown follows standard conventions (H1 for titles, H2 for sections)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Clear Chapter Breaks","type":"text","marks":[{"type":"strong"}]},{"text":": Use H1 headers to clearly mark chapter divisions","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Descriptive Headers","type":"text","marks":[{"type":"strong"}]},{"text":": Headers become the table of contents, so make them clear and descriptive","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Content Organization","type":"text","marks":[{"type":"strong"}]},{"text":": Place content logically between headers","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Supported Formatting","type":"text","marks":[{"type":"strong"}]},{"text":": Stick to basic markdown formatting for best compatibility across all readers","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Troubleshooting","type":"text"}]},{"type":"paragraph","content":[{"text":"EPUB doesn't open","type":"text","marks":[{"type":"strong"}]},{"text":": Ensure your markdown is properly formatted. Check for matching brackets in links and proper syntax.","type":"text"}]},{"type":"paragraph","content":[{"text":"Table of contents is empty","type":"text","marks":[{"type":"strong"}]},{"text":": Make sure your markdown includes H1 headers to define chapters.","type":"text"}]},{"type":"paragraph","content":[{"text":"Formatting looks different","type":"text","marks":[{"type":"strong"}]},{"text":": EPUB readers apply their own fonts and styling. This is normal and expected behavior.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Scripts","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"epub_generator.py","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Core EPUB file creation and formatting","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"markdown_processor.py","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Markdown parsing and structure extraction","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Future Enhancements","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Auto-generated cover pages with custom images","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Kindle-specific optimizations (.mobi format)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Custom CSS styling per user preferences","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Multi-document merging","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Image embedding and optimization","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Advanced metadata support","type":"text"}]}]}]}]},"metadata":{"date":"2026-11-02","name":"markdown-to-epub-converter","author":"@skillopedia","source":{"stars":170,"repo_name":"claude-epub-skill","origin_url":"https://github.com/smerchek/claude-epub-skill/blob/HEAD/markdown-to-epub/SKILL.md","repo_owner":"smerchek","body_sha256":"fa7ceaf36ab0c22390830f849ea2b5cb3100cd2d87a9b2c17e160c9e42bb5592","cluster_key":"91abe6acb7c7fcf6eafa638dc580e5857bec8c10c0c4a0ceca5f8bd781c3d68a","clean_bundle":{"format":"clean-skill-bundle-v1","source":"smerchek/claude-epub-skill/markdown-to-epub/SKILL.md","text_bytes":45765,"source_commit":"7c0723087b9f6ec2352b42b73f61d224b542e059","skills_sh_rank":16037,"attachment_count":4,"text_attachments":4,"attachment_storage":"skill_attachments","binary_attachments":0},"cluster_size":1,"skill_md_path":"markdown-to-epub/SKILL.md","import_metadata":{"date":"2026-11-02","author":"@skillopedia","version":"v1","category":"documents-office","category_label":"Documents"},"exact_dupes_collapsed_into_this":0},"version":"v1","category":"documents-office","import_tag":"skills-sh-top20k-2026-11","description":"Convert markdown documents and chat summaries into formatted EPUB ebook files that can be read on any device or uploaded to Kindle."}},"renderedAt":1793666582488}

Markdown to EPUB Converter Skill This skill transforms markdown documents into professional EPUB ebook files. Perfect for converting research documents, blog posts, articles, or chat conversation summaries into portable, device-agnostic ebook formats. Overview The skill accepts markdown content in multiple formats and generates a properly formatted EPUB3 file that works across all major ebook readers including: - Apple Books - Amazon Kindle (via Kindle for Mac/Windows/iOS/Android) - Google Play Books - Kobo and other EPUB readers - Any standard EPUB reader Input Formats Option 1: Raw Markdown…