packages/docutils/rstgen
Исходный кодИзменитьЭтот модуль реализует генератор HTML/LaTeX из reStructuredText (см. http://docutils.sourceforge.net/rst.html для информации об этом синтаксисе разметки) и используется инструментами документирования компилятора (инструментами docgen).
Вы можете сгенерировать HTML-вывод с помощью удобной процедуры rstToHtml, которая, получив на вход строку с разметкой rst, возвращает строку с сгенерированным HTML. Конечный вывод предполагается встраивать в ваш собственный документ, поэтому он не будет содержать стандартных <header> или <body> частей.
Вы также можете создать RstGenerator структуру и заполнить её другими методами нижнего уровня, чтобы в конечном итоге собрать полные документы. Это требует многих опций и настроек, но вы не ограничены фрагментами и можете также генерировать документы LaTeX.
Файлы конфигурации Docutils не поддерживаются. Вместо этого генерацию HTML можно настроить, отредактировав файл config/nimdoc.cfg.
Существуют стилистические различия в том, как этот модуль отображает некоторые элементы, по сравнению с оригинальным Python Docutils:
- Обратные ссылки на содержание (TOC) в заголовках разделов не генерируются. В HTML каждый раздел также является ссылкой, которая указывает на сам раздел: это сделано для того, чтобы пользователь смог скопировать ссылку в буфер обмена.
- То же самое относится к ссылкам сносок/цитат: они указывают на себя. Обратные ссылки не генерируются, так как найти все ссылки на сноску можно, просто найдя
[footnoteName].
Импорты
- strutils, os, hashes, strtabs, tables, sequtils, algorithm, parseutils, strbasics, rstast, rst, rstidx, highlite, since
Типы
EscapeMode = enum emText, emOption, emUrl
- Исходный код Изменить
IndexedDocs = Table[IndexEntry, seq[IndexEntry]]
-
Содержит последовательности индексов для типов документов.
Ключ — это фиктивный элемент IndexEntry, который будет содержать заголовок документа в поле
keywordиlinkбудет содержать имя html-файла для документа.linkTitleиlinkDescбудут пусты.Значение, индексируемое этим IndexEntry, — это последовательность с реальными элементами индекса, найденными в файле
Исходный код Изменить.idx. MetaEnum = enum metaNone, metaTitleRaw, metaTitle, metaSubtitle, metaAuthor, metaVersion
- Исходный код Изменить
OutputTarget = enum outHtml, outLatex
- какой тип документа генерировать Исходный код Изменить
RstGenerator = object of RootObj target*: OutputTarget config*: StringTableRef splitAfter*: int listingCounter*: int tocPart*: seq[PRstNode] hasToc*: bool findFile*: FindFileHandler msgHandler*: MsgHandler outDir*: string ## output directory, initialized by docgen.nim destFile*: string ## output (HTML) file, initialized by docgen.nim filenames*: RstFileTable filename*: string ## source Nim or Rst file meta*: array[MetaEnum, string] ## \ ## Stores the empty string or the last headline/overline found in the rst ## document, so it can be used as a prettier name for term index generation. ## \ ## Keeps count of same text index terms to generate different identifiers ## for hyperlinks. See renderIndexTerm proc for details. id*: int ## A counter useful for generating IDs. onTestSnippet*: proc (d: var RstGenerator; filename, cmd: string; status: int; content: string) {....gcsafe.} escMode*: EscapeMode- Исходный код Изменить
Константы
IndexExt = ".idx"
- Исходный код Изменить
Процедуры
proc defaultConfig(): StringTableRef {....raises: [], tags: [], forbids: [].}-
Возвращает конфигурацию по умолчанию для генерации встроенного HTML.
Возвращаемый
StringTableRefсодержит параметры, используемые HTML-движком для построения конечного вывода. Для получения информации о том, что представляют собой эти параметры и их назначение, обратитесь к файлуconfig/nimdoc.cfg, входящем в состав компилятора.Единственное отличие между содержимым этого файла и значениями, предоставляемыми этим процессом, — это переменная
Исходный код Редактироватьdoc.file. Переменнаяdoc.fileфайла конфигурации содержит HTML для построения автономных страниц, в то время как этот процесс возвращает только содержимое для процессов, таких какrstToHtml, для генерации минимального HTML. proc esc(target: OutputTarget; s: string; splitAfter = -1; escMode = emText): string {. ...raises: [], tags: [], forbids: [].}- Экранирует HTML. Исходный код Редактировать
proc escChar(target: OutputTarget; dest: var string; c: char; escMode: EscapeMode) {.inline, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc formatNamedVars(frmt: string; varnames: openArray[string]; varvalues: openArray[string]): string {. ...raises: [ValueError], tags: [], forbids: [].}- Исходный код Редактировать
proc initRstGenerator(g: var RstGenerator; target: OutputTarget; config: StringTableRef; filename: string; findFile: FindFileHandler = nil; msgHandler: MsgHandler = nil; filenames = default(RstFileTable); hasToc = false) {. ...raises: [ValueError], tags: [], forbids: [].}-
Инициализирует
RstGenerator.Необходимо вызвать эту функцию перед использованием
RstGeneratorс другими функциями в этом модуле. Передайте значение, отличное отnilStringTableRef, в качествеconfigс параметрами, используемыми генератором HTML-вывода. Если вы не знаете, что использовать, передайте результаты функцииdefaultConfig() <#defaultConfig>_.Параметр
filenameбудет использоваться для обработки ошибок и создания гиперссылок на файл в индексе, но вы можете передать сюда пустую строку, если анализируете поток в памяти. Еслиfilenameоканчивается на расширение.nim, заголовок документа будет автоматически установлен какModule filename. Этот заголовок по умолчанию может быть переопределён встроенным rst, но это помогает улучшить сгенерированный индекс, если заголовок не найден.Типы
RstParseOptions,FindFileHandlerиMsgHandlerопределены в модуле packages/docutils/rst.optionsвыбирает поведение rst-парсера.findFile— это функция, используемая директивой rstincludeи другими. Цель этой функции — изменять или фильтровать пути. Она получает пути, указанные в документе rst, и должна возвращать действительный путь к существующим файлам или пустую строку в противном случае. Если вы передадитеnil, будет использоваться функция по умолчанию, которая возвращает входной путь только в случае, если файл существует. Одно из применений этой функции — преобразование относительных путей, найденных в документе, в абсолютные пути, что полезно, если rst-файл и ресурсы, на которые он ссылается, не находятся в той же директории, что и текущий рабочий каталог.msgHandler— это функция для обработки сообщений об ошибках пользователя. Она будет вызвана с именем файла, строкой, столбцом и типом любой ошибки, обнаруженной во время разбора. Если вы передадитеnil, будет использоваться обработчик сообщений по умолчанию, который записывает сообщения в стандартный вывод.Пример:
import packages/docutils/rstgen var gen: RstGenerator gen.initRstGenerator(outHtml, defaultConfig(), "filename", {})Исходный код Редактировать proc mergeIndexes(dir: string): string {....raises: [OSError, IOError, ValueError], tags: [ReadDirEffect, ReadIOEffect], forbids: [].}-
Объединяет все файлы индекса в
dirи возвращает сгенерированный индекс в формате HTML.Эта функция сначала просканирует
dirв поисках файлов индекса с расширением.idx, созданных ранее командами, такими какnim doc|rst2html, которые используют переключатель--index:on. Эти файлы индекса являются результатом вызовов setIndexTerm() и writeIndexFile(), поэтому они представляют собой простые файлы с табуляцией.По соглашению эта функция разделит файлы индекса на две категории: документация и API. Индексы API будут объединены в один большой отсортированный индекс, составляющий основную часть конечного индекса. Это подходит для документации API, так как многие символы повторяются в разных модулях. С другой стороны, индексы документации представляют собой в основном таблицы содержания плюс несколько специальных маркеров. Эти документы будут отображаться в отдельном разделе, который пытается сохранить порядок и иерархию символов в файле индекса.
Для различения файлов документации и API используется соглашение: индексы, содержащие одну запись без символа HTML-хеша (#), будут считаться
documentation, так как эта запись без хеша является явным заголовком документа. Индексы без явной записи будут считатьсяgenerated APIиз исходного файла.nim.Возвращает объединённый и отсортированный индекс в единый HTML-блок, который можно в дальнейшем встраивать в шаблоны nimdoc.
Исходный код Редактировать proc nextSplitPoint(s: string; start: int): int {....raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc prettyLink(file: string): string {....raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc readIndexDir(dir: string): tuple[modules: seq[string], symbols: seq[IndexEntry], docs: IndexedDocs] {. ...raises: [OSError, IOError, ValueError], tags: [ReadDirEffect, ReadIOEffect], forbids: [].}-
Обходит
dir, читая файлы.idxи преобразуя их в элементы IndexEntry.Возвращает список найденных имён модулей, список свободных записей символов и различные индексы документации. Список модулей отсортирован. Подробности см. в документации
Исходный код РедактироватьmergeIndexes. proc renderCodeLang(result: var string; lang: SourceLanguage; code: string; target: OutputTarget) {....raises: [ValueError], tags: [], forbids: [].}- Исходный код Редактировать
proc renderIndexTerm(d: PDoc; n: PRstNode; result: var string) {. ...raises: [Exception, ValueError], tags: [RootEffect], forbids: [].}-
Отображает строку, помеченную маркерами `foobar`:idx:.
Кроме того, добавляет заключённый текст в индекс как термин. Поскольку нас интересуют различные экземпляры одного и того же термина с различными записями, используется таблица для отслеживания количества предыдущих появлений термина, чтобы задать разные идентификаторы для каждого.
Исходный код Редактировать proc renderNimCode(result: var string; code: string; target: OutputTarget) {. ...raises: [ValueError], tags: [], forbids: [].}- Исходный код Редактировать
proc renderRstToOut(d: var RstGenerator; n: PRstNode; result: var string) {. ...gcsafe, raises: [Exception, ValueError], tags: [RootEffect], forbids: [].}-
Записывает в
resultrst-астnс использованием конфигурацииd.Перед использованием этой функции необходимо инициализировать
RstGeneratorсinitRstGeneratorи проанализировать rst-файл с помощьюrstParseиз модуля packages/docutils/rst. Пример:# ...configure gen and rst vars... var generatedHtml = "" renderRstToOut(gen, rst, generatedHtml) echo generatedHtml
Исходный код Редактировать proc renderTocEntries(d: var RstGenerator; j: var int; lvl: int; result: var string) {....raises: [Exception, ValueError], tags: [RootEffect], forbids: [].}- Исходный код Редактировать
proc rstToHtml(s: string; options: RstParseOptions; config: StringTableRef; msgHandler: MsgHandler = rst.defaultMsgHandler): string {....gcsafe, raises: [Exception, ValueError, KeyError], tags: [RootEffect, ReadIOEffect, ReadEnvEffect], forbids: [].}-
Преобразует входную строку rst в встраиваемый HTML.
Эта вспомогательная процедура анализирует любую входную строку с использованием разметки rst (она не обязана быть полным документом!) и возвращает встраиваемый фрагмент HTML. Процедура предназначена для использования в онлайн-средах без доступа к значимому файловой системе, и поэтому директивы rst
includeработать не будут. Объяснение параметраconfigсм. в процедуреinitRstGenerator. Пример:import packages/docutils/rstgen, strtabs echo rstToHtml("*Hello* **world**!", {}, newStringTable(modeStyleInsensitive)) # --> <em>Hello</em> <strong>world</strong>!Если вам нужно разрешить директиву rst
Исходный код Редактироватьincludeили изменить сгенерированный вывод, вы должны создать собственныйRstGeneratorсinitRstGeneratorи связанными процедурами. proc rstToLatex(rstSource: string; options: RstParseOptions): string {.inline, ...raises: [Exception, ValueError, KeyError], tags: [RootEffect, ReadIOEffect, ReadEnvEffect], forbids: [].}- Удобная процедура для
renderRstToOutиinitRstGenerator.Пример:
doAssert rstToLatex("*Hello* **world**", {}) == """\emph{Hello} \textbf{world}"""Исходный код Редактировать proc setIndexTerm(d: var RstGenerator; k: IndexEntryKind; htmlFile, id, term: string; linkTitle, linkDesc = ""; line = 0) {. ...raises: [], tags: [], forbids: [].}-
Добавляет
termв индекс с использованием указанного идентификатора гиперссылки.В индекс будет добавлена новая запись в формате
term<tab>file#id. Часть файла будет взята из параметраhtmlFile.Параметр
idбудет дополнен символом решетки (#) только если его длина не равна нулю, в противном случае особый якорь не будет сгенерирован. В общем случае вы должны передавать пустое значениеidтолько для заголовка автономных документов rst (они являются специальными для процедуры mergeIndexes(), см. Формат файла индекса (idx) для получения дополнительной информации). В отличие от других записей индекса, записи заголовка вставляются в начало накопленного буфера для сохранения логического порядка записей.Если
linkTitleилиlinkDescне пустые строки, будут добавлены две дополнительные колонки со своим содержимым.Индекс не будет записан на диск, пока не будет вызвано writeIndexFile(). Назначение индекса описано в руководстве по инструментам docgen.
Исходный код Редактировать proc traverseForIndex(d: PDoc; n: PRstNode) {....raises: [Exception, ValueError], tags: [RootEffect], forbids: [].}- Версия renderRstToOut, которая заполняет только записи для
.idxфайлов. Исходный код Редактировать proc writeIndexFile(g: var RstGenerator; outfile: string) {....raises: [IOError], tags: [WriteIOEffect], forbids: [].}-
Записывает текущий буфер индекса в указанный выходной файл.
Ранее необходимо добавить записи в индекс с помощью процедуры setIndexTerm(). Если индекс пустой, файл не будет создан.
Исходный код Редактировать
© 2006–2024 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/rstgen.html