Spaces:
Running
Running
Update main.py
Browse files
main.py
CHANGED
@@ -32,6 +32,12 @@ import urllib.parse
|
|
32 |
from fastapi import FastAPI, File, Form, HTTPException, UploadFile
|
33 |
from fastapi.responses import FileResponse, JSONResponse
|
34 |
|
|
|
|
|
|
|
|
|
|
|
|
|
35 |
###############################################################################
|
36 |
# 1. Inkscape 检测
|
37 |
###############################################################################
|
@@ -73,21 +79,61 @@ def ensure_inkscape_available() -> tuple[bool, str]:
|
|
73 |
return False, "未找到 Inkscape,请安装或手动加入 PATH"
|
74 |
|
75 |
###############################################################################
|
76 |
-
# 2. URL
|
77 |
###############################################################################
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
78 |
def normalize_url(url: str) -> str:
|
79 |
"""
|
80 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
81 |
"""
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
#
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
91 |
|
92 |
###############################################################################
|
93 |
# 3. 下载并嵌入外链图片
|
|
|
32 |
from fastapi import FastAPI, File, Form, HTTPException, UploadFile
|
33 |
from fastapi.responses import FileResponse, JSONResponse
|
34 |
|
35 |
+
# 导入字体安装函数
|
36 |
+
from install_fonts import install_fonts_from_repository
|
37 |
+
|
38 |
+
# 安装字体
|
39 |
+
install_fonts_from_repository()
|
40 |
+
|
41 |
###############################################################################
|
42 |
# 1. Inkscape 检测
|
43 |
###############################################################################
|
|
|
79 |
return False, "未找到 Inkscape,请安装或手动加入 PATH"
|
80 |
|
81 |
###############################################################################
|
82 |
+
# 2. URL 规范化:解决中文 / 空格 / () 等字符
|
83 |
###############################################################################
|
84 |
+
#!/usr/bin/env python3
|
85 |
+
# -*- coding: utf-8 -*-
|
86 |
+
"""
|
87 |
+
URL 规范化工具函数
|
88 |
+
-----------------
|
89 |
+
功能特点
|
90 |
+
1. 支持中文域名及路径:自动在域名处使用 IDNA(Punycode),在路径等位置做 % 编码
|
91 |
+
2. **幂等**:已处理过的 URL 再次调用本函数不会出现二次编码
|
92 |
+
3. 兼容常见 URL 组件:scheme、netloc、path、params、query、fragment
|
93 |
+
"""
|
94 |
+
|
95 |
+
import urllib.parse as _url
|
96 |
+
|
97 |
+
|
98 |
def normalize_url(url: str) -> str:
|
99 |
"""
|
100 |
+
将包含中文或其它非 ASCII 字符的 URL 规范化为合法、安全的形式
|
101 |
+
|
102 |
+
参数:
|
103 |
+
url (str): 原始 URL,可能含中文、空格、圆括号等字符
|
104 |
+
|
105 |
+
返回:
|
106 |
+
str: 规范化后的 URL,可多次调用而结果保持一致
|
107 |
"""
|
108 |
+
# 解析 URL 各组件
|
109 |
+
parsed = _url.urlparse(url)
|
110 |
+
|
111 |
+
# -------------------------- 1) 处理域名 --------------------------
|
112 |
+
netloc = parsed.netloc
|
113 |
+
try:
|
114 |
+
# 若 netloc 已是 ASCII(含 Punycode)则无需转换
|
115 |
+
netloc.encode("ascii")
|
116 |
+
except UnicodeEncodeError:
|
117 |
+
# 含非 ASCII 字符时才按 IDNA 转为 Punycode
|
118 |
+
netloc = netloc.encode("idna").decode("ascii")
|
119 |
+
|
120 |
+
# -------------------------- 2) 处理路径等 ------------------------
|
121 |
+
# 先 unquote 再 quote,可避免二次编码
|
122 |
+
path = _url.quote(_url.unquote(parsed.path), safe="/")
|
123 |
+
params = _url.quote(_url.unquote(parsed.params), safe=":&=")
|
124 |
+
# query 使用 quote_plus 处理空格(+),同时保留 & =
|
125 |
+
query = _url.quote_plus(_url.unquote_plus(parsed.query), safe="=&")
|
126 |
+
fragment = _url.quote(_url.unquote(parsed.fragment), safe="")
|
127 |
+
|
128 |
+
# -------------------------- 3) 重新组装 -------------------------
|
129 |
+
return _url.urlunparse((
|
130 |
+
parsed.scheme,
|
131 |
+
netloc,
|
132 |
+
path,
|
133 |
+
params,
|
134 |
+
query,
|
135 |
+
fragment,
|
136 |
+
))
|
137 |
|
138 |
###############################################################################
|
139 |
# 3. 下载并嵌入外链图片
|