HeavenZone 发表于 2025-2-4 10:48:39

分享写的修改字体文件名称的代码


有时候下了很多中文字体,都是字母文件名,不知道是什么字体,需要打开字体文件才知道字体的中文名称,查找批量修改字体名称的工具,没找到好用的,那就试试自己写一个吧。

import win.ui;
/*DSG{{*/
var winform = win.form(text="字体修改工具";right=1170;bottom=741)
winform.add(
["btn_删除字体文件"]={cls="button";text="删除字体文件";left=462;top=38;right=550;bottom=68;z=13};
["btn_添加字体文件"]={cls="button";text="添加字体文件";left=462;top=9;right=550;bottom=39;z=4};
["btn_清除无效字体文件"]={cls="button";text="清除无效字体文件";left=343;top=38;right=462;bottom=68;z=12};
["btn_选择字体文件路径"]={cls="button";text="选择字体文件路径";left=343;top=9;right=462;bottom=39;z=1};
["btn_重命名全部字体文件"]={cls="button";text="重命名全部字体文件";left=270;top=669;right=549;bottom=730;z=6};
["btn_重命名选择的字体文件"]={cls="button";text="重命名选择的字体文件";left=5;top=669;right=269;bottom=730;z=5};
["edit_字体名称"]={cls="edit";left=345;top=629;right=544;bottom=654;edge=1;multiline=1;readonly=1;z=8};
["edit_文件名"]={cls="edit";left=69;top=629;right=257;bottom=654;edge=1;multiline=1;readonly=1;z=7};
["edit_路径"]={cls="edit";left=5;top=9;right=341;bottom=39;edge=1;multiline=1;z=2};
["listbox_字体"]={cls="listbox";left=5;top=78;right=549;bottom=622;edge=1;items={};vscroll=1;z=3};
["re_字体详情"]={cls="richedit";left=562;top=1;right=1168;bottom=730;edge=1;multiline=1;z=11};
static={cls="static";text="文件名";left=15;top=632;right=72;bottom=657;center=1;transparent=1;z=9};
static2={cls="static";text="字体名称";left=278;top=631;right=335;bottom=656;center=1;transparent=1;z=10}
)
/*}}*/

import fsys;
import fsys.dlg;
import fsys.dlg.dir;
import fsys.path;
//import console;
import win.font;
//io.open();

func_文件列表去重 = function() {
        var tab = winform.listbox_字体.items;
        var rst = {}
        // 去重
        if(#tab) {
                tab = table.unique(tab)
                // 去除无效路径 winform.listbox_字体.items
                for k, v in tab {
                        if(!io.exist(v)) {
                                table.remove(tab, k)
                                winform.re_字体详情.print("删除 ->",k, v)
                                //console.dumpJson(tab);
                        } else {
                                table.push(rst, v)
                                winform.re_字体详情.print("无需删除 ->",k, v)
                        }
                }
                winform.listbox_字体.items =rst;
        }
}

// 定义一个函数来判断字符串是否包含中文字符
func_is_有汉字 = function(str) {
    // 遍历字符串中的每个字符
    for i = 1, #str, 1 {
      // 获取当前字符的Unicode编码
      var char = string.slice(str, i, i, true);
      var u = string.charCodeAt(char);
      // 检查Unicode编码是否在中文字符的范围内
      if (u >= 0x4e00 && u <= 0x9fa5) {
            return true;
      }
    }
    return false;
}

winform.btn_添加字体文件.oncommand = function(id,event){
        var tab = fsys.dlg.openEx('字体文件|*.ttf;||',,,winform);
        //console.dumpJson(tab)
        if(#tab) {
                for k,v in tab {
                        winform.listbox_字体.add( v)
                }
                func_文件列表去重()
        }
       
}

winform.listbox_字体.oncommand = function(id,event){
        var p = winform.listbox_字体.selText
        if(p == null) {return;}
        if(io.exist(p)) {
                var p_分解 = io.splitpath(p)
                if(p) {
                        var s = win.font.getResourceInfo(p)
                        winform.edit_文件名.text = p_分解.name
                        winform.edit_字体名称.text = s.description
                        winform.re_字体详情.print(s)
                       
                }
        }
}

winform.btn_选择字体文件路径.oncommand = function(id,event){
        var p = fsys.dlg.dir(, winform, '请选择目录')
    if (p) {
      winform.edit_路径.text = p;
      fsys.enum( p, "*.ttf*",
              function(dir,filename,fullpath,findData){
                      if(filename){
                           io.print("发现文件:"+filename,"完整路径:"+fullpath)/*可使用 return false退出枚举文件过程*/
                           winform.listbox_字体.add( fullpath)
                      }
                      else{
                              io.print( "发现目录:" + dir )
                      }
              },false
             
      );
      func_文件列表去重()
    }
   
}


func_重命名字体 = function(字体路径, 选中索引) {
        var p = 字体路径
        var list_ind = winform.listbox_字体.selIndex
        if(p == null) {return;}
        if(io.exist(p)) {
                var s;
                if(p) {
                        s = win.font.getResourceInfo(p)
                }
                fontname = s.description
                var p_分解 = io.splitpath(p)
                newname = io.joinpath( p_分解.drive, p_分解.path, fontname + p_分解.ext)
                winform.re_字体详情.print("newname = ", newname)
                is_fontname_有汉字 = func_is_有汉字(fontname);
                is_文件名_有汉字 = func_is_有汉字(p_分解.name);
               
                is_a = is_fontname_有汉字 && !is_文件名_有汉字
                is_b = !is_fontname_有汉字 && !is_文件名_有汉字
                is_c = is_fontname_有汉字 && is_文件名_有汉字
                is_d = !is_fontname_有汉字 && is_文件名_有汉字
                is_文件名等于字体名 = fontname == p_分解.name
               
                winform.re_字体详情.print("newname => ", newname)
                if(!is_文件名等于字体名) {
                        //console.log(newname)
                       
                        if( is_a || is_b || is_c) {
                                // 需要修改名字
                                if(io.exist(newname)) {
                                        // 如果目标文件名的文件已存在,加副本2字
                                        var 计数 = 1;
                                        winform.re_字体详情.print("文件名已存在,保存为副本!")
                                        newname2 = io.joinpath( p_分解.drive, p_分解.path, fontname + "-副本(" + 计数 + ")" + p_分解.ext)
                                        winform.re_字体详情.print("newname2 = ", newname2)
                                        if(newname2 !== newname) {
                                                while io.exist(newname2){
                                                        计数 = 计数 + 1
                                                        newname2 = io.joinpath( p_分解.drive, p_分解.path, fontname + "-副本(" + 计数 + ")" + p_分解.ext)
                                                }
                                                io.rename(p, newname2)
                                                winform.listbox_字体.delete(选中索引)
                                                winform.listbox_字体.add(newname2, 选中索引)
                                                winform.re_字体详情.print("修改副本名字成功!")       
                                        }else {
                                                winform.re_字体详情.print("副本已存在,无需修改名字! ")
                                        }
                       
                                } else {
                                        // 如果目标文件名的文件不存在,直接改名
                                        io.rename(p, newname)
                                        winform.listbox_字体.delete(选中索引)
                                        winform.listbox_字体.add(newname, 选中索引)
                                        //winform.listbox_字体. = newname
                                        winform.re_字体详情.print("修改名字成功! => ", newname)
                                }
                        }
                } else {
                        winform.re_字体详情.print("无需修改名字!")
                }

        } else {
                winform.re_字体详情.print("文件不存在:" , p)
        }
}

winform.btn_重命名选择的字体文件.oncommand = function(id,event){
        var 字体路径 = winform.listbox_字体.selText;
        var select_ind = winform.listbox_字体.selIndex;
        func_重命名字体(字体路径, select_ind)
}

winform.btn_重命名全部字体文件.oncommand = function(id,event){
        var tab = winform.listbox_字体.items;
        if(#tab) {
                for k, p in tab {
                        func_重命名字体(p, k)
               
                }
        }
       
}

winform.btn_清除无效字体文件.oncommand = function(id,event){
        var rst = {}
        var tmp_items = winform.listbox_字体.items
        tmp_items = table.unique(tmp_items)
        for k, v intmp_items {
                if( io.exist(v) ) {
                        winform.re_字体详情.print("存在 ", k, v)
                        table.push(rst, v)
                } else {
                        winform.re_字体详情.print("不存在 ", k, v)
                }
        }
        winform.listbox_字体.items = rst;
}

winform.btn_删除字体文件.oncommand = function(id,event){
        winform.listbox_字体.delete()
        import console;
        console.dump(winform.listbox_字体.items)
}




winform.show();
win.loopMessage();
return winform;
页: [1]
查看完整版本: 分享写的修改字体文件名称的代码