File size: 4,251 Bytes
2fb0828
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#!/usr/bin/env python3
"""
HTML to Markdown Converter

This script converts HTML files to Markdown format.
Usage: python html_to_md.py input.html [output.md]
If no output file is specified, it will use the input filename with .md extension.
"""

import sys
import os
import argparse
import html2text
import requests
from urllib.parse import urlparse

def is_url(path):
    """Check if the given path is a URL."""
    parsed = urlparse(path)
    return parsed.scheme != '' and parsed.netloc != ''

def convert_html_to_markdown(html_content, **options):
    """Convert HTML content to Markdown."""
    converter = html2text.HTML2Text()
    
    # Configure converter options
    converter.ignore_links = options.get('ignore_links', False)
    converter.ignore_images = options.get('ignore_images', False)
    converter.ignore_tables = options.get('ignore_tables', False)
    converter.body_width = options.get('body_width', 0)  # 0 means no wrapping
    converter.unicode_snob = options.get('unicode_snob', True)  # Use Unicode instead of ASCII
    converter.wrap_links = options.get('wrap_links', False)
    converter.inline_links = options.get('inline_links', True)
    
    # Convert HTML to Markdown
    return converter.handle(html_content)

def main():
    parser = argparse.ArgumentParser(description='Convert HTML to Markdown')
    parser.add_argument('input', help='Input HTML file or URL')
    parser.add_argument('output', nargs='?', help='Output Markdown file (optional)')
    parser.add_argument('--ignore-links', action='store_true', help='Ignore links in the HTML')
    parser.add_argument('--ignore-images', action='store_true', help='Ignore images in the HTML')
    parser.add_argument('--ignore-tables', action='store_true', help='Ignore tables in the HTML')
    parser.add_argument('--body-width', type=int, default=0, help='Wrap text at this width (0 for no wrapping)')
    parser.add_argument('--unicode', action='store_true', help='Use Unicode characters instead of ASCII approximations')
    parser.add_argument('--wrap-links', action='store_true', help='Wrap links in angle brackets')
    parser.add_argument('--reference-links', action='store_true', help='Use reference style links instead of inline links')
    
    args = parser.parse_args()
    
    # Determine input
    if is_url(args.input):
        try:
            response = requests.get(args.input)
            response.raise_for_status()
            html_content = response.text
        except requests.exceptions.RequestException as e:
            print(f"Error fetching URL: {e}", file=sys.stderr)
            return 1
    else:
        try:
            with open(args.input, 'r', encoding='utf-8') as f:
                html_content = f.read()
        except IOError as e:
            print(f"Error reading file: {e}", file=sys.stderr)
            return 1
    
    # Configure conversion options
    options = {
        'ignore_links': args.ignore_links,
        'ignore_images': args.ignore_images,
        'ignore_tables': args.ignore_tables,
        'body_width': args.body_width,
        'unicode_snob': args.unicode,
        'wrap_links': args.wrap_links,
        'inline_links': not args.reference_links,
    }
    
    # Convert HTML to Markdown
    markdown_content = convert_html_to_markdown(html_content, **options)
    
    # Determine output
    if args.output:
        output_file = args.output
    else:
        if is_url(args.input):
            # Generate a filename from the URL
            url_parts = urlparse(args.input)
            base_name = os.path.basename(url_parts.path) or 'index'
            if not base_name.endswith('.html'):
                base_name += '.html'
            output_file = os.path.splitext(base_name)[0] + '.md'
        else:
            # Generate a filename from the input file
            output_file = os.path.splitext(args.input)[0] + '.md'
    
    # Write output
    try:
        with open(output_file, 'w', encoding='utf-8') as f:
            f.write(markdown_content)
        print(f"Conversion successful! Output saved to: {output_file}")
    except IOError as e:
        print(f"Error writing file: {e}", file=sys.stderr)
        return 1
    
    return 0

if __name__ == "__main__":
    sys.exit(main())