加载中…
正文 字体大小:

用source-highlight将Matlab代码转换为高亮HTML

(2010-03-05 13:20:04)
标签:

杂谈

分类: 计算机与 Internet

代码的更新和相关的内容参见引用通告

     前些时发现GnuWin32里有一款名为source-highlight的工具。虽然我自己也写过用于Matlab的语法高亮HTML的Python脚本(参见《将m文件转化为html文件》),但通用性不强。而source-highlight则提供一种小型的语言,能够对其它语言的元素进行描述,因而是一款通用的语法高亮工具。

     我粗略看了一下source-highlight的文档,然后试着自己编写相应的source-highlight配置文件,使其能够处理Matlab代码(目前GnuWin32提供的source-highlight版本是2.1.2,不直接支持Matlab代码)。

     第一步:新建一个名为matlab.lang的文件;

     第二步:处理关键字:在Matlab的Command Window中输入:

>> iskeyword

ans =

    'break'
    'case'
    'catch'
    'classdef'
    'continue'
    'else'
    'elseif'
    'end'
    'for'
    'function'
    'global'
    'if'
    'otherwise'
    'parfor'
    'persistent'
    'return'
    'spmd'
    'switch'
    'try'
    'while'

     然后将ans下面的keywords复制到clipboard中,打开cmd,输入:

C:\LAB>clipb.py /r /t | gawk "BEGIN{FS=\"'\";ORS=\"^|\"};{print $2}"

     (clipb.py是我写的一个Python脚本,可以将clipboard中的文本送入stdout,参见《将clipboard的内容输出到stdout和把stdin接收的文本放进clipboard的Python程序》

     得到:

break|case|catch|classdef|continue|else|elseif|end|for|function|global|if|otherwise|parfor|persistent|return|spmd|switch|try|while|

     将最后一个|去掉,两头加上双引号,在matlab.lang里添加:
keyword = "break|case|catch|classdef|continue|else|elseif|end|for|function|global|if|otherwise|parfor|persistent|return|spmd|switch|try|while"

     第三步:定义注释:在matlab.lang里添加

comment start "%"

     第四步:定义字符串。定义Matlab的字符串有一个难点:单引号既是表示字符串的符号,同时又是转置运算符,如果我们将字符串简单地定义成:

string delim "'" "'" escape "''"

则source-highlight会错误地将转置运算符后面的部分当成字符串,例如:

%含有转置运符和字符串的表达式
str5=[num2str(numel(a')) '123' num2str(numel(b'))];
str5=['123' num2str(numel(a.'))];
str5=[num2str(b') '123'];

比如最后一行,[num2str(b') '123'],第一个单引号是作用于b的转置运算符,却被错误地当成了字符串的起始。

     参照以前的思路,共轭转置运算符必然位于变量的后面,而变量的最后一个符号必须是大小写字母,数字,下划线,对于非共轭转置运算符,其单引号前面是一个dot。于是我试着用Regular Expression来定义字符串:

string delim '[^a-zA-Z0-9_.]\'' "'" escape "''"

     然而这样也不行,虽然利用这个Regular Expression能够区分字符串与转置运算符,但是它会将字符串开始处的单引号前面的那个字符也高亮了!例如:

%含有转置运符和字符串的表达式
str5=[num2str(numel(a')) '123' num2str(numel(b'))];
str5=['123' num2str(numel(a.'))];
str5=[num2str(b') '123'];

如倒数第二行,字符串'123'前面的中括号也上色了!

     后来我想到一个解决办法,定义一个trans,用来表示转置运算符:

trans = '[a-zA-Z0-9_.]\''

     然后再用普通的方式定义字符串,就没有问题了!

string delim "'" "'" escape "''"

运行的效果是:

%含有转置运符和字符串的表达式
str5=[num2str(numel(a')) '123' num2str(numel(b'))];
str5=['123' num2str(numel(a.'))];
str5=[num2str(b') '123'];

     第五步:现在利用matlab.lang,source-highlight可以将Matlab代码中的关键字,字符串,注释正确地上色了,但是我仍然不满意,希望配色风格能够和Matlab的edit一致。要实现这一愿望,首先新建一个matlab.style文件,在里面添加:

keyword blue;
string #a020f0;
comment darkgreen;

     第六步:在lang.map中添加:

matlab = matlab.lang

就可以了。

     让我们看看最终效果,打开cmd输入:

source-highlight -s matlab --style-file=matlab.style -i c:\lab\mtest.m -o c:\lab\mtest.html

     输出的mtest.html效果为:

function [c,d]=mtest(a,b)
%测 试 文 件%下面是含有关键字的注释%if function while break for%下面是含有关键字的字符串 str1='if function while break for';
a=0;

%不是关键字的变量名 ifa=1; if_a=2;%下面是if的多种写法if(0==a),a=1,endif 0==a
a=1
end b=0;if 0==b,
if(0==a),
a=0;
endelseif(1==b)
a=2;
else a=3end%switchswitch b
case 1,a=0;
case 2,a=1;
case 3,a=2;
end%一行含有多个字符串 str2=['123''456''789'];
%字符串中含有% str3=['%%%''123%'] %注释%%重复字符串 str4=['123''123'];
%含有转置运符和字符串的表达式 str5=[num2str(numel(a')) '123' num2str(numel(b'))];
str5=['123' num2str(numel(a.'))];
str5=[num2str(b') '123'];

%注释中有单引号括起来的字符串%str='123'%循环for(k=1:10),a=0,endfor k=1:10
a=0;
endwhile 0==b
if 0==a
breakendif 3==b
continueendend

基本完成我们的目标。

 

返回首页    Matlab(及其它M软件)    匿名留言板


附一,matlab.lang:

# --2010.03.05--
# --AM 09:30--
# --Source-Highlight2.1.2--
# --Windows XP 32--
# --xialulee.spaces.live.com--
# --matlab.lang--

keyword = "break|case|catch|classdef|continue|else|elseif|end|for|function|global|if|otherwise|parfor|persistent|return|spmd|switch|try|while"

comment start "%"

trans = '[a-zA-Z0-9_.]\''

string delim "'" "'" escape "''"

 

附二,matlab.style

// --2010.03.05--
// --AM 09:40--
// --Source-Highlight2.1.2--
// --Windows XP 32--
// --xialulee.spaces.live.com--
// --matlab.style--

keyword blue;
string #a020f0;
comment darkgreen;

0

阅读 评论 收藏 转载 喜欢 打印举报
  • 评论加载中,请稍候...
发评论

       

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 不良信息反馈 电话:4006900000 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有