将标头添加到文件而不更改文件

时间:2010-11-02 07:20:33

标签: bash syntax-highlighting enscript

背景

enscript命令可以将语法突出显示应用于各种类型的源文件,包括SQL语句,shell脚本,PHP代码,HTML文件等。我正在使用enscript为技术手册生成300dpi源代码图像:

  • 根据实际源代码为书籍生成内容。
  • 将源代码与书籍一起分发,不做任何修改。
  • 在编写本书时运行并测试脚本。

问题

以下shell脚本几乎按照需要执行转换:

#!/bin/bash

DIRNAME=$(dirname $1)
FILENAME=$(basename $1)

# Remove the extension from the filename.
BASENAME=${FILENAME%%.*}
FILETYPE=${FILENAME##*.}

LIGHTGRAY="#f3f3f3"

enscript --escapes --color -f Courier10 -X ps -B -1 --highlight=$FILETYPE \
  $2 -h -o - $1 | \
  gs -dSAFER -sDEVICE=pngalpha -dGraphicsAlphaBits=4 -dNOPAUSE -r300 \
  -sOutputFile=$BASENAME.png -dBackgroundColor=16$LIGHTGRAY > /dev/null && \
  convert -trim $BASENAME.png $BASENAME-trimmed.png && \
  mv $BASENAME-trimmed.png $BASENAME.png

问题是背景不是浅灰色。根据{{​​1}}手册页,enscript--escapes)选项表示文件(即-e)具有$1 - 嵌入的特定控制序列它

添加控制序列意味着必须复制代码,这违背了拥有单一来源的目的。

解决方案

enscript文档暗示在运行脚本之前应该可以将两个文件连接在一起(目标和“标题”),以创建第三个文件:

enscript

然后在命令完成后删除第三个文件。

问题

Q.1。在不使用第三个文件的情况下,将源文件管道传输到^@shade{0.85} -- header line #!/bin/bash -- start of source file 程序的更有效方法是什么?

Q.2。还有哪些其他选项可用于自动化书籍的语法高亮显示,同时满足我所描述的单一来源要求? (例如,在LyX中编写本书并使用LaTeX命令进行导入和语法突出显示。)

2 个答案:

答案 0 :(得分:2)

Q1 您可以使用大括号“{}”进行I / O重定向:

{ echo "^@shade{0.85}"; cat $1; } |
enscript --color -f Courier10 -X ps -B -1 --highlight=$FILETYPE $2 -h -o - |
gs -dSAFER -sDEVICE=pngalpha -dGraphicsAlphaBits=4 -dNOPAUSE -r300 \
   -sOutputFile=$BASENAME.png -dBackgroundColor=16$LIGHTGRAY > /dev/null &&
convert -trim $BASENAME.png $BASENAME-trimmed.png &&
mv $BASENAME-trimmed.png $BASENAME.png

这假设当没有给出明确的文件名时,enscript读取其标准输入;如果没有,你可能需要使用一个选项(可能是'-i -')或一些更严重的魔法,甚至可能在bash中使用'进程替换'。

您也可以使用括号来运行子shell:

(echo "^@shade{0.85}"; cat $1) | ...

请注意cat之后的分号是括号所必需的,括号中不需要(在开括号之后需要空格) - 这就是shell脚本的奥秘。

Q2 我没有其他选择。当我出版一本书(20年前,现在使用troff)时,我编写了一个程序,将源代码转换为必要的标记,以便本书是从源代码生成的,但是是通过自动化过程生成的。

(300 dpi足够高的分辨率?)

修改

解决转换脚本本身嵌入的转义序列的enscript程序:

{ cat ../../enscript-header.txt $1; } |

答案 1 :(得分:1)

Q2:将LaTeX与listings包一起使用。