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 格式