From e08d853734880aae24d77fcb497227a577d8e0df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A5=BF=E7=93=9C=C2=B0?= Date: Thu, 4 Jun 2026 17:00:02 +0800 Subject: [PATCH] 1 --- backend/api/routes/info.py | 4 ++-- backend/api/routes/openapi.py | 4 ++-- backend/api/utils/skill_detail.py | 16 ++++++++++++++-- backend/openapi | 2 +- 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/backend/api/routes/info.py b/backend/api/routes/info.py index c7a5d8dc..02e0d971 100644 --- a/backend/api/routes/info.py +++ b/backend/api/routes/info.py @@ -11,7 +11,7 @@ from core.basic.character import createCharacter from core.open.helper import get_user_info_by_id, get_user_info_by_role_id, get_user_list_by_id, getRoleJobCode from core.open.skillTree import get_skill_tree_info from api.core.exception import ResponseException -from api.utils.skill_detail import normalize_skill_detail, skill_detail_for_level +from api.utils.skill_detail import SKILL_DETAIL_NORMALIZE_VERSION, normalize_skill_detail, skill_detail_for_level router = APIRouter() @@ -72,7 +72,7 @@ async def get_skill_info(state: AltersDep, skillId: str, level: int, redis: Redi jobId = alter.split('.')[1] jobGrowId = alter.split('.')[2].replace('_carry', '') skill_info = {} - key = f'openapi:{jobId}:{jobGrowId}:{skillId}' + key = f'openapi:{SKILL_DETAIL_NORMALIZE_VERSION}:{jobId}:{jobGrowId}:{skillId}' try: def get_skill_info(): diff --git a/backend/api/routes/openapi.py b/backend/api/routes/openapi.py index df9b2d95..275b6c50 100644 --- a/backend/api/routes/openapi.py +++ b/backend/api/routes/openapi.py @@ -4,7 +4,7 @@ from fastapi import APIRouter, Path, Query from api.core.Response import response from api.core.Redis import get_redis_info from api.dp import RedisDep -from api.utils.skill_detail import normalize_skill_detail, skill_detail_for_level +from api.utils.skill_detail import SKILL_DETAIL_NORMALIZE_VERSION, normalize_skill_detail, skill_detail_for_level import re from typing import Annotated @@ -128,7 +128,7 @@ async def get_cn_skill_info( level (int, optional): 技能等级,默认为None """ skill_info = {} - key = f'openapi:{jobId}:{jobGrowId}:{skillId}' + key = f'openapi:{SKILL_DETAIL_NORMALIZE_VERSION}:{jobId}:{jobGrowId}:{skillId}' try: def get_skill_info(): diff --git a/backend/api/utils/skill_detail.py b/backend/api/utils/skill_detail.py index 9e16c1ca..f32ff9d3 100644 --- a/backend/api/utils/skill_detail.py +++ b/backend/api/utils/skill_detail.py @@ -3,8 +3,12 @@ import re from typing import Any -PLACEHOLDER_PATTERN = re.compile(r'<(?:int|float\d*)[^>]*>') +# Only numeric data placeholders are normalized. Decorative Korean placeholders such as <소수1+> +# stay untouched and do not consume a value index. +DATA_PLACEHOLDER_PATTERN = re.compile(r'<(?:int|float\d*)[^>]*>') +DECORATIVE_KOREAN_PLACEHOLDER_PATTERN = re.compile(r'<[가-힣]+\d+\+>') VALUE_PATTERN = re.compile(r'\{value\d+\}') +SKILL_DETAIL_NORMALIZE_VERSION = 'decorative-korean-placeholder-v1' def replace_placeholders(template: str) -> str: @@ -15,7 +19,15 @@ def replace_placeholders(template: str) -> str: idx += 1 return f'{{value{idx}}}' - return PLACEHOLDER_PATTERN.sub(repl, template) + protected = DECORATIVE_KOREAN_PLACEHOLDER_PATTERN.sub(lambda match: f'@@DDECORATIVE_{len(match.group(0))}_{match.start()}@@', template) + replacements = { + f'@@DDECORATIVE_{len(match.group(0))}_{match.start()}@@': match.group(0) + for match in DECORATIVE_KOREAN_PLACEHOLDER_PATTERN.finditer(template) + } + normalized = DATA_PLACEHOLDER_PATTERN.sub(repl, protected) + for token, placeholder in replacements.items(): + normalized = normalized.replace(token, placeholder) + return normalized def normalize_skill_detail(skill_data: dict[str, Any]) -> dict[str, Any]: diff --git a/backend/openapi b/backend/openapi index 949f72da..70c4c160 160000 --- a/backend/openapi +++ b/backend/openapi @@ -1 +1 @@ -Subproject commit 949f72da8571c7d43fd2678b16ef442e5bfef684 +Subproject commit 70c4c160406259f69c8c6ef2601573a1ce15ea5c