Автодокументация исходников посредством PasDoc | 
			01.03.2006 Иван Шихалев  | 
			
Настоящая статья представляет собой описание основных возможностей утилиты PasDoc. Статья не претендует на полноту, но вполне может использоваться для начального знакомства с программой. Для настоящего освоения PasDoc лучше всего просто взять и поэкспериментировать, вооружившись оригинальной (на английском) Wiki-документацией с официального сайта: http://pasdoc.sourceforge.net/.
Программа PasDoc предназначена для того, чтобы формировать документацию по модулям Pascal, используя комментарии в исходных текстах. Поддерживается синтаксис как Delphi, так и Free Pascal1. Сама программа также может быть скомпилирована как тем, так и другим. Впрочем, экспериментальная оболочка GUI должна собираться в Lazarus'е — форм в борландовском формате в исходниках не замечено.
Соответственно, PasDoc может работать на разных платформах — тех, которые поддерживаются FPC (а нас, собственно, они и интересуют).
PasDoc запускается из командной строки и формирует документацию в форматах HTML, HtmlHelp, LaTEX и т.д. из исходных файлов модулей. Что касается графической оболочки, на сегодняшний момент она носит статус экспериментальной и останавливаться мы на ней подробно не будем.
Текущая версия, использованная при написании данной статьи — 0.10.0. В последнее время проект довольно активно развивается, свежую версию см. на SourceForge.
Лицензия — GNU GPLv2.
Сайт — http://pasdoc.sipsolutions.net/ или http://pasdoc.sourceforge.net/.
PasDoc обрабатывает исходные тексты модулей, выполняя синтаксический разбор —
в результате формируется общая структура документации, и разбирая текст
комментариев — из них формируются описания программных элементов. При этом могут
разбираться как все комментарии, так и только помеченные специальными
маркерами (например, “**”), что зачастую удобнее.
Описанием элемента считается непосредственно предшествующий ему
комментарий, или непосредственно следующий за ним и начинающийся с
символа “<”. Исключение может быть сделано для полей, свойств и
т.д., которые удобнее описывать в комментарии родительского элемента (записи,
класса…) используя специальный pasdoc-тег “@member”; для
значений типа-перечисления — “@value”; а также для параметров
подпрограмм — “@param”.
Специальные pasdoc-теги используются также для указания специальной информации (автор, краткое описание…), гиперссылок на другие программные элементы и т.д. Далее мы рассмотрим их подробнее.
Бинарный дистрибутив PasDoc документации не содержит (вероятно, она появится к релизу). Тем не менее, в архиве с исходниками присутствует руководство по программе в форматах HTML и PDF. Впрочем, содержание данного руководства несколько отстает от текущих возможностей программы, как это часто бывает в открытых проектах. Наиболее полную и свежую информацию можно получить на сайте PasDoc.
Рассмотрим, как PasDoc разбирает комментарии в программе… А разбирает он их
поблочно. Блок в данном случае — единичный блочный комментарий —
“{ ... }” или “(* ... *)”, или же последовательность
строчных комментариев — “//”, между которыми нет значащих символов
— допустимы переводы строки с пробелами. Если перед элементом расположены два
блока комментария, то используется только последний.
Зачастую не все комментарии желательно вносить в описания — могут
понадобиться комментарии и сугубо технические. PasDoc предлагает использовать
механизм маркеров — специальных последовательностей символов, которые
выделяют «документирующие» комментарии и позволяют игнорировать прочие.
Подробнее см. далее описание параметров командной
строки “--staronly” и
“--marker”. При использовании маркеров ими
следует помечать комментарии, которые должны рассматриваться как описания —
вставлять маркер сразу после открывающих символов комментария.
Например, если в качестве маркера выбрана последовательность “**”
(именно это делает параметр “--staronly”),
то в описания попадут только комментарии вида: “{** ... }”,
“(*** ... *)” и “//** ...”.
Блок с описанием может располагаться и сразу после объявления
идентификатора, но в этом случае следует непосредственно за открывающими
символами комментария (и маркером, если таковые используются) поместить символ
“<” (знак «меньше»). Следует отметить, что в этом случае
строчные комментарии, идущие подряд, блоком уже не считаются.
unit Dummy;
{< Дурацкий модуль.
 Специально для примера — второй абзац описания.
}
interface
type
  (* Совершенно дурацкий тип-запись. *)
  TDummy = record
           A : Integer; //< Поле «A»
           B : Boolean; //< поле «B»
           end;
implementation
end.
В примере для простоты не использованы маркеры.
Особо следует отметить пустую строчку в первом комментарии. Таким образом
в описании разделяются абзацы (в случае выходного формата HTML — тег
“  ... ”).
Теперь о самом «вкусном»: PasDoc использует специальные ключевые слова,
именуемые «тегами», для дополнительной разметки внутри
комментариев-описаний. Все теги начинаются с символа “@”
(«собака»), а чтобы поместить сам этот символ в выводимый текст, его следует
удвоить — “@@”.
Теги могут иметь параметры, заключаемые в круглые скобки. Как правило,
параметр единственный и представляет собой некий текст, трактуемый так же, как
и общий текст описания. В некоторых случаях параметр трактуется специальным
образом: теги “@link”,
“@code”,
“@longcode”,
“@html” и
“@latex”. Кроме того, ряд тегов трактует
первое слово как идентификатор, а последующий текст — как описание.
На самом деле, скобки вокруг параметров можно и не использовать: если PasDoc не находит открывающую скобку после тега, который предполагает параметры, то трактует как параметр весь текст от тега и до конца строки (или блока комментария). Понятно, что такая форма записи неприменима к параметрам, содержащим несколько строк, а также к параметрам вышеупомянутых специальных тегов.
@abstract(описание)Краткое описание используется в разного рода списках, например, на странице «Все модули» или «Все идентификаторы». В то же время, данное описание попадает и в основное описание элемента — первой строкой.
См. также ключ “--auto-abstract”.
@author(имя <e-mail>)В основном используется внутри описания модуля, но может применяться и для
  классов, интерфейсов и object-типов. Очевидным образом содержит
  информацию об авторе. Например:
@author(Вася Пупкин) 
@created(дата создания) и @lastmod(дата изменения)Позволяют указать дату создания и последнего изменения документа.
  Применяются только в тех же случаях, что и
  “@author”. Какой-либо
  специальный формат даты соблюдать не требуется.
@cvs(строка cvs)Позволяет экстрагировать информацию об авторе и датах модификации из комментариев в CVS формате. Например:
@cvs($Date: 2004/04/20 02:01:52 $)
@param(идентификатор описание), @return(описание), @returns(описание) и @raises(идентификатор описание)Эти теги используются в описаниях процедур и функций (в том числе —
  методов). Описывают соответственно параметры, возвращаемое значение и
  возможные исключения. “@return” и “@returns” —
  синонимы.
@member(идентификатор описание) и @value(идентификатор описание)Эти два тега позволяют описывать поля, методы и свойства классов, интерфейсов, объектов и записей, а также значения перечислений внутри описаний соответствующих типов. То есть, вместо:
type
  { Описание типа }
  MyEnum = (
    { описание Val1 }
    Val1,
    { описание Val2 }
    Val2,
    . . .
  );
  Пишем так:
type
  { Описание типа
    @value(Val1 описание Val1)
    @value(Val2 описание Val2)
    . . .
  }
  MyEnum = (
    Val1,
    Val2,
    . . .
  );
  Что более читаемо внутри самих исходников. Точно также и с тегом
  “@member”, который применим как к полям, так и к методам и
  свойствам.
Вполне естественно, что PasDoc автоматически генерирует гиперссылки между описаниями программных элементов. Степень автоматизма может быть разной — см. “--auto-link”.
Для начала рассмотрим явные ссылки:
@link(идентификатор текст)Вставляет непосредственную ссылку на описание идентификатора. Замещающий
  текст может отсутствовать, при этом ссылка будет представлять собой сам
  идентификатор, возможно — составной (типа “UnitName.Identifier”)
  — в зависимости от состояния ключа
  “--link-look”.
@seealso(идентификатор текст)Аналогично предыдущему создает ссылку на соответствующий элемент, но не
  в месте своего появления, а в отдельной секции «See also» (или «См.
  также») — аналогично, например, тегу
  “@raises”.
Если включен ключ “--auto-link”, PasDoc
будет генерировать гиперссылки везде, где ему встретится объявленный
идентификатор, что позволяет избежать явного указания
“@link”, но не всегда удобно —
идентификатор может совпадать с каким-то общеупотребимым словом, которое
встречается в тексте само по себе2. Чтобы и
автоссылками воспользоваться и лишних ссылок избежать, следует обратить внимание
на следующие теги, управляющими режимом автоматических ссылок.
@noAutoLink(текст)Данный тег запрещает использовать автоматическое определение идентификаторов в тексте параметра. Внутри тега ссылки можно указать лишь явно.
@noAutoLinkHereЗдесь «here» следует понимать как «сюда», а не «здесь». Этот тег следует
  помещать в описание того элемента, на который не должно быть
  автоматических ссылок (т.е. объекта с идентификатором типа “Add”,
  “This” и т.д.). В этом случае данный идентификатор не
  определяется при автоматическом распознавании, но на него можно по прежнему
  сослаться явным образом — тегом
  “@link”.
Отдельно хотелось бы отметить ряд контекстно-зависимых ссылок — это теги без параметров, которые в тексте заменяются значениями (и ссылками), зависящими от того элемента, в описании которого они были употреблены.
@name и @classnameЭти теги не создают гиперссылки, а всего лишь вставляют вместо себя идентификатор текущего элемента и класса (интерфейса, записи и т.д.), к которому он принадлежит.
@inherited и @inheritedClassСоотвественно вставляют идентификатор (с гиперссылкой) унаследованного
  элемента и класса-предка. В описании класса тег “@inherited”
  действует так же, как “@inheritedClass”; в описании элемента он
  вставляет полный идентификатор перекрытого элемента (вида
  “ClassName.ItemName”) с соответствующей ссылкой.
Пример:
{ @name — это метод @classname, который перекрывает @inherited,
  чтобы кое-что сделать иначе... }
 Следующие теги предназначены для форматирования и оформления описаний, генерируемых программой PasDoc.
@bold(текст) и @italic(текст)Выделяют текст полужирным шрифтом и курсивом соотвественно. Параметр этих тегов не может содержать конец абзаца — пустую строку. Теги могут быть вложенными.
@code(текст)Данный тег форматирует текст-параметр как фрагмент кода внутри строки — в
  случае выходного формата HTML это будет соответственно тег
  “”. Внутри тега нельзя использовать
  пустые строки, зато можно использовать прочие PasDoc-теги. ... 
@preformatted(текст)Сохраняет разбивку текста-параметра, а также все специальные символы внутри. В частности, внутри параметра данного тега все прочие теги PasDoc будут выведены, как обычные слова.
В параметре могут встречаться пустые строки — в результат они попадут сами по себе, а не как конец абзаца. При этом следует помнить об открывающих и закрывающих скобках — если не соблюден баланс, тег, как и любой другой, не будет закрыт или будет закрыт досрочно.
@longcode(маркер текст маркер)Данный тег помимо того, что сохраняет все переводы строк и пробелы, как и предыдущий, еще и осуществляет подстветку ключевых слов и других синтаксических конструкций языка Паскаль. Подсветка может быть настроена посредством стилевого файла (для HTML).
Маркер в начале и в конце тега нужен для совместимости с предыдущими
  версиями. Им может быть любой символ, кроме скобок, но в документации
  рекомендовано использовать символ “#”. Данный маркер никакого
  отношения к маркеру PasDoc-комментариев (см.
  “--marker”) не имеет.
Несколько особняком стоят теги, вставляющие особым образом форматированные конструкции и специальные символы.
@-PasDoc для вставки тире использует конструкции, позаимствованные из
  LaTEX: длинное тире («—» —
  “—”) — “---”; короткое тире («–» —
  “–”) — “--”; одиночный дефис
  “-” дефис («-») и обозначает. Если идущие подряд дефисы не
  следует превращать в тире, используется запись “@-”, которая
  всегда обозначает дефис, независимо от контекста.
@brТег вставляет принудительный разрыв строки.
@nil, @true и @falseВставляют форматированные “Nil”, “True” и
  “False” соответственно.
Кроме описанного простого форматирования PasDoc позволяет создавать различные списки (упорядоченные, неупорядоченные и определений), а также таблицы. Возможности их форматирования обширны и выходят за рамки обзорной статьи. Интересующиеся могут обратиться к документации на http://pasdoc.sourceforge.net/.
Нижеприведенные теги используются для специальных целей и трудно поддаются классификации.
@deprecatedПомечает элемент, в описании которого используется, как нерекомендуемый3.
@excludeИсключает элемент из генерируемой документации.
@html(html-код) и @latex(latex-код)Эти два тега позволяют вставить некий код непосредственно в HTML- или LaTEX-вывод программы. Таким образом можно использовать произвольные конструкции, например — вставлять ссылки на внешние ресурсы. См. ключ командной строки “--format”.
Собственно, нас интересуют не все директивы, а только те, которые способны
повлиять на состав документации. Это, во-первых, директивы условной компиляции,
и во-вторых, директивы включения файла ({$INCLUDE ...}).
PasDoc поддерживает директивы условной компиляции частично — на том уровне,
который был доступен еще в Turbo Pascal — {$IFDEF ...}. Условия
типа {$IFOPT ...} или {$IF ...} с выражением пока не
поддерживаются. Для управления символами условной компиляции используются ключи
командной строки “--define” и
“--conditionals”: первый позволяет
определить символы непосредственно в командной строке, а второй — использовать
файл, в котором они перечислены.
{$INCLUDE ...}PasDoc поддерживает включения файлов директивой {$INCLUDE ...},
поиск файлов производится в каталоге исходников и каталогах, указанных ключом
“--include”.
Описания программных элементов могут быть размещены не только в комментариях внутри исходников, но и во внешнем файле. Формат файла следующий:
#Item1 Описание Item1 #Item2 Описание Item2 . . . . .
Идентификаторы Item1, Item2 и т.д. должны быть в
полной форме — с указанием через точку модуля, класса и проч.
(вида “#UnitName.ClassName.MethodName”). В тексте описаний —
строках которые не начинаются с “#” — можно использовать
PasDoc-теги точно так же, как и в описаниях-комментариях.
Файл описаний подключается параметром командной строки “--description”.
Такие внешние описания можно использовать, например, для генерации документации на нескольких языках, хотя в этом отношении более удачным выбором представляется утилита FPDoc, идущая в составе дистрибутива FPC и поддерживающая синхронизацию, обновление, объединение и т.д. своих файлов описаний (но не поддерживающая получение описаний из комментариев, и существенно более сложная в использовании).
Если выходной формат — HTML или HtmlHelp, в начало и конец каждой страницы
можно добавить определенные фрагменты (с копирайтом, ссылкой на сайт и чем
угодно еще). Данные фрагменты оформляются в виде отдельных файлов и подключаются
ключами “--header” и
“--footer”. Содержимое этих файлов должно
представлять собой фрагменты непосредственно html-кода, которые будут размещены
сразу после “<body>” и сразу перед
“</body>”
соответственно4.
PasDoc позволяет добавить к документации в целом «главы» «Introduction» и «Conclusion» — «Введение» и «Заключение» соответственно. Они представляют собой текстовые файлы, которые подключаются посредством ключей “--introduction” и “--conclusion”. Синтаксис данных файлов тот же, что у блоков комментариев-описаний, за исключением нескольких дополнительных тегов, которые в обычных описаниях встречаться не должны.
@anchor(идентификатор)Устанавливает метку-«якорь», на которую можно ссылаться из других частей
  документации по идентификатору (посредством тегов
  “@link” и
  “@seealso”). Идентификатор должен
  соответствовать требованиям языка Паскаль.
@section(уровень идентификатор заголовок)Создает подраздел введения/заключения (а также подподраздел и т.д.).
  Вложенность раздела определяется числом в первом параметре тега — данный
  уровень должен быть больше или равен 1. Уровень 1 соответствует
  “” в HTML и
  “ ... 
\section{...}” в LaTEX. Второй
  параметр — идентификатор — позволяет ссылаться на данный подраздел посредством
  тега “@link”. Третий параметр —
  отображаемый заголовок.
@tableOfContents(уровень)Данный тег вставляет содержание, формируемое тегами “@section”
  в текст. Необязательный параметр — уровень — позволяет ограничить глубину
  вложенности элементов содержания. Данный тег работает только при выходном
  формате HTML.
@title(текст) и @shorttitle(текст)Первый тег устанавливает заголовок вводной или заключительной части, а второй используется при формате вывода HTML в фрейме навигации.
Для того, чтобы сослаться на введение или заключение откуда-то из текста
описаний следует использовать тег “@link” с именем файла,
содержащего введение/заключение, без расширения.
PasDoc позволяет встроить в html-результаты поиск, построенный на «Tipue Search Engine» — JavaScript-движке для локального поиска. Ищет достаточно адвекватно (в том числе — на русском), но при больших объемах могут быть и тормоза.
См. ключ “--use-tipue-search”.
GraphViz — это такая программа, которая по текстовым данным, предоставляемым, например, утилитой PasDoc, строит графическое представление некоего графа. PasDoc умеет использовать такое представление для иерархии классов и зависимостей модулей. Подробности см. в документации.
PasDoc позволяет подключить проверку орфографии посредством aspell. Подробности см. в документации.
Общий вид командной строки следующий:
pasdoc [‹опции›] [‹файлы›]
Где ‹файлы› — произвольное количество имен исходных файлов и масок (например, *.pp), а ‹опции› — комбинация из нижеперечисленных ключей.
| 
    | 
  
   --help  | 
  
    Показывает краткую справку по параметрам командной строки.  | 
 ||
   --version  | 
  
    Показывает версию PasDoc.  | 
 |||
| 
    | 
  
   --verbosity  | 
  
    | 
  
    | 
  
    Устанавливает степень подробностей выводимой в процессе информации.  | 
 
| 
    | 
  
   --define  | 
  
    | 
  
    Определяет символы условной компиляции. Символы должны располагаться за ключом через запятую без пробелов.  | 
 |
| 
    | 
  
   --description  | 
  
    | 
  
    Читает описания из файла.  | 
 |
| 
    | 
  
   --conditionals  | 
  
    | 
  
    Читает из файла символы условной компиляции. Каждый символ в файле должен располагаться в отдельной строке.  | 
 |
| 
    | 
  
   --include  | 
  
    | 
  
    Определяет пути поиска включаемых файлов.  | 
 |
| 
    | 
  
   --source  | 
  
    | 
  
    Берет имена исходных файлов из данного указанного.  | 
 |
   --html-help-contents  | 
  
    | 
  
    Указывает файл .cnt для использования в качестве содержания справки в формате HtmlHelp (.chm). Если данный параметр не указан, то .cnt-файл прекрасно генерируется автоматически.  | 
 ||
| 
   | 
 
  --footer  | 
 
   | 
  
   Указывает файл подвала (для выходного формата HTML).  | 
|
| 
   | 
 
  --header  | 
 
   | 
  
   Указывает файл шапки (для выходного формата HTML).  | 
|
| 
   | 
 
  --name  | 
 
   | 
 
   | 
 
   Указывает имя выходного файла без пути и расширения (кроме формата HTML, в котором никакого эффекта не производит).  | 
| 
   | 
 
  --title  | 
 
   | 
 
   Указывает заголовок для документации.  | 
|
| 
   | 
 
  --format  | 
 
   HtmlHelp, LaTeX, LaTeX2RTF  | 
 
   | 
 
   Выходной формат документации. Для форматов, отличных от HTML, PasDoc формирует только исходные файлы, не запуская копилятор (hhc, latex и т.д.).  | 
| 
   | 
 
  --output  | 
 
   | 
 
   Каталог, куда помещаются выходные файлы.  | 
|
| 
   | 
 
  --exclude-generator  | 
 
   Если этот ключ не указан, то PasDoc помещает в конец каждой
  генерируемой html-страницы информацию о себе:  | 
||
| 
   | 
 
  --language  | 
 
   | 
 
   | 
 
   Указывает язык и кодировку документации. Заметим, что данная кодировка
  относится как к исходным, так и к выходным файлам.  | 
  --staronly  | 
 
   Если указан данный ключ, то обрабатываются только комментарии, начинающиеся
  с “  | 
|||
  --marker  | 
 
   | 
 
   Если указан данный ключ, то обрабатываются только комментарии, начинающиеся
  с “  | 
||
  --marker-optional  | 
 
   Употребляется вместе с ключом “--marker” (или “--staronly”). В этом случае обрабатываются все комментарии, но ‹маркер› в начале комментария игнорируется и не попадает в описание (если просто не указывать ключ “--marker”, то любые символы будут считаться началом собственно текста).  | 
|||
  --numericfilenames  | 
 
   Если указан данный ключ, PasDoc генерирует цифровые имена html-файлов документации.  | 
|||
| 
   | 
 
  --visible-members  | 
 
   | 
 
   Ключ указывает список типов видимости, которые будут отражены в
  документации. Список может состоять из следующих значений (через запятые без
  пробелов): “private”, “protected”, “public”,
  “published”, “automated”, “implicit”. Последнее —
  особый тип видимости, введенный PasDoc'ом для специальных целей (см. далее
  ключ “--implicit-visibility”).
    | 
|
  --write-uses-list  | 
 
   Если указан данный ключ, в описания модулей добавляется перечень используемых.  | 
|||
  --graphviz-uses, --graphviz-classes, --link-gv-uses, --link-gv-classes  | 
 
   Данные параметры относятся к использованию программы «GraphViz». Подробности см. в документации.  | 
|||
  --abbreviations  | 
 
   | 
 
   Указывает файл аббревиатур. Файл должен содержать строки вида
    | 
||
  --aspell  | 
 
   | 
 
   Подключает проверку орфографии посредством aspell. В настоящее время работает только с выходным форматом HTML.  | 
||
  --spell-check-ignore-words  | 
 
   | 
 
   Указывает файл со словами-исключениями для aspell. Файл должен содержать по одному слову на строку.  | 
||
  --cache-dir  | 
 
   | 
 
   Каталог кэширования.  | 
||
  --link-look  | 
 
   full, stripped  | 
 
   | 
 
   Данный ключ управляет отображением составных идентификаторов:
  “default” означает, что ссылка вида
  “  | 
|
  --full-link  | 
 
   Синоним “--link-look=full”.  | 
|||
  --css  | 
 
   | 
 
   Позволяет заменить css-файл, используемый по умолчанию на любой другой. Файл копируется в каталог вывода.  | 
||
  --auto-abstract  | 
 
   Автоматически формирует краткое описание (вместо тега
  “  | 
|||
  --use-tipue-search  | 
 
   Использовать JavaScript-поиск в документации. См. выше «Поиск».  | 
|||
  --sort  | 
 
   | 
 
   Указывает категории программных элементов, которые в документации будут
  отсортированы по алфавиту. Неперечисленные войдут в документацию в порядке
  появления в коде.  | 
||
  --introduction, --conclusion  | 
 
   | 
 
   Эти ключи указывают файлы введения и заключения соответственно. См. выше «Введение» и «Заключение».  | 
||
  --latex-head  | 
 
   | 
 
   Указывает файл, который будет помещен в преамбулу документа при выходном формате LaTEX.  | 
||
  --implicit-visibility  | 
 
   published, implicit  | 
 
   | 
 
   Определяет, как будут трактоваться элементы классов, видимость которых явно
  не указана — то есть тех элементов, которые расположены непосредственно после
  ключевого слова “  | 
|
  --no-macro  | 
 
   Отключает поддержку макросов FPC.  | 
|||
  --auto-link  | 
 
   Включает режим автоматических ссылок. См. соответствующие теги.  | 
|||
Общее впечатление от программы PasDoc — более чем благоприятное. Свою основную задачу — формирование документации из комментариев в исходниках — она выполняет вполне успешно.
Пока писалась данная статья, на
«PasDoc Wiki» появилась информация
о новых тегах, которые будут доступны в следующем релизе — “@image”
и “@include”. Первый служит для вставки картинок, а второй,
соответственно, для вставки в описание текста из внешнего файла. Поскольку
в текущем релизе они еще недоступны, в материал статьи я их решил не вставлять.
В общем — следите за обновлениями на официальном сайте.
Есть некоторые недоработки в русской локализации… Напомню, что проект открытый и принять посильное участие может каждый желающий. Полагаю, поддержкой русского языка должно озаботься именно русскоязычное сообщество…
В общем и целом, для быстрого создания документации из откомментированных исходников PasDoc — оптимальный выбор. Если же потребности немного иные — многоязычность, версионность, более гибкое оформление — есть FPDoc, входящий в состав дистрибутива Free Pascal. О нем я надеюсь написать в ближайшее время.
1) Различия в синтаксисе Delphi и FPC с точки зрения PasDoc совсем незначительны и мы их рассматривать не будем.
2) Само собой, это относится к комментариям на языках, использующих латиницу.
3) В настоящее время (версия 0.10.0) данная пометка не локализована.
4) Строго говоря, фрагмент, вставляемый
параметром “--footer”, не всегда размещается непосредственно перед
“</body>” — это зависит от наличия «информации о генераторе»
— см. ключ
“--exclude-generator”.
| FPC | 3.2.2 | release | 
| Lazarus | 3.2 | release | 
| MSE | 5.10.0 | release | 
| fpGUI | 1.4.1 | release |