格式化工具很多,如果只单纯想格式化一下,可以用工具
不过看楼主的意思是想自己通过C#实现格式化功能,我想了个笨办法,效率可能不是太高,仅供参考,大概思路是:
1、先将{、}、替换为{\r、}\r、\r,以实现换行
2、再根据{、}的位置插入相应空格实现缩进
写了个Demo,以4个字符长度为缩进距离,楼主可以试试,换行缩进基本满足,有些细节可能还需调整
/// <summary>/// 格式化js代码
/// </summary>
/// <param name="js">原js代码</param>
/// <returns>格式化后的js代码</returns>
private string formatJavaScript(string js)
{
string jsStr = js.Replace("{", "{\r").Replace("}", "}\r").Replace("", "\r")
int indentIndex = 0
for (int i = 0 i < jsStr.Length i++)
{
if (jsStr[i] == '\r' && jsStr[i - 1] == '{')
{
indentIndex++
jsStr = jsStr.Insert(i + 1, getSpace(indentIndex))
i = i + 4 * indentIndex + 1
}
else if (jsStr[i] == '\r' && jsStr[i - 1] == '}')
{
indentIndex--
jsStr = jsStr.Remove(i - 5, 4)
i = i - 4
}
if (jsStr[i] == '\r')
{
jsStr = jsStr.Insert(i + 1, getSpace(indentIndex))
i = i + 4 * indentIndex + 1
}
}
return jsStr
}
/// <summary>
/// 获得一定字符长度的空格字符串
/// </summary>
/// <param name="index">JS代码大括号层级</param>
/// <returns>空格字符串</returns>
private string getSpace(int index)
{
string str = string.Empty
for (int i = 0 i < index i++)
{
str += " "
}
return str
}
//调用
string jsMin = "function test(){var text=1var text=2if(true){var text=3var text=4if(true){var text=5var text=6}}else{var text=7}}"
string jsNew = formatJavaScript(jsMin)
恢复不过来。
如果只是单纯的格式化(换行、缩进),那么有很多在线工具,百度一下就可以了。但是往往还有压缩,这是不可能恢复的了。
比如正常的代码有:
function test(object, key, value){alert(object)
alert(key)
alert(value)
} // 仅仅是示例代码,无实际意义
那么压缩之后可能就会变成:
function test(a,b,c){alert(a)alert(b)alert(c)}省略了一切无用的空格、换行和缩进,同时把封装在内部的各种变量和形参都压缩成字符长度更短的了,因为封装好之后开发者就无需再关心内部是怎么处理逻辑的了,原先可以其他自注释的变量名就可以缩短以节省空间了。所以,压缩是不可逆的。
这是uglify的结果。一般用gulp或者grunt来compile js 的时候都会添加相关的uglify应用(例如gulp-uglify)。uglify 就是把空格删除把变量和函数名替换成a,b,c,d等等
网上应该有反编译的应用(当然只能把空格还原,文件格式还原,变量和函数名称是无法还原的除非你有当初uglify时候生成的map文件)。
一般的开源第三方代码都会有uglify之后和之前的两个版本(你可以在本地调试的时候加载uglify之前的)。很多第三方uglify之后的文件都是.min.js后缀