Spaces:
Running
Running
File size: 5,138 Bytes
10099e5 e33cca8 |
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(host="0.0.0.0", port=7860,debug=True) |