工欲善其事必先利其器,最近在使用ExtJS、EasyUI框架时,经常需要用到一些png图标,从网上收集了将近2000个图标,但还需要生成 css 样式文件, 一个一个写的话太不现实,于是写个小工具生成吧。
我先把图标资源放出来:http://download.youkuaiyun.com/detail/xz2001/5387797
代码都很简单,遍历所有图标,直接生成css文件就行了,直接上代码了:
1 FileName 类
此类用于格式化现有的文件名,以保持文件名和生成的样式class名称风格统一。
public static class FileName
{
private static Dictionary<string, string> Renames = new Dictionary<string, string>();//保存重命名的字符配置,去除些太长的名字
static FileName()
{//这里可以根据自己的需要随意加
Renames.Clear();
Renames.Add("application", "app");
Renames.Add("addresses", "address");
Renames.Add("previous", "prev");
Renames.Add("horizontal", "hor");
Renames.Add("vertical", "ver");
Renames.Add("anticlockwise", "reversed");
Renames.Add("extension", "ext");
Renames.Add("organisation", "organic");
Renames.Add("fastforward", "fast");
}
public static string FormatName(string name)//格式化文件名
{
int index = name.LastIndexOf('.');
string ext = name.Substring(name.LastIndexOf('.'));
name = name.Substring(0, index);
RegexOptions RegexOptions = ((RegexOptions.IgnorePatternWhitespace | RegexOptions.Multiline) | RegexOptions.IgnoreCase);
Regex regex = new Regex(@"[\.\- _]+", RegexOptions);//把原始的文件名中,把英文点、减号、空格和下划线分隔全部替换成减号
name = regex.Replace(name, "-");
return Hump(name) + ext;
}
public static string Hump(string name)
{
var parts = name.Split('-');//以减号拆分成数组,分别处理每一段
for (var i = 0; i < parts.Length; i++)
{
parts[i] = Word(parts[i]);
}
return String.Join("-", parts);//使用减号重新连接处理后的每一段
}
public static string Word(string part)//处理每一个word
{
if (string.IsNullOrEmpty(part))
return null;
part = part.ToLower();
// 简化文件名,如果需要把下面2行注释去掉
//if (Renames.ContainsKey(part))
// part = Renames[part];
if (part.Length == 1)
return part.ToLower();
return part.Substring(0, 1).ToLower() + part.Substring(1).ToLower();//如果喜欢驼峰命名法,可以在这处理,把第一个字符转换成大写即可
}
}
2 Form窗体中的主要处理方法
所有代码请参考源码,这个只是button的处理方法代码:
private void button2_Click(object sender, EventArgs e)
{
textBox1.Text = textBox1.Text.Trim();
if (!System.IO.Directory.Exists(textBox1.Text))//textBox1里应该是选择一个目录位置,里面全是图标文件,在这要判断下这个目录是否存在
{
MessageBox.Show("请选择目录!");
return;
}
label2.Text = "loading...";
textBox1.ReadOnly = true;
var dir = new DirectoryInfo(textBox1.Text);
var files = dir.GetFiles("*.png");//搜索所有.png文件
progressBar1.Maximum = files.Length * 2;//设置进度条为文件数*2,第一次遍历修改文件名,第二次生成css
string newPath;
string tempName;
int count = 0;
int err = 0;
int maxLen = 0;
richTextBox1.Text += "准备格式化文件名...";
foreach (var file in files)//格式化文件名
{
count++;
label2.Text = "格式化第" + count + "个文件:" + file.Name;
progressBar1.Value = count;
tempName = FileName.FormatName(file.Name);//调用静态类的格式化方法
newPath = textBox1.Text + "\\" + tempName;
if (maxLen < tempName.Length)
maxLen = tempName.Length;
try
{
File.Move(file.FullName, newPath);
}
catch
{
richTextBox1.Text += "\n 文件名重复:" + file.Name;
err++;
}
}
// 生成css
richTextBox1.Text += "\n 准备创建css文件...";
StringBuilder sb = new StringBuilder(100);
sb.Append("/* 来自 calvin 的自动生成工具,QQ:54335020 */\r\n");//生成css文件内容
foreach (var file in files)
{
count++;
label2.Text = "生成第" + count + "个文件:" + file.Name;
progressBar1.Value = count;
tempName = file.Name.Substring(0, file.Name.LastIndexOf('.'));
sb.Append(".ic-" + tempName.PadRight(maxLen + 1) + "{ background:url('icons/" + tempName + ".png') no-repeat center center; }\r\n"); //easyui 样式
//sb.Append(".ic-" + tempName.PadRight(maxLen + 1) + "{ background-image:url(../icons/" + tempName + ".png)!important; }\r\n"); //extjs 样式
}
File.WriteAllText(textBox1.Text + "\\style.css", sb.ToString());//向ID文件中写入,文件名是style.css,放在图标目录里
richTextBox1.Text += "\n css文件生成完成";
label2.Text = "处理完成";
textBox1.ReadOnly = false;
}
没啥可讲的,很简单的工具,放个链接: http://download.youkuaiyun.com/detail/xz2001/5387935