求把js.min的文件还原成带换行带缩进的C#代码

JavaScript027

求把js.min的文件还原成带换行带缩进的C#代码,第1张

格式化工具很多,如果只单纯想格式化一下,可以用工具

不过看楼主的意思是想自己通过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后缀