Text.PrettyPrint.HughesPJ
| Авторские права | (c) Университет Глазго 2001 |
|---|---|
| Лицензия | BSD-стиль (см. файл LICENSE) |
| Поддержка | David Terei <code@davidterei.com> |
| Устойчивость | стабильная |
| Переносимость | переносимая |
| Safe Haskell | Безопасная |
| Язык | Haskell98 |
Содержание
Описание
Комбинаторы Pretty Printer Джона Хьюза и Саймона Пейтона Джонса
Основано на Проектирование библиотеки Pretty-печати в Advanced Functional Programming, Johan Jeuring и Erik Meijer (ред.), LNCS 925 http://www.cs.chalmers.se/~rjmh/Papers/pretty.ps
Тип документа
data Doc Исходный код
Абстрактный тип документов. Doc представляет *множество* макетов. Doc без вхождений Union или NoDoc представляет только один макет.
data Детали текста Исходный код
Тип данных TextDetails
TextDetails представляет фрагмент текста, который будет выведен в какой-то момент.
Конструкторы
| Символ !Символ | Фрагмент одного символа |
| Строка Строка | Целый фрагмент строки |
| PStr Строка | Использовался для представления фрагмента Fast String, но сейчас устарел и идентичен конструктору Str. |
Примеры реализации
Создание документов
Преобразование значений в документы
Документ высоты и ширины 1, содержащий литерный символ.
Документ высоты 1, содержащий литерную строку. text удовлетворяет следующим законам:
Побочное условие последнего закона необходимо, потому что text "" имеет высоту 1, а empty не имеет высоты.
То же, что и text. Раньше использовался для байтовых строк.
sizedText :: Int -> String -> Doc Source
Некоторая строка с любой шириной. (text s = sizedText (length s) s)
zeroWidthText :: String -> Doc Source
Некоторая строка, но без ширины. Используется для непечатаемого текста, такого как теги HTML или LaTeX.
Простые производные документы
Аргументы
| :: Doc | Символ ';' |
Аргументы
| :: Doc | Символ ',', запятая |
Аргументы
| :: Doc | Символ |
Аргументы
| :: Doc | Пробел |
Аргументы
| :: Doc | Символ '=' |
Аргументы
| :: Doc | Символ '(' |
Аргументы
| :: Doc | Символ ')' |
Аргументы
| :: Doc | Символ '[' |
Аргументы
| :: Doc | Символ ']' |
Аргументы
| :: Doc | Символ '{' |
Аргументы
| :: Doc | Символ '}' |
Оборачивание документов в разделители
maybeParens :: Bool -> Doc -> Doc Source
Применяет parens к Doc, если булево значение истинно.
maybeBrackets :: Bool -> Doc -> Doc Source
Применяет brackets к Doc, если булево значение истинно.
maybeBraces :: Bool -> Doc -> Doc Source
Применяет braces к Doc, если булево значение истинно.
maybeQuotes :: Bool -> Doc -> Doc Source
Применяет quotes к Doc, если булево значение истинно.
maybeDoubleQuotes :: Bool -> Doc -> Doc Source
Применяет doubleQuotes к Doc, если булево значение истинно.
Комбинирование документов
Пустой документ, без высоты и ширины. empty является тождественным элементом для <>, <+>, $$ и $+$, и где угодно в списке аргументов для sep, hcat, hsep, vcat, fcat и т.д.
(<>) :: Doc -> Doc -> Doc infixl 6 Source
Рядом. <> является ассоциативным, с тождественным элементом empty
(<+>) :: Doc -> Doc -> Doc infixl 6 Source
Рядом, разделенные пробелом, если один из аргументов не empty. <+> является ассоциативным, с тождественным элементом empty
Список версия <>
Список версия <+>.
($$) :: Doc -> Doc -> Doc infixl 5 Source
Вышесказанное, за исключением того, что если последняя строка первого аргумента заканчивается хотя бы на одну позицию раньше, чем начинается первая строка второго, эти две строки перекрываются. Например:
text "hi" $$ nest 5 (text "there")
выводится как
hi there
а не как
hi
there
$$ ассоциативна, с тождественным элементом empty, и также удовлетворяет
($+$) :: Doc -> Doc -> Doc infixl 5 Source
Вышесказанное, без перекрытия. $+$ ассоциативна, с тождественным элементом empty.
Список версия $$.
"Абзац заполнения" версия sep.
"Абзац заполнения" версия cat.
nest :: Int -> Doc -> Doc Source
Вложить (или отступать) документ на заданное количество позиций (которые также могут быть отрицательными). nest удовлетворяет законам:
nest0 x = xnestk (nestk' x) =nest(k+k') xnestk (x<>y) =nestk z<>nestk ynestk (x$$y) =nestk x$$nestk ynestkempty=empty-
x <> nest k y = x <> y, еслиxне пусто
Дополнительное условие для последнего закона необходимо, потому что empty является левым тождественным элементом для <>.
hang :: Doc -> Int -> Doc -> Doc Source
hang d1 n d2 = sep [d1, nest n d2]
punctuate :: Doc -> [Doc] -> [Doc] Source
punctuate p [d1, ... dn] = [d1 <> p, d2 <> p, ... dn-1 <> p, dn]
Предикаты для документов
Возвращает True, если документ пуст
Функции для работы с документами
first :: Doc -> Doc -> Doc Источник
first возвращает свой первый аргумент, если он не пуст, в противном случае — второй.
reduceDoc :: Doc -> RDoc Источник
Выполняет некоторое упрощение созданного GDoc.
Вывод документов
Вывод по умолчанию
render :: Doc -> String Источник
Выводит Doc в строку, используя параметры по умолчанию Style.
Вывод с определенным стилем
Стиль вывода.
Конструкторы
| Style | |
Поля
| |
Стиль по умолчанию (mode=PageMode, lineLength=100, ribbonsPerLine=1.5).
renderStyle :: Style -> Doc -> String Источник
Выводит Doc в строку, используя заданный Style.
Режим вывода.
Конструкторы
| PageMode | Обычный |
| ZigZagMode | Со зигзагообразными вырезами |
| LeftMode | Без отступов, бесконечно длинные строки |
| OneLineMode | Все в одной строке |
Общие параметры рендеринга
Аргументы
| :: Режим | Режим рендеринга |
| -> Целое | Длина строки |
| -> Вещественное число | Ленты на строку |
| -> (Детали текста -> a -> a) | Что делать с текстом |
| -> a | Что делать в конце |
| -> Документ | Документ |
| -> a | Результат |
Интерфейс общего рендеринга.
© The University of Glasgow and others
Licensed under a BSD-style license (see top of the page).
https://downloads.haskell.org/~ghc/7.10.3/docs/html/libraries/pretty-1.1.2.0/Text-PrettyPrint-HughesPJ.html