Добавить заголовок к файлу без изменения файла - PullRequest
1 голос
/ 02 ноября 2010

Фон

Команда enscript может применять подсветку синтаксиса к различным типам исходных файлов, включая операторы SQL, сценарии оболочки, код PHP, файлы HTML и многое другое. Я использую enscript для создания изображений исходного кода с разрешением 300 точек на дюйм для технического руководства:

  • Создание контента для книги на основе фактического исходного кода.
  • Распространение исходного кода вместе с книгой без каких-либо изменений.
  • Запускайте и тестируйте сценарии во время написания книги.

Задача

Следующий скрипт оболочки выполняет преобразование практически так, как нужно:

#!/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

Проблема в том, что фон не светло-серого цвета. Согласно справочной странице enscript параметр --escapes (-e) указывает, что файл (то есть $1) имеет enscript -специфические последовательности управления, встроенные в него.

Добавление контрольных последовательностей означает дублирование кода, что лишает цели наличия единственного источника.

Решение

Документация enscript подразумевает, что должна быть возможность объединить два файла вместе (цель и «заголовок») перед запуском сценария, чтобы создать третий файл:

^@shade{0.85}                  -- header line
#!/bin/bash                    -- start of source file

Затем удалите третий файл после завершения команды.

Вопросы

Q.1. Какой более эффективный способ передачи управляющих последовательностей и исходного файла в программу enscript без использования третьего файла?

Q.2. Какие другие опции доступны для автоматизации подсветки синтаксиса для книги при соблюдении требований единого источника, которые я описал? (Например, напишите книгу в LyX и используйте команды LaTeX для импорта и выделения синтаксиса.)

Ответы [ 2 ]

2 голосов
/ 02 ноября 2010

Q1 Вы можете использовать фигурные скобки '{}' для перенаправления ввода / вывода:

{ 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.

Вы также можете использовать скобки для запуска под-оболочки:

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

Обратите внимание, что точка с запятой после cat необходима с фигурными скобками и не обязательна с круглыми скобками (а пробел необходим после открытой фигурной скобки) - таковы загадки сценариев оболочки.

Q2 У меня нет альтернатив, чтобы предложить.Когда я выпустил книгу (20 лет назад, используя troff), я написал программу для преобразования исходного кода в необходимую разметку, чтобы книга создавалась из исходного кода, но с помощью автоматизированного процесса.

(Достаточно ли высокое разрешение 300 dpi?)

Редактировать

Чтобы обойти программу enscript, интерпретирующую escape-последовательность, встроенную в сам скрипт преобразования:

{ cat ../../enscript-header.txt $1; } |
1 голос
/ 02 ноября 2010

Q2: Используйте LaTeX с пакетом .

...