File size: 8,607 Bytes
dd495a5
8e118cf
 
 
dd495a5
8e118cf
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
132113e
8e118cf
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
132113e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8e118cf
 
 
 
 
 
 
 
 
 
 
132113e
8e118cf
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
132113e
8e118cf
 
 
 
132113e
 
 
 
 
 
 
 
 
8e118cf
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
132113e
8e118cf
 
 
 
 
 
 
 
 
 
 
 
 
132113e
 
8e118cf
 
132113e
 
 
 
 
 
 
 
 
8e118cf
 
 
 
 
 
 
 
 
 
 
 
 
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
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
import streamlit as st
from pathlib import Path
import re
import urllib.parse

def load_template(template_path):
    """加载 README 模板文件"""
    with open(template_path, 'r', encoding='utf-8') as f:
        return f.read()

def get_template_variables(template_content):
    """从模板中提取所有变量"""
    pattern = r'\{\{(\w+)\}\}'
    return sorted(list(set(re.findall(pattern, template_content))))

def encode_url_safe(text):
    """将文本中的空格转换为 URL 安全的格式"""
    return urllib.parse.quote(text).replace('+', '%20')

def replace_template_variables(template_content, variables_dict):
    """替换模板中的所有变量,对特定字段进行 URL 编码"""
    url_encode_fields = ['full_name', 'bio']  # 需要 URL 编码的字段
    
    for key, value in variables_dict.items():
        if key in url_encode_fields and value:
            # 对特定字段进行 URL 编码
            encoded_value = encode_url_safe(value)
            template_content = template_content.replace(f'{{{{{key}}}}}', encoded_value)
        else:
            # 其他字段正常替换
            template_content = template_content.replace(f'{{{{{key}}}}}', value)
    
    return template_content

def create_badge(text, color="blue"):
    """创建技能徽章
    将空格替换为下划线,以确保徽章正确显示
    """
    # 处理空格
    text = text.strip()
    badge_text = text.replace(" ", "_")
    badge_logo = text.lower().replace(" ", "-")  # logo 使用连字符
    
    return f"![{text}](https://img.shields.io/badge/-{badge_text}-{color}?style=for-the-badge&logo={badge_logo}&logoColor=white)"

def process_skills(skills_text):
    """处理技能列表文本
    分割文本并生成徽章
    """
    if not skills_text:
        return ""
    
    # 分割技能并移除空白项
    skills = [skill.strip() for skill in skills_text.split(",") if skill.strip()]
    # 生成徽章
    return " ".join([create_badge(skill) for skill in skills])

def create_project_fields(col, project_num):
    """创建单个项目的输入字段"""
    st.subheader(f"项目 {project_num}")
    project_data = {
        f'project_{project_num}_name': st.text_input(f"项目 {project_num} 名称", value="My Awesome Project", key=f"name_{project_num}"),
        f'project_{project_num}_link': st.text_input(f"项目 {project_num} 链接", value="#", key=f"link_{project_num}"),
        f'project_{project_num}_image': st.text_input(f"项目 {project_num} 图片", value="/path/to/project.png", key=f"image_{project_num}"),
        f'project_{project_num}_github': st.text_input(f"项目 {project_num} GitHub", value="#", key=f"github_{project_num}"),
        f'project_{project_num}_live': st.text_input(f"项目 {project_num} 演示链接", value="#", key=f"live_{project_num}"),
        f'project_{project_num}_point_1': st.text_input(f"项目 {project_num} 要点 1", value="Feature 1", key=f"point1_{project_num}"),
        f'project_{project_num}_point_2': st.text_input(f"项目 {project_num} 要点 2", value="Feature 2", key=f"point2_{project_num}"),
        f'project_{project_num}_point_3': st.text_input(f"项目 {project_num} 要点 3", value="Feature 3", key=f"point3_{project_num}")
    }
    return project_data

def create_project_html(project_num):
    """生成单个项目的 HTML 模板"""
    return f'''<td width="50%">
<h3 align="center">{{{{project_{project_num}_name}}}}</h3>
<div align="center">  
<a href="{{{{project_{project_num}_link}}}}" target="_blank">
<img src="{{{{project_{project_num}_image}}}}" width="50%" alt="{{{{project_{project_num}_name}}}}"/>
</a>
<br>
<br>
<p>
<a href="{{{{project_{project_num}_github}}}}" target="_blank">
<img src="https://img.shields.io/badge/View_on_GitHub-2ea44f?style=for-the-badge&logo=github"/>
</a>
<a href="{{{{project_{project_num}_live}}}}" target="_blank">
<img src="https://img.shields.io/badge/Live_Demo-brightgreen?style=for-the-badge&logo=vercel"/>
</a>
</p>
<p align="left">
• {{{{project_{project_num}_point_1}}}}<br>
• {{{{project_{project_num}_point_2}}}}<br>
• {{{{project_{project_num}_point_3}}}}
</p>
</div>
</td>'''

def generate_projects_section(num_projects):
    """生成项目展示区域的 HTML"""
    projects_html = []
    for i in range(0, num_projects, 2):
        row_html = f'''<tr>
{create_project_html(i + 1)}
{create_project_html(i + 2) if i + 1 < num_projects else ""}
</tr>'''
        projects_html.append(row_html)
    return "\n".join(projects_html)

def main():
    st.set_page_config(
        page_title="GitHub README Profile Generator",
        page_icon="📝",
        layout="wide"
    )
    
    st.title("GitHub README Profile Generator")
    st.markdown("### 生成你的个性化 GitHub Profile README")

    # 加载默认模板
    template_path = Path("README_template.md")
    template_content = load_template(template_path)
    
    # 创建两列布局
    col1, col2 = st.columns([1, 1])

    with col1:
        st.subheader("基本信息")
        
        # 基本信息表单
        full_name = st.text_input("姓名", value="Chan Meng")
        bio = st.text_input("个人简介", value="A minimalist")
        github_username = st.text_input("GitHub 用户名", value="ChanMeng666")
        
        # 社交链接
        st.subheader("社交链接")
        portfolio_link = st.text_input("作品集链接", value="https://chanmeng.live/")
        linkedin_link = st.text_input("LinkedIn 链接", value="https://www.linkedin.com/in/chanmeng666/")
        
        # 日常行为
        st.subheader("日常行为")
        daily_routine_1 = st.text_input("日常行为 1", value="code")
        daily_routine_2 = st.text_input("日常行 2", value="eat")
        daily_routine_3 = st.text_input("日常行为 3", value="sleep")
        daily_routine_4 = st.text_input("日常行为 4", value="repeat")
        
        # 项目信息
        st.subheader("项目展示")
        num_projects = st.number_input("项目数量", min_value=1, max_value=10, value=2)
        
        # 存储所有项目数据
        all_project_data = {}
        for i in range(1, num_projects + 1):
            project_data = create_project_fields(col1, i)
            all_project_data.update(project_data)
        
        # 技能徽章
        st.subheader("技能栈")
        core_skills = st.text_area("核心技能 (用逗号分隔)", 
            value="React,Python,TypeScript,Machine Learning")
        frontend_skills = st.text_area("前端技能 (用逗号分隔)", 
            value="HTML5,CSS3,JavaScript,React Native")
        backend_skills = st.text_area("后端技能 (用逗号分隔)", 
            value="Node.js,MySQL,MongoDB")

        # 生成徽章
        core_skills_badges = process_skills(core_skills)
        frontend_skills_badges = process_skills(frontend_skills)
        backend_skills_badges = process_skills(backend_skills)

        # 其他信息
        st.subheader("其他信息")
        footer_text = st.text_area("页脚文本", value="Thanks for visiting my GitHub profile! Feel free to connect or check out my projects.")

        # 更新变量字典,加入项目数据
        variables = {
            'full_name': full_name or '',
            'bio': bio or '',
            'github_username': github_username,
            'portfolio_link': portfolio_link,
            'linkedin_link': linkedin_link,
            'daily_routine_1': daily_routine_1,
            'daily_routine_2': daily_routine_2,
            'daily_routine_3': daily_routine_3,
            'daily_routine_4': daily_routine_4,
            'core_skills_badges': core_skills_badges,
            'frontend_skills_badges': frontend_skills_badges,
            'backend_skills_badges': backend_skills_badges,
            'footer_text': footer_text,
            **all_project_data  # 添加所有项目数据
        }

        # 动态生成项目部分的模板内容
        template_content = template_content.replace(
            "<!-- Featured Projects Section -->",
            f'''<!-- Featured Projects Section -->
<table>
{generate_projects_section(num_projects)}
</table>'''
        )

        # 生成预览内容
        preview_content = replace_template_variables(template_content, variables)

    with col2:
        st.subheader("预览")
        st.markdown(preview_content, unsafe_allow_html=True)
        
        if st.button("复制全部内容"):
            st.code(preview_content, language="markdown")
            st.success("内容已复制到剪贴板!")

if __name__ == "__main__":
    main()