您的位置:首页 > 编程语言

Typora 添加 Julia 代码高亮支持

2016-11-02 18:22 696 查看

Typora 添加 Julia 代码高亮支持

Typora - 颠覆写作体验的免费极简 Markdown 编辑器!好用的 MD 格式阅读器!这是来自 异次元 的评价,个人十分赞同。

最近在学习 Julia 语言,跟踪学习《Getting Started with Julia Programming》一书,同时使用 Typora 撰写读书笔记。发现现阶段的 Typora 竟然尚未支持 Julia 语言的代码高亮功能。

既然不支持,那只能自己想办法添加了。

浏览 Typora 主页 http://www.typora.io/,可以找到代码高亮模块
Code Fences
。然后从
Support
页面的
Code Block Styles/Themes
帮助文档中找到了 “Typora use CodeMirror for syntax highlight in code fences. Code fences in typora use cm-s-inner as their theme class.” 这句话。从此可知,Typora 使用的代码高亮模块是 CodeMirror。

进入 CodeMirror 主页:



CodeMirror is a versatile text editor implemented in JavaScript for the browser. It is specialized for editing code, and comes with a number of language modes and addons that implement more advanced editing functionality.

然后查看 language modes 链接,可以找到对 Julia 语言支持。

下载最新版的 CodeMirror 并解压缩,在
\mode
子文件夹中找到
\julia
文件夹,里面就是 CodeMirror 对 Julia 语法高亮的支持文件
julia.js


好了,CodeMirror 语法高亮 Julia 模块已经准备就绪,开始着手改造 Typora 吧。

进入 Typora 的安装路径,继续进入
\resources\app
目录,可以找到
lib.asar
文件,这就是修改的关键文件!

lib.asar 文件是由 Node.js asar 打包而成的包文件,使用 asar 可以将其解包。当然,使用 asar 需要 Node.js 的支持:

npm install -g asar

asar extract lib.asar lib


这时将自动生成
\lib
目录。

接着进入
\lib\codemirror
目录,找到
mode.min.js
文件,其内容如下:

function Context(a,b,c,d,e){this.indented=a,this.column=b,this.type=c,this.align=d,this.prev=e}function isStatement(a){return"statement"==a||"switchstatement"==a||"namespace"==a}function pushContext(a,b,c){var d=a.indented;return a.context&&isStatement(a.context.type)&&!isStatement(c)&&(d=a.context.indented),a.context=new Context(d,b,c,null,a.context)}function popContext(a){var b=a.context.type;return(")"==b||"]"==b||"}"==b)&&(a.indented=a.context.indented),a.context=a.context.prev}function typeBefore(a,b){return"variable"==b.prevToken||"variable-3"==b.prevToken?!0:/\S(?:[^- ]>|[*\]])\s*$|\*$/.test(a.string.slice(0,a.start))?!0:void 0}function isTopScope(a){for(;;){if(!a||"top"==a.type)return!0;if("}"==a.type&&"namespace"!=a.prev.type)return!1;a=a.prev}}function words(a){for(var b={},c=a.split(" "),d=0;d<c.length;++d)b[c[d]]=!0;return b}function contains(a,b){return"function"==typeof a?a(b):a.propertyIsEnumerable(b)}function cppHook(a,b){if(!b.startOfLine)return!1;for(var c,d=null;c=a.peek();){if("\\"==c&&a.match(/^.$/))
...


简直就是天书啊~~~

没关系,肯定是混淆过的代码,找个在线转换器搞定:

function Context(a, b, c, d, e) {
this.indented = a,
this.column = b,
this.type = c,
this.align = d,
this.prev = e
}
function isStatement(a) {
return "statement" == a || "switchstatement" == a || "namespace" == a
}
function pushContext(a, b, c) {
var d = a.indented;
return a.context && isStatement(a.context.type) && !isStatement(c) && (d = a.context.indented),
a.context = new Context(d, b, c, null, a.context)
}
...


是不是一下就清爽了 :smile:

仔细在代码中搜索以下内容:

CodeMirror.defineMIME(“text/x-ruby”, “ruby”),

找到该位置后,打开 CodeMirror 目录中的
julia.js
文件,将其内容复制,然后粘贴到
mode.min.js
文件所对应的位置。注意,需要复制的内容如下所示:

CodeMirror.defineMode("julia", function(_conf, parserConf) {
var ERRORCLASS = 'error';

function wordRegexp(words, end) {
if (typeof end === 'undefined') { end = "\\b"; }
return new RegExp("^((" + words.join(")|(") + "))" + end);
}

var octChar = "\\\\[0-7]{1,3}";
var hexChar = "\\\\x[A-Fa-f0-9]{1,2}";
var specialChar = "\\\\[abfnrtv0%?'\"\\\\]";

...

});

CodeMirror.defineMIME("text/x-julia", "julia");


复制完毕后,需要将刚刚复制过来的代码的最后两个分号
;
改为逗号
,
才可以生效。

修改完毕,需要将其打包成原来的样子,执行以下命令:

asar pack lib lib.asar


至此,Typora 已经可以支持 Julia 的语法高亮了,但是还需在代码选择框中显示,以供用户选择。

打开
\Typora\resources\app\app\window\frame.js
文件,搜索以下内容:

case”java”:return a=”text/x-java”;

找到后,复制粘贴这段代码,并修改成以下代码:

case"julia":return a="text/x-julia";


接着搜索以下代码:

“javascript”,”java”,”json”,

找到后,在这段代码后面添加以下代码:

"julia",


OK 咯~~~

重新打开 Typora 软件,按下
CTRL + ALT + F
组合键,打开代码输入区域,按
键转到语言选择框,输入并选择 julia 语言项:



选择 julia 语言,按
键进入代码编辑区域,输入有效的 Julia 代码,可以看到代码高亮功能已经支持:



搞掂鸟~~~

以上
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息