【发布时间】:2020-06-09 15:34:37
【问题描述】:
问题
您好,我正在使用 Jekyll 和 Kramdown 将用 Markdown 编写的帖子呈现为 HTML。我的帖子包含很多数学。我正在使用 KaTeX 宝石。这是在我的_config.yml 文件中:
kramdown:
math_engine: katex
它有效,但它的速度非常慢。整个博客需要大约 250 秒来呈现。这是使用execjs 库运行katex.js 引起的。这是代码的一部分:
ExecJS.compile(open(PATH_TO_JS).read).call("katex.renderToString", toRender, {displayMode: dm))
可能的解决方案
我发现guy on github 反复制作了 Node.JS。我实现了他的解决方案,渲染时间从 250 秒下降到 6 秒。但是当我看到代码本身时,我的眼睛开始流血。他的解决方案使用stdio 与Node.JS 服务器进行通信。这是他的代码示例:
_plugins/katex.rb:
require 'execjs'
module Jekyll
module Tags
class KatexBlock < Liquid::Block
def initialize(tag, markup, tokens)
super
@markup = markup
end
def render(context)
File.open("scripts/katex_server/in", 'w') {
|file| file.write("#{@markup}\n" + super(context))
}
return File.read("scripts/katex_server/out")
end
end
end
end
Liquid::Template.register_tag('latex', Jekyll::Tags::KatexBlock)
脚本/katex_server/服务器:
#!/bin/node
const katex = require('./katex.min.js');
const readline = require('readline');
const fs = require('fs');
const path = require('path');
function recursive_stream() {
var is = fs.createReadStream(path.join(__dirname, 'in'));
is.on("data", function(data) {
request = data.toString();
parameters = request.split("\n")[0];
request = request.substring(parameters.length + 1);
parameters = parameters.trim().split(/\s"/);
os = fs.createWriteStream(path.join(__dirname, 'out'))
os.end(katex.renderToString(request, {
displayMode: parameters.includes("display")
}));
recursive_stream();
});
}
recursive_stream();
问题
如何运行 Node.JS 服务器 INSIDE ruby 脚本?如何使用katex.js来渲染latex?
- TL;DR: 如何让 node.js 服务器与 ruby 脚本通信?
感谢您的帮助
【问题讨论】:
标签: node.js ruby latex jekyll kramdown