[JavaScript] Objective-C参数列表语法转换工具。可转为UML或C++语法,用于绘制UML
2013-04-16 11:21
776 查看
作者:zyl910
现在很多常用的UML工具不支持Objective-C,在绘制UML时很不方便。得手工将Objective-C语法的参数列表,转为UML语法或C++语法。比较费力且容易出错。
于是我想编写一个工具,自动的将Objective-C语法的参数列表转为UML或C++语法。
用什么语言开发呢?
为了跨平台,我决定采用JavaScript来编写该工具。
现在只是一个字符串分析与生成的小工具,JavaScript足以胜任。
界面如下——
基本使用方法——
1. 在“源参数列表”填写Objective-C方法的声明;
2. 点击“转换”按钮,UML与C++文本框出现转换结果;
3. 将UML与C++文本框的转换结果复制到剪贴板,再粘贴到UML工具中。
辅助功能——
1. 在“源参数列表”旁边有一个“粘贴”按钮。点击它便会将剪贴板中的文本张贴到“源参数列表”文本框中。
2. 在“转换”按钮旁边有一个“自动”复选框。若复选框勾选,当“源参数列表”文本框修改完成时,会自动进行转换。
3. 在“UML”、“C++”旁边有一个“复制”按钮。点击它可将该文本框的内容复制到剪贴板。
4. 在“UML”、“C++”旁边有一个“粘贴转换再复制”按钮。点击它,将会依次执行“将剪贴板中的文本张贴到源参数列表”、“转换”、“将该文本框的内容复制到剪贴板”这三项功能。
该工具的关键代码在paramsFromObjc函数中,用状态机去解析Objective-C参数列表字符串。
代码如下——
// // 取得命名对象
function $(id)
{
if (document.getElementById) return document.getElementById(id); // DOM
if (document.all) return document.all[id]; // IE4
if (document.layers) return document.layers[id]; // Netscape4
return null;
}
// 取得控件文本。支持 input。
function getCtlText(ctl)
{
if (null==ctl) return;
return ctl.value;
}
// 设置剪贴板文本.
function clipboard_settext(txt) {
if (window.clipboardData) {
window.clipboardData.setData("Text", txt);
}
else if (navigator.userAgent.indexOf("Opera") != -1) {
window.location = txt;
}
else if (window.netscape) {
try {
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
} catch (e) {
alert("浏览器拒绝访问!");
return false;
}
var clip = Components.classes['@mozilla.org/widget/clipboard;1'].
createInstance(Components.interfaces.nsIClipboard);
if (!clip) return false;
var trans = Components.classes['@mozilla.org/widget/transferable;1'].
createInstance(Components.interfaces.nsITransferable);
if (!trans) return false;
trans.addDataFlavor('text/unicode');
var str = new Object();
var len = new Object();
var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
var copytext = txt;
str.data = copytext;
trans.setTransferData("text/unicode", str, copytext.length * 2);
var clipid = Components.interfaces.nsIClipboard;
if (!clip) return false;
clip.setData(trans, null, clipid.kGlobalClipboard);
}
else {
return false;
}
//alert("复制成功!");
return true;
}
// 获取剪贴板文本.
function clipboard_gettext() {
var rt = null;
if (window.clipboardData) {
rt = window.clipboardData.getData("Text");
}
return rt;
}
// 存储函数参数的类.
function FunctionParam(paramname, paramtype) {
this.paramname = paramname;
this.paramtype = paramtype;
}
// 将 Objective-C参数列表代码字符串 转为 FunctionParam 数组.
function paramsFromObjc(s) {
// == const
// 状态机的状态.
var STATE_DEFAULT = 0; // 默认. 遇到':'时变为 STATE_WILLPARAMTYPE.
var STATE_WILLPARAMTYPE = 1; // 期望参数类型. 遇到'('时变为 STATE_PARAMTYPE.
var STATE_PARAMTYPE = 2; // 参数类型. 遇到')'时变为 STATE_WILLPARAMNAME.
var STATE_WILLPARAMNAME = 3; // 期望参数名. 遇到非空白时变为 STATE_PARAMNAME.
var STATE_PARAMNAME = 4; // 参数名. 遇到非“英文/数字/下划线”时提交,并变回 STATE_DEFAULT.
// == var
var rt = new Array();
var i;
do {
if (!s) break;
var len = s.length;
if (!len) break;
// 使用状态机来解析字符串
var state = STATE_DEFAULT;
var paramname;
var paramtype;
for(i=0; i0) rt=rt+", ";
rt = rt + p.paramname + ":" + p.paramtype;
}
}while(0);
return rt;
}
// 将 FunctionParam数组形式的参数列表 转为 转为C++语法的字符串.
function paramsToCpp(params) {
var rt = "";
do {
if (!params) break;
for(var key in params) {
var p = params[key];
//alert(p.paramtype + " " + p.paramname);
if (rt.length>0) rt=rt+", ";
rt = rt + p.paramtype + " " + p.paramname;
}
}while(0);
return rt;
}
// 进行转换.
function doconv() {
var strSrc = getCtlText($("txtsrc"));
//alert(strSrc);
// 分析参数列表
var params = paramsFromObjc(strSrc);
if (!params) {
// 分析失败.
return;
}
// 测试.
if(false) {
for(var key in params) {
var p = params[key];
alert(p.paramtype + " " + p.paramname);
}
}
// 输出.
var txtuml = $("txtuml");
var txtcpp = $("txtcpp");
txtuml.value = paramsToUml(params);
txtcpp.value = paramsToCpp(params);
}
// 源参数列表_文本改变.
function txtsrc_onchange() {
var chkAuto = $("chkAuto");
if (chkAuto.checked) {
doconv();
}
}
// 源参数列表_粘贴.
function btnsrcpaste_onclick() {
$("txtsrc").value=clipboard_gettext();
doconv();
}
// 自动粘贴转换再复制到剪贴板.
function pasteconvto(ctl) {
btnsrcpaste_onclick();
if (ctl) {
clipboard_settext(ctl.value);
}
}
function oninit() {
// 启动.
}
// ]]>
源参数列表:
自动
UML:
C++:
源码下载——
http://files.cnblogs.com/zyl910/convparam_objc.rar
一、背景
现在很多常用的UML工具不支持Objective-C,在绘制UML时很不方便。得手工将Objective-C语法的参数列表,转为UML语法或C++语法。比较费力且容易出错。于是我想编写一个工具,自动的将Objective-C语法的参数列表转为UML或C++语法。
用什么语言开发呢?
为了跨平台,我决定采用JavaScript来编写该工具。
现在只是一个字符串分析与生成的小工具,JavaScript足以胜任。
二、功能设计
界面如下——基本使用方法——
1. 在“源参数列表”填写Objective-C方法的声明;
2. 点击“转换”按钮,UML与C++文本框出现转换结果;
3. 将UML与C++文本框的转换结果复制到剪贴板,再粘贴到UML工具中。
辅助功能——
1. 在“源参数列表”旁边有一个“粘贴”按钮。点击它便会将剪贴板中的文本张贴到“源参数列表”文本框中。
2. 在“转换”按钮旁边有一个“自动”复选框。若复选框勾选,当“源参数列表”文本框修改完成时,会自动进行转换。
3. 在“UML”、“C++”旁边有一个“复制”按钮。点击它可将该文本框的内容复制到剪贴板。
4. 在“UML”、“C++”旁边有一个“粘贴转换再复制”按钮。点击它,将会依次执行“将剪贴板中的文本张贴到源参数列表”、“转换”、“将该文本框的内容复制到剪贴板”这三项功能。
三、关键代码
该工具的关键代码在paramsFromObjc函数中,用状态机去解析Objective-C参数列表字符串。代码如下——
// 存储函数参数的类. function FunctionParam(paramname, paramtype) { this.paramname = paramname; this.paramtype = paramtype; } // 将 Objective-C参数列表代码字符串 转为 FunctionParam 数组. function paramsFromObjc(s) { // == const // 状态机的状态. var STATE_DEFAULT = 0; // 默认. 遇到':'时变为 STATE_WILLPARAMTYPE. var STATE_WILLPARAMTYPE = 1; // 期望参数类型. 遇到'('时变为 STATE_PARAMTYPE. var STATE_PARAMTYPE = 2; // 参数类型. 遇到')'时变为 STATE_WILLPARAMNAME. var STATE_WILLPARAMNAME = 3; // 期望参数名. 遇到非空白时变为 STATE_PARAMNAME. var STATE_PARAMNAME = 4; // 参数名. 遇到非“英文/数字/下划线”时提交,并变回 STATE_DEFAULT. // == var var rt = new Array(); var i; do { if (!s) break; var len = s.length; if (!len) break; // 使用状态机来解析字符串 var state = STATE_DEFAULT; var paramname; var paramtype; for(i=0; i<len; ++i) { //alert(s[i]); var ch = s[i]; switch(state) { case STATE_DEFAULT: { if (':'==ch) { paramname = ""; paramtype = ""; state = STATE_WILLPARAMTYPE; } } break; case STATE_WILLPARAMTYPE: { if ('('==ch) { state = STATE_PARAMTYPE; } } break; case STATE_PARAMTYPE: { if (')'==ch) { state = STATE_WILLPARAMNAME; } else { paramtype = paramtype + ch; } } break; case STATE_WILLPARAMNAME: { if (' '==ch || '\t'==ch || '\r'==ch || '\n'==ch) { } else { paramname = ch; state = STATE_PARAMNAME; } } break; case STATE_PARAMNAME: { if ( ('_'==ch) || ('0'<=ch && ch<='9') || ('A'<=ch && ch<='Z') || ('a'<=ch && ch<='z') ) { paramname = paramname + ch; } else { // 提交. //alert(paramtype + " " + paramname); var p = new FunctionParam(paramname, paramtype); rt.push(p); // 恢复状态. state = STATE_DEFAULT; } } break; } } // 完成最后一项. if (STATE_PARAMNAME==state) { // 提交. //alert(paramtype + " " + paramname); var p = new FunctionParam(paramname, paramtype); rt.push(p); // 恢复状态. state = STATE_DEFAULT; } }while(0); return rt; }
四、在线工具
// // 取得命名对象function $(id)
{
if (document.getElementById) return document.getElementById(id); // DOM
if (document.all) return document.all[id]; // IE4
if (document.layers) return document.layers[id]; // Netscape4
return null;
}
// 取得控件文本。支持 input。
function getCtlText(ctl)
{
if (null==ctl) return;
return ctl.value;
}
// 设置剪贴板文本.
function clipboard_settext(txt) {
if (window.clipboardData) {
window.clipboardData.setData("Text", txt);
}
else if (navigator.userAgent.indexOf("Opera") != -1) {
window.location = txt;
}
else if (window.netscape) {
try {
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
} catch (e) {
alert("浏览器拒绝访问!");
return false;
}
var clip = Components.classes['@mozilla.org/widget/clipboard;1'].
createInstance(Components.interfaces.nsIClipboard);
if (!clip) return false;
var trans = Components.classes['@mozilla.org/widget/transferable;1'].
createInstance(Components.interfaces.nsITransferable);
if (!trans) return false;
trans.addDataFlavor('text/unicode');
var str = new Object();
var len = new Object();
var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
var copytext = txt;
str.data = copytext;
trans.setTransferData("text/unicode", str, copytext.length * 2);
var clipid = Components.interfaces.nsIClipboard;
if (!clip) return false;
clip.setData(trans, null, clipid.kGlobalClipboard);
}
else {
return false;
}
//alert("复制成功!");
return true;
}
// 获取剪贴板文本.
function clipboard_gettext() {
var rt = null;
if (window.clipboardData) {
rt = window.clipboardData.getData("Text");
}
return rt;
}
// 存储函数参数的类.
function FunctionParam(paramname, paramtype) {
this.paramname = paramname;
this.paramtype = paramtype;
}
// 将 Objective-C参数列表代码字符串 转为 FunctionParam 数组.
function paramsFromObjc(s) {
// == const
// 状态机的状态.
var STATE_DEFAULT = 0; // 默认. 遇到':'时变为 STATE_WILLPARAMTYPE.
var STATE_WILLPARAMTYPE = 1; // 期望参数类型. 遇到'('时变为 STATE_PARAMTYPE.
var STATE_PARAMTYPE = 2; // 参数类型. 遇到')'时变为 STATE_WILLPARAMNAME.
var STATE_WILLPARAMNAME = 3; // 期望参数名. 遇到非空白时变为 STATE_PARAMNAME.
var STATE_PARAMNAME = 4; // 参数名. 遇到非“英文/数字/下划线”时提交,并变回 STATE_DEFAULT.
// == var
var rt = new Array();
var i;
do {
if (!s) break;
var len = s.length;
if (!len) break;
// 使用状态机来解析字符串
var state = STATE_DEFAULT;
var paramname;
var paramtype;
for(i=0; i0) rt=rt+", ";
rt = rt + p.paramname + ":" + p.paramtype;
}
}while(0);
return rt;
}
// 将 FunctionParam数组形式的参数列表 转为 转为C++语法的字符串.
function paramsToCpp(params) {
var rt = "";
do {
if (!params) break;
for(var key in params) {
var p = params[key];
//alert(p.paramtype + " " + p.paramname);
if (rt.length>0) rt=rt+", ";
rt = rt + p.paramtype + " " + p.paramname;
}
}while(0);
return rt;
}
// 进行转换.
function doconv() {
var strSrc = getCtlText($("txtsrc"));
//alert(strSrc);
// 分析参数列表
var params = paramsFromObjc(strSrc);
if (!params) {
// 分析失败.
return;
}
// 测试.
if(false) {
for(var key in params) {
var p = params[key];
alert(p.paramtype + " " + p.paramname);
}
}
// 输出.
var txtuml = $("txtuml");
var txtcpp = $("txtcpp");
txtuml.value = paramsToUml(params);
txtcpp.value = paramsToCpp(params);
}
// 源参数列表_文本改变.
function txtsrc_onchange() {
var chkAuto = $("chkAuto");
if (chkAuto.checked) {
doconv();
}
}
// 源参数列表_粘贴.
function btnsrcpaste_onclick() {
$("txtsrc").value=clipboard_gettext();
doconv();
}
// 自动粘贴转换再复制到剪贴板.
function pasteconvto(ctl) {
btnsrcpaste_onclick();
if (ctl) {
clipboard_settext(ctl.value);
}
}
function oninit() {
// 启动.
}
// ]]>
源参数列表:
自动
UML:
C++:
源码下载——
http://files.cnblogs.com/zyl910/convparam_objc.rar
相关文章推荐
- 【C/C++ 语法备忘】4、可变参数列表
- Visual Paradigm - 一个用于绘制UML的java实现的一个工具软件
- Visual Paradigm - 一个用于绘制UML的java实现的一个工具软件
- 如何将C++程序转为Pascal语法
- 实现Python与JavaScript代码转换的4个工具
- 【C/C++ 语法备忘】2、内存泄露检查工具VLD
- javascript获取参数工具函数
- 使用javascript绘制页面元素-->数据列表
- 从 C++ 到 Objective-C(2):语法概述
- 在线IPv4转换为IPV6,IPV6转为IPV4的工具
- Python和JavaScript间代码转换的4个工具
- JavaScript字符串对象fromCharCode方法入门实例(用于把Unicode值转换为字符串)
- Objective-c 可变参数列表缺陷
- [C/C++不常见语法特性]_[使用dynamic_cast 强制转换的优点]
- c# 语法笔记 适用于从C++转过的,用于速查
- canvas绘图工具加上JavaScript特效绘制出能动的太阳系
- C++ 用于大型程序的工具
- 用于 Web 应用程序项目部署的 Web.config 转换语法
- 如何绘制平台框架的设计图:使用UML工具 推荐
- javascript-window.open()的所有参数列表