将源代码转换为语法高亮图像

时间:2010-10-15 02:01:42

标签: syntax-highlighting imagemagick ghostscript openoffice-writer enscript

背景

OpenOffice Writer无法链接到ASCII文本源文件,应用语法突出显示,将其包装在帧中,并在源文件更改时更新帧内容。但是,OpenOffice Writer可以链接到图像,并在更改时自动更新图像。

问题

图像需要是高分辨率(300 dpi或更高),并且语法着色适合白色背景(即打印页面)。

问题

如何从源代码文件自动创建高质量图像,例如:

  • SQL;
  • PostgreSQL功能;
  • 爪哇;
  • bash脚本;和
  • R和PL / R?

尝试

大多数尝试都是以下主题的变体:

$ enscript --color -f Courier12 -B -1 --highlight=sql -h -o - source.sql |\
  convert - -trim -border 10 source.png

这种方法存在一些问题:

  1. 缺乏解决方案(使用-resample-density未提供改进)。
  2. 语法高亮不适合白页(可能会更改enscript的颜色主题)。
  3. 使用Courier100生成多个.png文件,需要将它们拼接在一起。
  4. -border 10意外地将背景颜色从白色变为浅灰色。
  5. 手动解决方案

    将源文件转换为PostScript - 完全避免使用ImageMagick - 然后将它们导入到GIMP中将产生所需的结果。不幸的是,该解决方案涉及一些手动工作,我的GIMP批处理编程经验几乎没有。

2 个答案:

答案 0 :(得分:5)

软件要求

以下软件包可用于Windows和Linux系统,并且是完整,可用的解决方案所必需的:

  • gvim - 用于将突出显示语法的源代码导出为HTML。
  • moria - 语法高亮的配色方案。
  • wkhtmltopdf - 将HTML文档转换为PDF或PostScript(PS)文档。
  • Ghostscript - 用于将PS转换为PNG。
  • ImageMagick - 用于修剪PNG并添加边框。

一般步骤

以下是该解决方案的工作原理:

  1. 将源代码加载到可以添加颜色的编辑器中。
  2. 将源代码导出为HTML文档(带有嵌入的FONT标记)。
  3. 将HTML文档转换为PS文件。
  4. 将PS文件转换为PNG文件。
  5. 修剪PNG的白色边框和过分热的源代码边框。
  6. 使用与HTML文档相同的背景颜色在图像周围添加边框。
  7. 删除临时文件。
  8. 安装

    将组件安装到以下位置:

    • gvim - C:\Program Files\Vim
    • moria - C:\Program Files\Vim\vim73\colors
    • wkhtmltopdf - C:\Program Files\wkhtml
    • Ghostscript - C:\Program Files\gs
    • ImageMagick - C:\Program Files\ImageMagick

    注意:ImageMagick有一个名为convert.exe的程序,它不能取代Windows convert命令。因此,convert.exe的完整路径必须在批处理文件中进行硬编码(而不是将ImageMagick添加到PATH)。

    环境变量

    添加或更新以下environment variables

    • GS_LIB = C:\Program Files\gs\gs9.00\lib
    • GS_PROG = C:\Program Files\gs\gs9.00\bin\gswin32.exe
    • 路径 = "C:\Program Files\Vim\vim73";"C:\Program Files\wkhtml";"C:\Program Files\gs\gs9.00\bin"

    批处理文件

    以下是批处理源文本:

    @ECHO OFF
    
    ECHO Converting %1 to %1.html ...
    
    gvim -e %1 -c "set nobackup" -c ":colorscheme moria" -c :TOhtml -c wq -c :q
    
    ECHO Converting %1.html to %1.ps ...
    
    wkhtmltopdf --quiet --dpi 1200 %1.html %1.ps
    
    ECHO Converting %1.pdf to %1.png ...
    IF EXIST %1.png DEL /q %1.png
    
    gswin32 -q -dBATCH -dNOPAUSE -dSAFER -dNOPROMPT ^
     -sDEVICE=png16m -dDEVICEXRESOLUTION=600 -dDEVICEYRESOLUTION=600 ^
     -dDEVICEWIDTH=4958 -dDEVICEHEIGHT=7017 -dNOPLATFONTS ^
     -dTextAlphaBits=4 -sOutputFile=%1.png %1.ps
    
    ECHO Trimming %1.png ...
    
    move %1.png %1.orig.png
    
    "C:\Program Files\ImageMagick\convert.exe" -trim +repage -trim +repage ^
      -bordercolor "#f0f0f0" -border 25x25 %1.orig.png %1.png
    
    ECHO Removing old files ...
    IF EXIST %1.orig.png DEL /q %1.orig.png
    IF EXIST %1.html DEL /q %1.html
    IF EXIST %1.ps DEL /q %1.ps
    

答案 1 :(得分:0)

另一种选择是使用catageCodeSnapPolaCodecarbon-now-cli

CodeSnap和PolaCode是Visual Studio Code扩展,可能很难从命令行使用它们,但它们使用起来很简单。将它们安装到编辑器中时,请按照说明进行操作。此解决方案适用于Visual Studio Code支持的所有操作系统。

如果您使用的是基于Debian的Linux发行版,并且已安装Docker,则可以使用以下Shell脚本创建一个Catage Docker映像:

#!/bin/bash
sudo docker build -t catage:local - <<EOF
FROM buildkite/puppeteer
USER node
ENV NPM_CONFIG_PREFIX=/home/node/.npm-global
ENV PATH=$PATH:/home/node/.npm-global/bin
RUN mkdir /home/node/.npm-global
WORKDIR /home/node/app
RUN npm install -g catage
EOF

类似地,可以使用以下脚本创建一个carbon-now-cli Docker映像:

#!/bin/bash
sudo docker build -t carbon-now:local - <<EOF
FROM alekzonder/puppeteer
USER root
RUN apt-get update
RUN apt-get install git -yq
RUN yarn global add carbon-now-cli
USER pptruser
EOF

如下在shell脚本中使用这些Docker映像,以从您的代码段生成PNG映像:

#!/bin/bash
alias catage="sudo -E docker run --rm -it -v $PWD:/home/node/app catage:local catage"
alias carbon-now="sudo -E docker run --rm -it --init --cap-add=SYS_ADMIN --shm-size=1gb --user pptruser -v $PWD:/home/pptruser/app --workdir /home/pptruser/app carbon-now:local carbon-now"
catage --language java --no-line-numbers --theme Material --frame-title "My Code Snippet" --format png "my_code_snippet.java" "my_code_snippet.png" 
carbon-now "my_code_snippet.java" --target "my_code_snippet" --headless

Docker方法适用于Docker支持的所有操作系统。您可能必须根据操作系统的功能来修改上面的Shell脚本示例,但是基本命令保持不变。