npm.io
0.3.1 • Published 1 month ago

painter-highlight

Licence
ISC
Version
0.3.1
Deps
2
Size
47 kB
Vulns
0
Weekly
0

painter-highlight

一个基于 highlight.js 的高亮代码图片生成工具,支持两种渲染引擎(canvas 原生绘制 / painter-kernel 视图系统),用于快速生成带语法高亮的代码截图。

使用场景:分享代码片段到不支持高亮的平台、VSCode 插件、社交媒体、文档等。

安装

npm install painter-highlight
# 或
yarn add painter-highlight

快速开始

import phl from 'painter-highlight';

const canvas = document.getElementById('canvas') as HTMLCanvasElement;
const ctx = canvas.getContext('2d')!;

await phl({
  canvasNode: canvas,
  ctx,
  code: 'const x = 42;',
  language: 'javascript',
});

API

phl(options: RenderOptions): Promise<void>

生成高亮代码图片到指定 canvas。

参数:RenderOptions
字段 类型 必需 说明
canvasNode HTMLCanvasElement 目标 canvas 元素
ctx CanvasRenderingContext2D canvas 上下文(通过 getContext('2d') 获取)
code string 要高亮的代码
language string 代码语言(如 'javascript', 'typescript', 'python' 等)
renderer 'canvas' | 'kernel' 渲染引擎,默认 'canvas'
theme 'githubDark' | 'dracula' | 'oneDark' 主题,默认 'githubDark'
lineNumber boolean 是否显示行号,默认 false
title string 窗口标题(显示在顶部),默认 undefined
fontSize number 字体大小(像素),默认 14
width number 自定义宽度(像素),默认自动计算
height number 自定义高度(像素),默认自动计算
borderRadius number 圆角半径(像素),默认 8

使用示例

基础用法
import phl from 'painter-highlight';

const canvas = document.getElementById('code-canvas') as HTMLCanvasElement;
const ctx = canvas.getContext('2d')!;

await phl({
  canvasNode: canvas,
  ctx,
  code: `function hello() {
  console.log('Hello, World!');
}`,
  language: 'javascript',
  title: 'hello.js',
  lineNumber: true,
});
选择主题
await phl({
  canvasNode: canvas,
  ctx,
  code: 'const x = 42;',
  language: 'javascript',
  theme: 'dracula',  // 或 'oneDark'、'githubDark'
});
选择渲染引擎

Canvas 渲染(默认,性能好,兼容性强):

await phl({
  canvasNode: canvas,
  ctx,
  code: 'const x = 42;',
  language: 'javascript',
  renderer: 'canvas',
});

Painter-Kernel 渲染(特殊小程序环境,需要支持 painter-kernel):

await phl({
  canvasNode: canvas,
  ctx,
  code: 'const x = 42;',
  language: 'javascript',
  renderer: 'kernel',
});
完整示例(Vue 3)
<template>
  <div class="demo">
    <div class="controls">
      <input v-model="code" type="textarea" placeholder="输入代码..." />
      <select v-model="language">
        <option value="javascript">JavaScript</option>
        <option value="typescript">TypeScript</option>
        <option value="python">Python</option>
      </select>
      <select v-model="theme">
        <option value="githubDark">GitHub Dark</option>
        <option value="dracula">Dracula</option>
        <option value="oneDark">One Dark</option>
      </select>
      <button @click="generate">生成</button>
    </div>
    <canvas ref="canvas"></canvas>
  </div>
</template>

<script setup lang="ts">
import { ref } from 'vue';
import phl from 'painter-highlight';

const canvas = ref<HTMLCanvasElement>();
const code = ref('const x = 42;');
const language = ref('javascript');
const theme = ref('githubDark');

const generate = async () => {
  if (!canvas.value) return;
  const ctx = canvas.value.getContext('2d')!;
  await phl({
    canvasNode: canvas.value,
    ctx,
    code: code.value,
    language: language.value,
    theme: theme.value as any,
    lineNumber: true,
    title: 'code.js',
  });
};
</script>

主题

内置 3 个主题,覆盖常见配色:

  • githubDark - GitHub 深色主题(默认)
  • dracula - Dracula 经典主题
  • oneDark - One Dark Pro 主题

可通过 THEMES 导出查看完整主题定义:

import { THEMES } from 'painter-highlight';
console.log(THEMES.githubDark);

渲染流程

代码 (string)
    ↓
tokenize (highlight.js 解析)
    ↓
Token 流
    ↓
layout (按行切割、计算列宽)
    ↓
CodeDoc
    ↓
theme (解析配色方案)
    ↓
Theme
    ↓
Renderer (canvas 或 kernel)
    ↓
Canvas 图片

Demo

本地开发查看两个渲染引擎的并排对比:

npm run demo

然后打开 http://localhost:8000,可以:

  • 选择代码预设(TypeScript、中文注释、深层缩进、长行)
  • 实时调整语言、主题、行号、标题
  • 并排比较两个渲染引擎的效果差异

特性

  • 两种渲染引擎(Canvas 原生 / Painter-Kernel 视图系统)
  • 3 个内置主题(GitHub Dark / Dracula / One Dark)
  • CJK 宽字符处理(中文、日文、韩文等)
  • 行号支持
  • 自定义标题栏
  • 自动或手动尺寸设定
  • 圆角窗口风格
  • highlight.js 全语言支持

贡献

欢迎提交 Issue 和 PR!

许可

ISC

Keywords