LINUX.ORG.RU

[groff] Как применить макросы de


0

0

Имеется файл в формате groff, внутри которого есть локально определённые с помощью директивы .de макросы. Можно ли как-нибудь применить эти макросы к документу, не изменяя в нём более ничего?

Макросы такие:

.de EX \" Begin Example . IP . ft CW . nf . ne \\$1 .. .de EE \" End Example . ft P . fi . PP ..

Применяется каждый из них всего в одном месте, то есть поменять их вручную - говно-вопрос. Но хотелось бы знать как поступать в подобных случаях, если (вдруг) подобные макросы будут попадаться в диких количествах.

Зачем это нужно? Есть программа po4a, которая позволяет получать из оригинального man-файла файл po, который затем можно локализовать и получить переведённый man. Она понимает только те макросы, которые описаны в groff_man(7).


Лор съел разметку, поэтому повторяю макросы:

.de EX \" Begin Example
.  IP
.  ft CW
.  nf
.  ne \\$1
..
.de EE \" End Example
.  ft P
.  fi
.  PP
..
morbo
() автор топика

Что-то я сомневаюсь, что это можно сделать средствами groff. Может быть, какие-то сторонние существуют, чтобы раскрыть макросы по месту и выдать тот же *roff?

groff с опцией -Z может только некий промежуточный формат выводить перед передачей постпроцессору, но формат совершенно не groff'овский.

deroff тоже не то.

Zubok ★★★★★
()

>Применяется каждый из них всего в одном месте, то есть поменять их вручную - говно-вопрос. Но хотелось бы знать как поступать в подобных случаях, если (вдруг) подобные макросы будут попадаться в диких количествах.

Я думаю, что нужен внешний препроцессор для этого дела. Например, тот же pic весь текст в groff, который к нему не относится, пропускает наружу без изменений, а то, что внутри макросов .PS и .PE, преобразует в groff. Поэтому всегда после препроцессора pic можно увидеть получившийся текст в формате groff.

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

Ясно, спасибо за ответ. Я тоже перерыл все доки, но так и не нашёл такой функции.

Видимо в случае необходимости придётся писать препроцессор самостоятельно или попытаться каким-то образом вырвать его из исходников groff.

morbo
() автор топика
Ответ на: комментарий от morbo

Думаю, что sed/awk/sh с простыми заменами макросов справятся. Надо только им где-то указывать, какие макросы раскрывать, а какие — нет.

Zubok ★★★★★
()
Ответ на: комментарий от morbo

>Видимо в случае необходимости придётся писать препроцессор самостоятельно или попытаться каким-то образом вырвать его из исходников groff.

Вообще, в общем случае макросы могут быть довольно сложными. С ветвлениями и пр. фишками. В общем случае придется написать целый roff заново. Вообще, да. Проблемка такая встала и в Emacs. Там есть опциональный такой пакетик woman, который реализует рендеринг man самостоятельно без roff. И там вот та же самая проблема:

One problem arose with the significant number of man pages that use `roff' requests in addition to the `man' macros, and since releasing the first version of WoMan I have been continually extending it to support more `roff' requests. WoMan can now format a significant proportion of the man pages that I have tested, either well or at least readably.

То есть вот человек увидел кучу манов, которые выходили за рамки man macros.

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

>То есть вот человек увидел кучу манов, которые выходили за рамки man macros.

Чаще встречаются просто ошибки, а не какие-то нестандартные макросы. Например, вместо макроса ".PP" могут написать ".pp" или не заэкранировать многоточие в начале строки, в результате чего это многоточие вопринимается как макрос.

Ещё бывают man'ы, полученные из файлов в формате pod с помощью утилиты pod2man. Их вообще человеку прочитать очень тяжело. Но там можно найти соответствующий скрипт на Perl, из которого получается pod, из которого уже получается man.

morbo
() автор топика
Ответ на: комментарий от morbo

>Чаще встречаются просто ошибки, а не какие-то нестандартные макросы. Например, вместо макроса ".PP" могут написать ".pp" или не заэкранировать многоточие в начале строки, в результате чего это многоточие вопринимается как макрос.

Хорошо, что напомнил. Надо будет перепроверить мой 'man s3' в Xorg на подобные ошибки. Запишу себе в TODO.

Zubok ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.