全站通知:

模块:GiftTastes/Data/doc

来自星露谷物语维基
跳到导航 跳到搜索
[ 刷新 ]
当前页面是文档页面,会被模块:GiftTastes/Data引入。查看模板:Documentation获取更多信息。

当前模块的数据用于模板:GiftsByItem,自动生成物品的送礼表格。

当前模块的数据通过 SummerFleur 编写的模组 GetNPCGiftTastes 导出。

导出 json 后,使用以下 Python 脚本将数据转换为 Lua Table,即可置入当前页面。

import json
import os
from pathlib import Path

def json_to_lua_table(obj, indent=0, is_key=False, top_level=False):
    """
    将Python对象转换为Lua表格字符串
    
    Args:
        obj: 要转换的Python对象
        indent: 当前缩进级别
        is_key: 是否为键
        top_level: 是否为顶层表格
    
    Returns:
        转换后的Lua表格字符串
    """
    indent_str = "    " * indent
    
    if isinstance(obj, dict):
        if not obj:  # 空字典
            return "{}"
        
        # 对于顶层表格,保持格式化以提高可读性
        if top_level:
            lines = []
            lines.append("return {")
            
            for i, (k, v) in enumerate(obj.items()):
                # 使用中括号形式的键,确保中文键正确
                key = f'["{k}"]'
                value = json_to_lua_table(v, indent + 1, top_level=False)
                
                # 添加逗号,除了最后一个元素
                comma = "," if i < len(obj) - 1 else ""
                lines.append(f"{indent_str}    {key} = {value}{comma}")
            
            lines.append(f"{indent_str}}}")
            return "\n".join(lines)
        else:
            # 对于非顶层表格,使用更紧凑的格式
            parts = []
            parts.append("{")
            
            for i, (k, v) in enumerate(obj.items()):
                key = f'["{k}"]'
                value = json_to_lua_table(v, 0, top_level=False)  # 不增加缩进
                
                comma = "," if i < len(obj) - 1 else ""
                parts.append(f"{key}={value}{comma}")
            
            parts.append("}")
            return "".join(parts)
    
    elif isinstance(obj, list):
        if not obj:  # 空列表
            return "{}"
        
        # 检查列表是否只包含简单字符串,如果是则使用紧凑格式
        if all(isinstance(item, str) for item in obj):
            items = [f'"{item.replace("\\", "\\\\").replace('"', '\\"')}"' for item in obj]
            return "{" + ",".join(items) + "}"
        else:
            # 对于复杂列表,保持一定的格式
            parts = []
            parts.append("{")
            
            for i, item in enumerate(obj):
                value = json_to_lua_table(item, 0)  # 不增加缩进
                comma = "," if i < len(obj) - 1 else ""
                parts.append(f"{value}{comma}")
            
            parts.append("}")
            return "".join(parts)
    
    elif isinstance(obj, str):
        # 对字符串进行转义
        escaped = obj.replace('\\', '\\\\').replace('"', '\\"')
        return f'"{escaped}"'
    
    elif obj is None:
        return "nil"
    
    elif isinstance(obj, bool):
        return "true" if obj else "false"
    
    else:  # 数字等其他类型
        return str(obj)

def convert_json_file_to_lua(json_file_path, lua_file_path=None):
    """
    将JSON文件转换为Lua文件
    
    Args:
        json_file_path: JSON文件路径
        lua_file_path: 输出Lua文件路径,如果为None则使用相同文件名,扩展名改为.lua
        
    Returns:
        输出Lua文件的路径
    """
    if lua_file_path is None:
        lua_file_path = str(Path(json_file_path).with_suffix('.lua'))
    
    with open(json_file_path, 'r', encoding='utf-8') as f:
        data = json.load(f)
    
    # 转换英文键名为中文键名
    converted_data = {}
    key_mapping = {
        'Love': '最爱',
        'Like': '喜欢', 
        'Neutral': '一般',
        'Dislike': '不喜欢',
        'Hate': '讨厌'
    }
    
    for item_name, tastes in data.items():
        converted_tastes = {}
        for eng_key, npc_list in tastes.items():
            chinese_key = key_mapping.get(eng_key, eng_key)
            converted_tastes[chinese_key] = npc_list
        converted_data[item_name] = converted_tastes
    
    lua_content = json_to_lua_table(converted_data, top_level=True)
    
    with open(lua_file_path, 'w', encoding='utf-8') as f:
        f.write(lua_content)
    
    return lua_file_path

if __name__ == "__main__":
    # 获取当前文件所在目录
    json_file_path = r"GiftTastes.json"
    lua_file_path = r"GiftTastes.lua"
    
    # 确保输出目录存在
    os.makedirs(os.path.dirname(lua_file_path), exist_ok=True)
    
    # 转换文件
    output_path = convert_json_file_to_lua(json_file_path, lua_file_path)
    print(f"转换完成!输出文件路径:{output_path}")