Copyright | (c) Trevor Elliott <revor@galois.com> 2015 |
---|---|
License | BSD-style (see the file LICENSE) |
Maintainer | David Terei <code@davidterei.com> |
Stability | stable |
Portability | portable |
Safe Haskell | Safe |
Language | Haskell98 |
This module provides a version of pretty that allows for annotations to be attached to documents. Annotations are arbitrary pieces of metadata that can be attached to sub-documents.
This module should be used as opposed to the HughesPJ
module. Both are equivalent though as this module simply re-exports the other.
The abstract type of documents. A Doc represents a set of layouts. A Doc with no occurrences of Union or NoDoc represents just one layout.
A document of height and width 1, containing a literal character.
text :: String -> Doc a Source
A document of height 1 containing a literal string. text
satisfies the following laws:
The side condition on the last law is necessary because text ""
has height 1, while empty
has no height.
ptext :: String -> Doc a Source
Same as text
. Used to be used for Bytestrings.
sizedText :: Int -> String -> Doc a Source
Some text with any width. (text s = sizedText (length s) s
)
zeroWidthText :: String -> Doc a Source
Some text, but without any width. Use for non-printing text such as a HTML or Latex tags
:: Doc a | A ';' character |
:: Doc a | A ',' character |
:: Doc a | A |
:: Doc a | A space character |
:: Doc a | A '=' character |
:: Doc a | A '(' character |
:: Doc a | A ')' character |
:: Doc a | A '[' character |
:: Doc a | A ']' character |
:: Doc a | A '{' character |
:: Doc a | A '}' character |
The empty document, with no height and no width. empty
is the identity for <>
, <+>
, $$
and $+$
, and anywhere in the argument list for sep
, hcat
, hsep
, vcat
, fcat
etc.
(<>) :: Doc a -> Doc a -> Doc a infixl 6 Source
Beside. <>
is associative, with identity empty
.
(<+>) :: Doc a -> Doc a -> Doc a infixl 6 Source
Beside, separated by space, unless one of the arguments is empty
. <+>
is associative, with identity empty
.
hcat :: [Doc a] -> Doc a Source
List version of <>
.
hsep :: [Doc a] -> Doc a Source
List version of <+>
.
($$) :: Doc a -> Doc a -> Doc a infixl 5 Source
Above, except that if the last line of the first argument stops at least one position before the first line of the second begins, these two lines are overlapped. For example:
text "hi" $$ nest 5 (text "there")
lays out as
hi there
rather than
hi there
$$
is associative, with identity empty
, and also satisfies
($+$) :: Doc a -> Doc a -> Doc a infixl 5 Source
Above, with no overlapping. $+$
is associative, with identity empty
.
vcat :: [Doc a] -> Doc a Source
List version of $$
.
sep :: [Doc a] -> Doc a Source
cat :: [Doc a] -> Doc a Source
fsep :: [Doc a] -> Doc a Source
"Paragraph fill" version of sep
.
fcat :: [Doc a] -> Doc a Source
"Paragraph fill" version of cat
.
nest :: Int -> Doc a -> Doc a Source
Nest (or indent) a document by a given number of positions (which may also be negative). nest
satisfies the laws:
nest 0 x = x
nest k (nest k' x) = nest (k+k') x
nest k (x <> y) = nest k z <> nest k y
nest k (x $$ y) = nest k x $$ nest k y
nest k empty = empty
x <> nest k y = x <> y
, if x
non-emptyThe side condition on the last law is needed because empty
is a left identity for <>
.
hang :: Doc a -> Int -> Doc a -> Doc a Source
hang d1 n d2 = sep [d1, nest n d2]
punctuate :: Doc a -> [Doc a] -> [Doc a] Source
punctuate p [d1, ... dn] = [d1 <> p, d2 <> p, ... dn-1 <> p, dn]
annotate :: a -> Doc a -> Doc a Source
Attach an annotation to a document.
isEmpty :: Doc a -> Bool Source
Returns True
if the document is empty
render :: Doc a -> String Source
Render the Doc
to a String using the default Style
(see style
).
renderSpans :: Doc ann -> (String, [Span ann]) Source
Render an annotated Doc
to a String and list of annotations (see Span
) using the default Style
(see style
).
A Span
represents the result of an annotation after a Doc
has been rendered, capturing where the annotation now starts and ends in the rendered output.
Span | |
Fields
|
A rendering style. Allows us to specify constraints to choose among the many different rendering options.
Style | |
Fields
|
Eq Style | |
Show Style | |
Generic Style | |
type Rep Style | |
Defined in Text.PrettyPrint.Annotated.HughesPJ type Rep Style = D1 (MetaData "Style" "Text.PrettyPrint.Annotated.HughesPJ" "pretty-1.1.3.6" False) (C1 (MetaCons "Style" PrefixI True) (S1 (MetaSel (Just "mode") NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 Mode) :*: (S1 (MetaSel (Just "lineLength") NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 Int) :*: S1 (MetaSel (Just "ribbonsPerLine") NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 Float)))) |
The default style (mode=PageMode, lineLength=100, ribbonsPerLine=1.5
).
renderStyle :: Style -> Doc a -> String Source
Render the Doc
to a String using the given Style
.
:: Mode | Rendering mode. |
-> Int | Line length. |
-> Float | Ribbons per line. |
-> (TextDetails -> a -> a) | What to do with text. |
-> a | What to do at the end. |
-> Doc b | The document. |
-> a | Result. |
The general rendering interface. Please refer to the Style
and Mode
types for a description of rendering mode, line length and ribbons.
:: Mode | Rendering mode. |
-> Int | Line length. |
-> Float | Ribbons per line. |
-> (AnnotDetails b -> a -> a) | What to do with text. |
-> a | What to do at the end. |
-> Doc b | The document. |
-> a | Result. |
The general rendering interface, supporting annotations. Please refer to the Style
and Mode
types for a description of rendering mode, line length and ribbons.
Rendering mode.
PageMode | Normal rendering ( |
ZigZagMode | With zig-zag cuts. |
LeftMode | No indentation, infinitely long lines ( |
OneLineMode | All on one line, |
Eq Mode | |
Show Mode | |
Generic Mode | |
type Rep Mode | |
Defined in Text.PrettyPrint.Annotated.HughesPJ type Rep Mode = D1 (MetaData "Mode" "Text.PrettyPrint.Annotated.HughesPJ" "pretty-1.1.3.6" False) ((C1 (MetaCons "PageMode" PrefixI False) (U1 :: Type -> Type) :+: C1 (MetaCons "ZigZagMode" PrefixI False) (U1 :: Type -> Type)) :+: (C1 (MetaCons "LeftMode" PrefixI False) (U1 :: Type -> Type) :+: C1 (MetaCons "OneLineMode" PrefixI False) (U1 :: Type -> Type))) |
data TextDetails Source
A TextDetails represents a fragment of text that will be output at some point in a Doc
.
Chr !Char | A single Char fragment |
Str String | A whole String fragment |
PStr String | Used to represent a Fast String fragment but now deprecated and identical to the Str constructor. |
© The University of Glasgow and others
Licensed under a BSD-style license (see top of the page).
https://downloads.haskell.org/~ghc/8.6.1/docs/html/libraries/pretty-1.1.3.6/Text-PrettyPrint-Annotated.html