|
|
import os
|
|
|
import json
|
|
|
import time
|
|
|
import uuid
|
|
|
import re
|
|
|
from flask import render_template, request, url_for
|
|
|
|
|
|
from common.logger import system_logger
|
|
|
|
|
|
STORE_FILE = os.path.join(
|
|
|
os.path.dirname(__file__),
|
|
|
"temp_text_store.json"
|
|
|
)
|
|
|
|
|
|
EXPIRE_SECONDS = 3600 # 1小时
|
|
|
|
|
|
|
|
|
# =========================
|
|
|
# load
|
|
|
# =========================
|
|
|
def load_store():
|
|
|
if not os.path.exists(STORE_FILE):
|
|
|
return {}
|
|
|
|
|
|
try:
|
|
|
with open(STORE_FILE, "r", encoding="utf-8") as f:
|
|
|
return json.load(f)
|
|
|
except:
|
|
|
return {}
|
|
|
|
|
|
|
|
|
# =========================
|
|
|
# save
|
|
|
# =========================
|
|
|
def save_store(data):
|
|
|
with open(STORE_FILE, "w", encoding="utf-8") as f:
|
|
|
json.dump(data, f, ensure_ascii=False, indent=2)
|
|
|
|
|
|
|
|
|
# =========================
|
|
|
# markdown轻量格式化(V2新增)
|
|
|
# =========================
|
|
|
def normalize_markdown(text: str) -> str:
|
|
|
|
|
|
if not text:
|
|
|
return ""
|
|
|
|
|
|
text = text.replace("\r\n", "\n").replace("\r", "\n")
|
|
|
|
|
|
# 去掉多余空行(最多保留1个空行)
|
|
|
text = re.sub(r"\n{3,}", "\n\n", text)
|
|
|
|
|
|
# 行首尾空格清理
|
|
|
lines = [line.rstrip() for line in text.split("\n")]
|
|
|
|
|
|
return "\n".join(lines).strip()
|
|
|
|
|
|
|
|
|
# =========================
|
|
|
# cleanup
|
|
|
# =========================
|
|
|
def cleanup(store):
|
|
|
now = time.time()
|
|
|
|
|
|
expired = [
|
|
|
k for k, v in store.items()
|
|
|
if v["expires_at"] < now
|
|
|
]
|
|
|
|
|
|
for k in expired:
|
|
|
del store[k]
|
|
|
|
|
|
return store
|
|
|
|
|
|
|
|
|
# =========================
|
|
|
# 创建页面
|
|
|
# =========================
|
|
|
def temp_text_create_page():
|
|
|
|
|
|
message = None
|
|
|
share_link = None
|
|
|
|
|
|
if request.method == "POST":
|
|
|
|
|
|
content = request.form.get("content", "")
|
|
|
|
|
|
if not content.strip():
|
|
|
return render_template("temp_text.html", message="内容不能为空")
|
|
|
|
|
|
# ✔ markdown规范化
|
|
|
content = normalize_markdown(content)
|
|
|
|
|
|
store = load_store()
|
|
|
store = cleanup(store)
|
|
|
|
|
|
text_id = uuid.uuid4().hex[:8]
|
|
|
now = time.time()
|
|
|
|
|
|
store[text_id] = {
|
|
|
"content": content,
|
|
|
"created_at": now,
|
|
|
"expires_at": now + EXPIRE_SECONDS
|
|
|
}
|
|
|
|
|
|
save_store(store)
|
|
|
|
|
|
share_link = url_for("temp_text_view_route", text_id=text_id, _external=True)
|
|
|
|
|
|
system_logger.info(f"[TempTextV2] create id={text_id}")
|
|
|
|
|
|
message = "创建成功(1小时有效)"
|
|
|
|
|
|
return render_template(
|
|
|
"temp_text.html",
|
|
|
message=message,
|
|
|
share_link=share_link
|
|
|
)
|
|
|
|
|
|
|
|
|
# =========================
|
|
|
# 查看页面
|
|
|
# =========================
|
|
|
def temp_text_view(text_id):
|
|
|
|
|
|
store = load_store()
|
|
|
store = cleanup(store)
|
|
|
|
|
|
if text_id not in store:
|
|
|
return "内容不存在或已过期"
|
|
|
|
|
|
content = store[text_id]["content"]
|
|
|
|
|
|
system_logger.info(f"[TempTextV2] view id={text_id}")
|
|
|
|
|
|
return render_template(
|
|
|
"temp_text_view.html",
|
|
|
content=content,
|
|
|
text_id=text_id
|
|
|
) |