让码上掘金成为其他编程语言的Playground

avatar
掘金前首席打杂官

上个月,码上掘金低调上线了一个新功能,这个功能看起来不起眼,但相当有用,它能让你不仅可以用码上掘金写前端代码片段,还可以将它扩展到其他语言。

具体用法我们来看一下。

截屏2022-07-08 下午6.06.00.png

首先我们看到,在Script的Tab下,有一个Custom的分类,那么这个Custom要怎么使用呢?

当分类切换到Custome之后,我们要做的事,是先给代码的第一行添加一个Hashbang,格式为:

#!/jcode/lang/语言类型 https://语法解析.json

这个Hashbang分为两部分,#!/jcode/lang/语言类型指定语言,码上掘金会根据语言类型,将后续的代码渲染为:

<script type="text/语言类型">
...
</script>

后面的URL指定一个语法高亮JSON文件,这个语法高亮文件是一个MonacoEditor的语法高亮配置。

一般的MonacoEditor语法高亮配置是JS,但是因为安全考虑,码上掘金不支持直接引用JS语法高亮文件,所以我们要将它转换为JSON文件,你可以通过下面这个码上掘金代码进行转换:

code.juejin.cn/pen/7118928…

或者使用这个GitHub项目:github.com/xitu/jcode-…

将JSON文件准备好之后,我们就可以将JSON文件发布,把URL添加在hashbang之后,如下图所示:

截屏2022-07-08 下午6.07.22.png

这样码上掘金就可以正常处理指定的编程语言的语法高亮了。

处理完语法高亮之后,代码还不能运行,因为这时候,马上掘金仅仅是将它用自定义的script标签渲染到了页面上,我们需要引入处理该语言的运行时脚本,比如上面例子的文言文编程,我们需要引入 github.com/wenyan-lang…

不同的运行时库有不同的API,我们只要拿到渲染的script标签中的代码,然后根据不同的运行时API进行解析:

<div id="app"></div>
<script>
  (async function() {
    const code = await JCode.getCustomCode();
    const jscode = Wenyan.compile(code, {
      logCallback: () => {},
      importPaths: ['https://akira-cn.github.io/wenyan-demos/'],
      allowHttp: true,
    });
    Wenyan.evalCompiled(`(async () => {${jscode}})()`);
  }());
</script>

要拿到自定义script标签里的代码,我们可以在Markup的Tab中使用await JCode.getCustomCode(),为此我们要添加jcode-tools依赖:

image.png

接着我们添加文言文运行时代码库:

image.png

这样我们就实现了让码上掘金运行文言文编程语言的功能。

最后总结一下,把这几个步骤合在一起,就是下面这张图所示:

image.png

目前我在这个项目 github.com/xitu/jcode-… 下整理了九种不同的编程语言支持,未来还会持续添加,大家可以关注一下:

语言json 文件示例运行时
glsllang-glsl🎯 glsl-demoglsl-doodle
lualang-lua♟ lua-demofengari-lua
markdownlang-markdown📓 markdown-demomarkdedjs
pythonlang-python🐍 python-demobrython
schemelang-scheme🐵 scheme-demolips
sqllang-sql🦗 sql-demojSQL
webslideslang-webslides🐙 webslides-demowebslides.md
文言文lang-wenyan🐧 wenyan-demowenyan-lang

后续还会继续添加新的编程语言支持进来,大家有想要支持的编程语言,也欢迎给这个项目提交PR。