fix(toml): normalize CJK quotes to prevent parsing errors
Add quote normalization to handle Chinese/fullwidth quotes automatically
converted by IME. This fixes TOML parsing failures when users input
configuration with non-ASCII quotes (" " ' ' etc.).
Changes:
- Add textNormalization utility for quote normalization
- Apply normalization in TOML input handlers (MCP form, Codex config)
- Disable browser auto-correction in Textarea component
- Add defensive normalization in TOML parsing layer
This commit is contained in:
@@ -32,6 +32,7 @@ import {
|
||||
extractIdFromToml,
|
||||
mcpServerToToml,
|
||||
} from "@/utils/tomlUtils";
|
||||
import { normalizeTomlText } from "@/utils/textNormalization";
|
||||
import { useMcpValidation } from "./useMcpValidation";
|
||||
|
||||
interface McpFormModalProps {
|
||||
@@ -228,19 +229,21 @@ const McpFormModal: React.FC<McpFormModalProps> = ({
|
||||
};
|
||||
|
||||
const handleConfigChange = (value: string) => {
|
||||
setFormConfig(value);
|
||||
// 若为 TOML 模式,先做引号归一化,避免中文输入法导致的格式错误
|
||||
const nextValue = useToml ? normalizeTomlText(value) : value;
|
||||
setFormConfig(nextValue);
|
||||
|
||||
if (useToml) {
|
||||
// TOML validation (use hook's complete validation)
|
||||
const err = validateTomlConfig(value);
|
||||
const err = validateTomlConfig(nextValue);
|
||||
if (err) {
|
||||
setConfigError(err);
|
||||
return;
|
||||
}
|
||||
|
||||
// Try to extract ID (if user hasn't filled it yet)
|
||||
if (value.trim() && !formId.trim()) {
|
||||
const extractedId = extractIdFromToml(value);
|
||||
if (nextValue.trim() && !formId.trim()) {
|
||||
const extractedId = extractIdFromToml(nextValue);
|
||||
if (extractedId) {
|
||||
setFormId(extractedId);
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ import {
|
||||
extractCodexBaseUrl,
|
||||
setCodexBaseUrl as setCodexBaseUrlInConfig,
|
||||
} from "@/utils/providerConfigUtils";
|
||||
import { normalizeTomlText } from "@/utils/textNormalization";
|
||||
|
||||
interface UseCodexConfigStateProps {
|
||||
initialData?: {
|
||||
@@ -159,10 +160,12 @@ export function useCodexConfigState({ initialData }: UseCodexConfigStateProps) {
|
||||
// 处理 config 变化(同步 Base URL)
|
||||
const handleCodexConfigChange = useCallback(
|
||||
(value: string) => {
|
||||
setCodexConfig(value);
|
||||
// 归一化中文/全角/弯引号,避免 TOML 解析报错
|
||||
const normalized = normalizeTomlText(value);
|
||||
setCodexConfig(normalized);
|
||||
|
||||
if (!isUpdatingCodexBaseUrlRef.current) {
|
||||
const extracted = extractCodexBaseUrl(value) || "";
|
||||
const extracted = extractCodexBaseUrl(normalized) || "";
|
||||
if (extracted !== codexBaseUrl) {
|
||||
setCodexBaseUrl(extracted);
|
||||
}
|
||||
|
||||
@@ -11,6 +11,10 @@ const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(
|
||||
"flex min-h-[80px] w-full rounded-md border border-border-default bg-background px-3 py-2 text-sm shadow-sm placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-blue-500/20 dark:focus:ring-blue-400/20 disabled:cursor-not-allowed disabled:opacity-50",
|
||||
className,
|
||||
)}
|
||||
autoComplete="off"
|
||||
autoCorrect="off"
|
||||
autoCapitalize="none"
|
||||
spellCheck={false}
|
||||
ref={ref}
|
||||
{...props}
|
||||
/>
|
||||
|
||||
Reference in New Issue
Block a user