aardio 文档

aardio 范例: JSON / URL 编码 / aardio( table ) 格式互转工具

//JSON / URL 编码 / table 互转工具
import win.ui;
import fonts.fontAwesome;
/*DSG{{*/
var winform = win.form(text="JSON / URL 编码 / aardio( table ) 格式互转工具";right=969;bottom=660)
winform.add(
btnDataType={cls="plus";text='\uF05A 特殊类型说明';left=155;top=618;right=320;bottom=641;db=1;dl=1;font=LOGFONT(h=-13;name='FontAwesome');z=13};
btnHelp={cls="plus";text='\uF02D JSON 库使用指南';left=332;top=618;right=522;bottom=641;db=1;dl=1;dr=1;font=LOGFONT(h=-13;name='FontAwesome');notify=1;z=14};
btnStart={cls="plus";text='\uF02D 入门示例';left=10;top=618;right=145;bottom=641;db=1;dl=1;font=LOGFONT(h=-13;name='FontAwesome');notify=1;z=12};
btnToJson={cls="plus";text='\uF061 JSON';left=773;top=577;right=862;bottom=608;db=1;dr=1;font=LOGFONT(h=-13;name='FontAwesome');notify=1;z=10};
btnToTable={cls="plus";text='\uF061 table';left=668;top=577;right=765;bottom=608;db=1;dr=1;font=LOGFONT(h=-13;name='FontAwesome');notify=1;z=9};
btnToUrl={cls="plus";text='\uF061 URL';left=870;top=577;right=959;bottom=608;db=1;dr=1;font=LOGFONT(h=-13;name='FontAwesome');notify=1;z=11};
edit={cls="edit";left=10;top=10;right=960;bottom=563;db=1;dl=1;dr=1;dt=1;edge=1;font=LOGFONT(h=-14;name='Consolas');hscroll=1;multiline=1;vscroll=1;z=1};
lblDetected={cls="static";left=170;top=580;right=258;bottom=602;db=1;dl=1;transparent=1;z=4};
lblFrom={cls="static";text="当前源格式:";left=15;top=583;right=85;bottom=605;db=1;dl=1;transparent=1;z=2};
lblTo={cls="static";text="目标格式:";left=586;top=583;right=674;bottom=605;align="right";db=1;dr=1;transparent=1;z=8};
radioAuto={cls="radiobutton";text="自动识别";left=88;top=581;right=170;bottom=604;checked=1;db=1;dl=1;z=3};
radioJson={cls="radiobutton";text="JSON";left=372;top=581;right=432;bottom=604;db=1;dl=1;z=6};
radioTable={cls="radiobutton";text="aardio(table)";left=267;top=581;right=369;bottom=604;db=1;dl=1;z=5};
radioUrl={cls="radiobutton";text="URL/URLEncode";left=447;top=581;right=559;bottom=604;db=1;dl=1;dr=1;z=7}
)
/*}}*/

import JSON;
import util.table;
import inet.url;
import string.curlParse;

winform.edit.limit = -1;

// 当前自动检测到的类型
var currentDetectedType = null;

// 自动识别内容类型
var detectType = function(text){
    text = string.trim(text);
    if(!#text) return null;

    if(string.curlParse.test(text)){
        return "cURL", string.curlParse(text);
    }

    // 先检测是否是完整 URL(使用 inet.url.split 准确判断)
    var tUrl = !..string.find(text,'[\r\n]') && inet.url.split(text);
    if(tUrl){
        return "URL", tUrl;
    }

    // 检测是否是 URL 参数格式(无换行,有 = 号)
    if(!string.find(text, "\n") && string.indexOf(text, "=") && !string.find(text,"^\s*[\[\{""'`]]")){
        var info = inet.url.splitParametersCs(text);
        if(info && table.count(info) > 0){
            return "URLPARAMS", info;
        }
    }

    // 检测是否是 JSON
    var json = JSON.tryParse(text);
    if(json){
        return "JSON", json;
    }

    // 尝试作为 table 解析
    var ok,info = call(eval,,text);
    if(ok && type(info) == "table"){
        return "TABLE", info;
    }

    return null;
}

// 更新检测结果显示
var updateDetectedLabel = function(dataType){
    select(dataType) {
        case "cURL" {
            winform.lblDetected.text = "(cURL命令)";
        }
        case "URL" {
            winform.lblDetected.text = "(URL)";
        }
        case "URLPARAMS" {
            winform.lblDetected.text = "(URL参数)";
        }
        case "JSON" {
            winform.lblDetected.text = "(JSON)";
        }
        case "TABLE" {
            winform.lblDetected.text = "(table)";
        }
        else {
            winform.lblDetected.text = "";
        }
    }
}

// 内容变化时自动检测类型(仅自动识别模式)
winform.edit.onChange = function(){
    if(!winform.radioAuto.checked){
        winform.lblDetected.text = "";
        currentDetectedType = null;
        return;
    }

    var dataType = detectType(winform.edit.text);
    currentDetectedType = dataType;
    updateDetectedLabel(dataType);
}

// 其他 radio 点击时清空检测结果
winform.radioTable.oncommand = function(){
    winform.lblDetected.text = "";
    currentDetectedType = null;
}

winform.radioJson.oncommand = function(){
    winform.lblDetected.text = "";
    currentDetectedType = null;
}

winform.radioUrl.oncommand = function(){
    winform.lblDetected.text = "";
    currentDetectedType = null;
}

winform.radioAuto.oncommand = function(){
    // 切换到自动识别时立即检测
    winform.edit.onChange();
}

// 获取当前源类型
var getSourceType = function(){
    if(winform.radioAuto.checked){
        return currentDetectedType;
    }
    if(winform.radioTable.checked) return "TABLE";
    if(winform.radioJson.checked) return "JSON";
    if(winform.radioUrl.checked) return "URL";
    return null;
}

// 解析当前内容
var parseContent = function(){
    var text = string.trim(winform.edit.text);
    if(!#text) return;

    var sourceType = getSourceType(); 

    // 自动识别模式,直接检测
    if(!sourceType || sourceType == "AUTO"){
        var dataType, info = detectType(text);
        return info;
    }

    if(sourceType == "cURL"){
        if(string.curlParse.test(text)){
            return string.curlParse(text);
        }
    }

    if(sourceType == "URL" || sourceType == "URLPARAMS"){
        if(string.curlParse.test(text)){
            return string.curlParse(text);
        }

        // 先尝试完整 URL
        var tUrl = inet.url.split(text);
        if(tUrl){
            if(tUrl.extraInfo){
                tUrl.extraInfo = inet.url.splitParametersCs(tUrl.extraInfo);
            }

            if(tUrl.path) tUrl.path =..inet.url.decode(tUrl.path);
            return tUrl;
        }
        // 尝试 URL 参数
        return inet.url.splitParametersCs(text);
    }

    if(sourceType == "JSON"){
        return JSON.tryParse(text);
    }

    if(sourceType == "TABLE"){
        var info = eval(text);
        if(type(info) == "table"){
            return info;
        }
    }

    return null;
}

// 判断表是否是 URL 对象(由 inet.url.split 生成)
var isUrlObject = function(tab){
    return type(tab) == "table" && tab.scheme && tab.host && tab.port && (tab.schemeNum!==null);
}

// 转换为 table
winform.btnToTable.oncommand = function(){
    var text = string.trim(winform.edit.text);
    if(!#text){
        winform.edit.showWarningTip("提示", "请输入内容");
        return;
    }

    var info = parseContent();
    if(!info){
        winform.edit.showErrorTip("错误", "解析失败,请检查内容格式或手动选择格式");
        return;
    }

    winform.edit.text = util.table.tostring(info, '\t');
    winform.radioTable.click();
    winform.lblDetected.text = "";
    currentDetectedType = null;
}

// 转换为 JSON
winform.btnToJson.oncommand = function(){
    var text = string.trim(winform.edit.text);
    if(!#text){
        winform.edit.showWarningTip("提示", "请输入内容");
        return;
    }

    var info = parseContent();
    if(!info){
        winform.edit.showErrorTip("错误", "解析失败,请检查内容格式或手动选择格式");
        return;
    }

    winform.edit.text = JSON.stringify(info, true, false);
    winform.radioJson.click();
    winform.lblDetected.text = "";
    currentDetectedType = null;
}

// 转换为 URL
winform.btnToUrl.oncommand = function(){
    var text = string.trim(winform.edit.text);
    if(!#text){
        winform.edit.showWarningTip("提示", "请输入内容");
        return;
    }

    var info = parseContent();
    if(!info){
        winform.edit.showErrorTip("错误", "解析失败,请检查内容格式或手动选择格式");
        return;
    }

    // 如果是 URL 对象(有 scheme,host,port 字段),还原为完整 URL
    if(isUrlObject(info)){
        var tUrl = inet.url.split(info);
        if(tUrl.path)tUrl.path = ..inet.url.encodeUri(tUrl.path);
        winform.edit.text = tostring(tUrl);
    } else {
        // 普通表,转为 URL 参数格式
        winform.edit.text = inet.url.stringifyParameters(info);
    }
    winform.radioUrl.click();
    winform.lblDetected.text = "";
    currentDetectedType = null;
}

winform.btnStart.oncommand = function(){
    import ide;
    ide.openDocument("~/example/Web/JSON/JSON.aardio");
    winform.show(6/*_SW_MINIMIZE*/);
}

winform.btnDataType.oncommand = function(){
    import ide;
    ide.openDocument("~/example/Web/JSON/DataType.aardio");
    winform.show(6/*_SW_MINIMIZE*/);
}

winform.btnHelp.oncommand = function(){
    import ide;
    ide.openDocument("https://www.aardio.com/zh-cn/doc/library-guide/std/JSON/_.html")
    winform.show(6/*_SW_MINIMIZE*/);
}

// 设置转换按钮样式
var convertBtnSkin = {
    background = {
        default = 0xFFE0EEFF;
        hover = 0xFFC8DEFF;
        active = 0xFFB0CCEE;
    };
    color = {
        default = 0xFF1E5AAA;
        hover = 0xFF0D4A9A;
        active = 0xFF003A8A;
    };
    border = {
        default = 0xFF7EAEE8;
        hover = 0xFF4E8ED8;
        active = 0xFF2E6EB8;
        radius = 4;
    };
}

winform.btnToTable.skin(convertBtnSkin);
winform.btnToJson.skin(convertBtnSkin);
winform.btnToUrl.skin(convertBtnSkin);

// 设置帮助按钮样式
var helpBtnSkin = {
    background = {
        default = 0xFFF5F5F5;
        hover = 0xFFE8F0FF;
        active = 0xFFD8E4F8;
    };
    color = {
        default = 0xFF0066AA;
        hover = 0xFF0055AA;
        active = 0xFF004499;
    };
    border = {
        default = 0xFFCCCCCC;
        hover = 0xFF88AAD0;
        radius = 3;
    };
}

winform.btnStart.skin(helpBtnSkin);
winform.btnDataType.skin(helpBtnSkin);
winform.btnHelp.skin(helpBtnSkin); 

winform.show();
win.loopMessage();
Markdown 格式