Matlab 实验笔记(Live Script)保存为html格式,但Title为Untitled? 如何修改?

实验笔记是个好东西。如果你做了一堆研究,最后发现以前做过的东西忘记放在哪里了,或者说代码已经被你修改得面目全非了,你想对比一下当下的结果和当时的结果,这可能会给你带来无尽的烦恼。  Python的Jupyter确实可以解决上述的问题,它可以将代码,结果,备注(说明,公式等)展示在同一个文件中,打开速度也很快,如果没有别的需求,这应该是最完美的工具。  但是我对Matlab依赖比较强,想用Matlab实现同样的功能,该怎么办呢?  Matlab的确提供了相关的功能,即实时脚本(live script),具体使用方法建议参考官网的帮助文档,文档的扩展名是.mlx。

不过,文档需要在Matlab中打开,Matlab的启动速度的非常慢,所以为了快速查阅实验笔记,我们可以将其导出为.html格式。

给文件起个名字,假设为'实验笔记20200630.html', 用浏览器打开,效果如下。可以看出展示效果还是很棒的,但是网页的Title和文件名不符。这就带来了很大的麻烦,如果我们保存了很多实验笔记,并且同时打开了很多文件,我们如何通过Title来区别文件呢?

下面就是本文的重点:我特意研究了,发现无法通过设置修改保存的html文件的title (官方程序员肯定是偷懒了,希望官方可以修理这个bug),所以我只能通过撸代码强行修改html源代码里的Title了。html的源代码长这样:

源代码的编码为UTF-8, 我保存的文件名有中文字符,所以这就涉及到编码转换的问题,这是麻烦1;麻烦2就是说如果为了修改Title而把整个文件都修改了则会极大降低效率,得不偿失。分析发现:上图红色框框内的内容是无用的,可以将其改写掉,所以红线框+绿线框内的内容就是我需要替换掉的部分;而假如文档标题长度小于框框内的长度,我们可以在修改后的第二行后面插入多余的换行符,这样就不会影响到第三行及之后的内容。

经过加班加点加调试,终于搞定这个问题,Matlab代码如下。它的主要功能就是修改当前路径下html文件的title(Matlab Live Script导出的html文件)

function Html_ChangeTitle
%% 获取当前的工作路径    
    path = cd;
%% 获取当前文件夹下的所有.html文件
    fileExt = '*.html';
    files = dir(fullfile(path,fileExt));
    len = size(files,1);
    fprintf('[Tips] -- 开始更改文件名-------------------\n');
    for i=1:len
        fileName = files(i,1).name;
        fileName(end-4:end) = []; % 去除.html字符
        fileFullName = strcat(path,'\',files(i,1).name);
        fid = fopen(fileFullName,'r+','n','UTF-8'); 
            % 'r+'    打开后先读后写。该文件必须已存在
            % 'UTF-8' 读写的编码格式 UTF-8
        % 更改文件名
        changename(fid,fileName);
        fclose(fid);
    end
    % 提示更改完毕
    fprintf('[Tips] -- 文件名更改完毕-------------------\n');
end


function changename(fid,fileName)
    while 1
        line = fgetl(fid); % 从文件中读取“下一行”,并且移除换行符(\n)
        if ~ischar(line)   %判断是否为字符,如果不是则中断
            warning('[ERROR] -- line非字符');
            break;
        end
        % 寻找k1的位置, 比较特殊
        k1 = strfind(line,'<meta name="generator"');
        % contains(line,'<meta name="generator"'); % 18才有此功能
        if isempty(k1)
            k1 = strfind(line,'<title>');
        end
        k2 = strfind(line,'</title>');
        if ~isempty(k1) && ~isempty(k2)
            % 文件名已经更改好, 无需更改
            flag = strfind(line,['<title>',fileName,'</title>']);
%             contains(line,['<title>',fileName,'</title>'])
            if ~isempty(flag)
                fprintf('[Tips] -- 已忽略,无需更改, %s.html \n',fileName);
                break;
            end
            % 移动插入点(从插入点覆盖写入文件)
            offset = length(unicode2native(line,'UTF-8')) + 2 - length(unicode2native(line(1:k1),'UTF-8'));
            % 每行结尾有LF,所以要加2(Windows)
            fseek(fid, -offset, 'cof');      % 向前偏移, 所以要加负号
            % 写入的内容
            % chip1 = line(1:k1+6);
            chip3   = line(k2:end);    % chip3后面可能有制表符
            newline = ['<title>',fileName,strrep(chip3,'	','')];
            % 判断文件名是否过长(在UTF-8编码中,一个汉字的长度是3)
            L0 = length(unicode2native(line(k1:end),'UTF-8'));
            L1 = length(unicode2native(newline,     'UTF-8'));
            if L1 > L0
                fprintf('[Tips] -- 已忽略,名字过长, %s.html \n',fileName);
                break;   % 文件名已经更改好, 无需更改
            else
%                 fprintf(fid,['%s',repmat('\t',1,(L0-L1))],native2unicode(newline,'UTF-8'));
                fprintf(fid,['%s',repmat('\t',1,(L0-L1))],newline);
                % 如果文件名过短, 将剩余部分全部用换行符覆盖
                fprintf('[Tips] -- 已更改,更改完毕, %s.html \n',fileName);
            end
            % 不用加换行符和回车符 '\r\n'
            % count  = fwrite(fid,native2unicode(newline,'UTF-8'),'char');
            break;
        else
            continue;
        end
    end
end

将代码保存为Html_ChangeTitle.m,放在Matlab的path(默认路径)中,然后将其添加到快速访问工具栏,过程如下

在浏览器中打开更改了Title的实验笔记,效果如下。

至此搞定,心里的石头也落地了😂。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值