File size: 5,129 Bytes
10099e5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6f47c8c
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
from flask import Flask, render_template, request, jsonify
import requests
import base64
import markdown
from bs4 import BeautifulSoup
import os

app = Flask(__name__)

# GitHub API base URL
GITHUB_API = "https://api.github.com/repos/"

def get_repo_contents(repo_url):
    """Extract contents from GitHub repo URL"""
    try:
        # Extract owner and repo name from URL
        parts = repo_url.rstrip('/').split('/')
        owner, repo = parts[-2], parts[-1]
        
        # Get repository contents
        api_url = f"{GITHUB_API}{owner}/{repo}/contents"
        response = requests.get(api_url)
        response.raise_for_status()
        
        return owner, repo, response.json()
    except Exception as e:
        return None, None, str(e)

def process_file_content(file_info, owner, repo):
    """Process individual file content"""
    content = ""
    file_path = file_info['path']
    
    if file_info['type'] == 'file':
        # Get file content
        file_url = f"{GITHUB_API}{owner}/{repo}/contents/{file_path}"
        file_response = requests.get(file_url)
        file_data = file_response.json()
        
        if 'content' in file_data:
            # Decode base64 content
            decoded_content = base64.b64decode(file_data['content']).decode('utf-8')
            content = f"### File: {file_path}\n```{(file_path.split('.')[-1] if '.' in file_path else 'text')}\n{decoded_content}\n```\n\n"
    
    return content

def create_markdown_document(repo_url):
    """Create markdown document from repo contents"""
    owner, repo, contents = get_repo_contents(repo_url)
    
    if isinstance(contents, str):  # Error case
        return f"Error: {contents}"
    
    markdown_content = f"# Repository: {owner}/{repo}\n\n"
    markdown_content += "Below are the contents of all files in the repository:\n\n"
    
    # Process each file recursively
    for item in contents:
        markdown_content += process_file_content(item, owner, repo)
    
    return markdown_content

@app.route('/')
def index():
    """Render the main page"""
    return render_template('index.html')

@app.route('/process', methods=['POST'])
def process_repo():
    """Process the repository URL and return markdown"""
    repo_url = request.json.get('repo_url')
    if not repo_url:
        return jsonify({'error': 'Please provide a repository URL'}), 400
    
    markdown_content = create_markdown_document(repo_url)
    
    # Convert markdown to HTML for display
    html_content = markdown.markdown(markdown_content)
    
    return jsonify({
        'markdown': markdown_content,
        'html': html_content
    })

# HTML template
html_template = """
<!DOCTYPE html>
<html>
<head>
    <title>GitHub Repo to Markdown</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            margin: 20px;
            max-width: 1200px;
            margin: 0 auto;
        }
        .container {
            padding: 20px;
        }
        textarea {
            width: 100%;
            height: 400px;
            margin-top: 20px;
            font-family: monospace;
        }
        button {
            padding: 10px 20px;
            background-color: #4CAF50;
            color: white;
            border: none;
            cursor: pointer;
        }
        button:hover {
            background-color: #45a049;
        }
        #output {
            margin-top: 20px;
            border: 1px solid #ddd;
            padding: 20px;
            background-color: #f9f9f9;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>GitHub Repository to Markdown Converter</h1>
        <p>Enter a GitHub repository URL (e.g., https://github.com/username/repository)</p>
        <input type="text" id="repoUrl" style="width: 100%; padding: 8px;" placeholder="Enter GitHub repository URL">
        <button onclick="processRepo()">Convert to Markdown</button>
        
        <h2>Markdown Output:</h2>
        <textarea id="markdownOutput" readonly></textarea>
        
        <h2>Preview:</h2>
        <div id="output"></div>
    </div>

    <script>
        async function processRepo() {
            const repoUrl = document.getElementById('repoUrl').value;
            const response = await fetch('/process', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json',
                },
                body: JSON.stringify({ repo_url: repoUrl })
            });
            
            const data = await response.json();
            
            if (data.error) {
                alert(data.error);
                return;
            }
            
            document.getElementById('markdownOutput').value = data.markdown;
            document.getElementById('output').innerHTML = data.html;
        }
    </script>
</body>
</html>
"""

# Create templates directory and write the HTML file
if not os.path.exists('templates'):
    os.makedirs('templates')
with open('templates/index.html', 'w') as f:
    f.write(html_template)

if __name__ == '__main__':
    app.run(server_port=7860,debug=True)