|
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'] |
|
|
|
for key, value in variables_dict.items(): |
|
if key in url_encode_fields and value: |
|
|
|
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(" ", "-") |
|
|
|
return f"" |
|
|
|
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 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模板.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("项目 1") |
|
project_1_name = st.text_input("项目 1 名称", value="My Awesome Project") |
|
project_1_link = st.text_input("项目 1 链接", value="#") |
|
project_1_image = st.text_input("项目 1 图片", value="/path/to/project1.png") |
|
project_1_github = st.text_input("项目 1 GitHub", value="#") |
|
project_1_live = st.text_input("项目 1 演示链接", value="#") |
|
project_1_point_1 = st.text_input("项目 1 要点 1", value="Feature 1") |
|
project_1_point_2 = st.text_input("项目 1 要点 2", value="Feature 2") |
|
project_1_point_3 = st.text_input("项目 1 要点 3", value="Feature 3") |
|
|
|
|
|
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, |
|
'project_1_name': project_1_name, |
|
'project_1_link': project_1_link, |
|
'project_1_image': project_1_image, |
|
'project_1_github': project_1_github, |
|
'project_1_live': project_1_live, |
|
'project_1_point_1': project_1_point_1, |
|
'project_1_point_2': project_1_point_2, |
|
'project_1_point_3': project_1_point_3, |
|
'core_skills_badges': core_skills_badges, |
|
'frontend_skills_badges': frontend_skills_badges, |
|
'backend_skills_badges': backend_skills_badges, |
|
'footer_text': footer_text |
|
} |
|
|
|
|
|
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() |
|
|