| Copyright | (c) 2006-2016, alpheccar.org |
|---|---|
| License | BSD-style |
| Maintainer | misc@NOSPAMalpheccar.org |
| Stability | experimental |
| Portability | portable |
| Safe Haskell | None |
| Language | Haskell2010 |
Graphics.PDF.Typesetting
Contents
Description
Experimental typesetting. It is a work in progress
- class Box a where
- class DisplayableBox a where
- data Letter s
- type BoxDimension = (PDFFloat, PDFFloat, PDFFloat)
- class ComparableStyle a => Style a where
- data TextStyle = TextStyle {
- textFont :: !PDFFont
- textStrokeColor :: !Color
- textFillColor :: !Color
- textMode :: !TextMode
- penWidth :: !PDFFloat
- scaleSpace :: !PDFFloat
- scaleDilatation :: !PDFFloat
- scaleCompression :: !PDFFloat
- data StyleFunction
- class (ComparableStyle a, Style s) => ParagraphStyle a s | a -> s where
- class (Style s, Monad m) => MonadStyle s m | m -> s where
- class ComparableStyle a where
- data Para s a
- data TM ps s a
- data VBox ps s
- data VerState s = VerState {
- baselineskip :: !(PDFFloat, PDFFloat, PDFFloat)
- lineskip :: !(PDFFloat, PDFFloat, PDFFloat)
- lineskiplimit :: !PDFFloat
- currentParagraphStyle :: !s
- data Container ps s
- data Justification
- data Orientation
- displayFormattedText :: ParagraphStyle ps s => Rectangle -> ps -> s -> TM ps s a -> Draw a
- txt :: Style s => String -> Para s ()
- kern :: Style s => PDFFloat -> Para s ()
- addPenalty :: Int -> Para s ()
- mkLetter :: (Show a, Box a, DisplayableBox a) => BoxDimension -> Maybe s -> a -> Letter s
- mkDrawBox :: Draw () -> DrawBox
- forceNewLine :: Style s => Para s ()
- paragraph :: Style s => Para s a -> TM ps s a
- endPara :: Style s => Para s ()
- startPara :: Style s => Para s ()
- getParaStyle :: TM ps s ps
- setParaStyle :: ParagraphStyle ps s => ps -> TM ps s ()
- mkContainer :: PDFFloat -> PDFFloat -> PDFFloat -> PDFFloat -> PDFFloat -> Container ps s
- fillContainer :: (ParagraphStyle ps s, ComparableStyle ps) => VerState ps -> Container ps s -> [VBox ps s] -> (Draw (), Container ps s, [VBox ps s])
- defaultVerState :: s -> VerState s
- getBoxes :: ParagraphStyle ps s => ps -> s -> TM ps s a -> [VBox ps s]
- containerX :: Container ps s -> PDFFloat
- containerY :: Container ps s -> PDFFloat
- containerWidth :: Container ps s -> PDFFloat
- containerHeight :: Container ps s -> PDFFloat
- containerContentHeight :: Container ps s -> PDFFloat
- containerContentRightBorder :: Container ps s -> PDFFloat
- containerContentLeftBorder :: Container ps s -> PDFFloat
- containerCurrentHeight :: Container ps s -> PDFFloat
- containerContentRectangle :: Container ps s -> Rectangle
- drawTextBox :: (ParagraphStyle ps s, Style s) => PDFFloat -> PDFFloat -> PDFFloat -> PDFFloat -> Orientation -> ps -> s -> TM ps s a -> (Rectangle, Draw ())
- setFirstPassTolerance :: PDFFloat -> TM ps s ()
- setSecondPassTolerance :: PDFFloat -> TM ps s ()
- setHyphenPenaltyValue :: Int -> TM ps s ()
- setFitnessDemerit :: PDFFloat -> TM ps s ()
- setHyphenDemerit :: PDFFloat -> TM ps s ()
- setLinePenalty :: PDFFloat -> TM ps s ()
- getFirstPassTolerance :: TM ps s PDFFloat
- getSecondPassTolerance :: TM ps s PDFFloat
- getHyphenPenaltyValue :: TM ps s Int
- getFitnessDemerit :: TM ps s PDFFloat
- getHyphenDemerit :: TM ps s PDFFloat
- getLinePenalty :: TM ps s PDFFloat
- setJustification :: Justification -> TM ps s ()
- setBaseLineSkip :: PDFFloat -> PDFFloat -> PDFFloat -> TM ps s ()
- setLineSkipLimit :: PDFFloat -> TM ps s ()
- setLineSkip :: PDFFloat -> PDFFloat -> PDFFloat -> TM ps s ()
- getBaseLineSkip :: TM ps s (PDFFloat, PDFFloat, PDFFloat)
- getLineSkipLimit :: TM ps s PDFFloat
- getLineSkip :: TM ps s (PDFFloat, PDFFloat, PDFFloat)
- data StandardStyle = Font PDFFont Color Color
- data StandardParagraphStyle = NormalParagraph
Types
Boxes
A box is an object with dimensions and used in the typesetting process
Minimal complete definition
class DisplayableBox a where Source #
A box that can be displayed
Minimal complete definition
Instances
| ParagraphStyle ps s => DisplayableBox (VBox ps s) Source # | |
A letter which can be anything. Sizes are widths and for glue the dilation and compression factors For the generic letter, height and descent are also provided
Constructors
| Letter BoxDimension !AnyBox !(Maybe s) | Any box as a letter |
| Glue !PDFFloat !PDFFloat !PDFFloat !(Maybe s) | A glue with style to know if it is part of the same sentence |
| FlaggedPenalty !PDFFloat !Int !s | Hyphen point |
| Penalty !Int | Penalty |
| AChar !s !Char !PDFFloat | A char |
| Kern !PDFFloat !(Maybe s) | A kern : non dilatable and non breakable glue |
type BoxDimension = (PDFFloat, PDFFloat, PDFFloat) Source #
Dimension of a box : width, height and descent
Styles
class ComparableStyle a => Style a where Source #
Style of text (sentences and words). Minimum definition textStyle
Minimal complete definition
Methods
sentenceStyle :: a -> Maybe (Rectangle -> Draw b -> Draw ()) Source #
Modify the look of a sentence (sequence of words using the same style on a line)
wordStyle :: a -> Maybe (Rectangle -> StyleFunction -> Draw b -> Draw ()) Source #
textStyle :: a -> TextStyle Source #
updateStyle :: a -> a Source #
A style may contain data changed from word to word
styleHeight :: a -> PDFFloat Source #
A style may change the height of words
Default implementation styleHeight = getHeight . textFont . textStyle
styleDescent :: a -> PDFFloat Source #
A style may change the descent of lines
Default implementation styleDescent = getDescent . textFont . textStyle
Instances
Text style used by PDF operators
Constructors
| TextStyle | |
Fields
| |
data StyleFunction Source #
What kind of style drawing function is required for a word when word styling is enabled
Instances
class (ComparableStyle a, Style s) => ParagraphStyle a s | a -> s where Source #
Paragraph style
Methods
lineWidth :: a -> PDFFloat -> Int -> PDFFloat Source #
Width of the line of the paragraph
linePosition :: a -> PDFFloat -> Int -> PDFFloat Source #
Horizontal shift of the line position relatively to the left egde of the paragraph bounding box
interline :: a -> Maybe (Rectangle -> Draw ()) Source #
How to style the interline glues added in a paragraph by the line breaking algorithm
paragraphChange :: a -> Int -> [Letter s] -> (a, [Letter s]) Source #
Change the content of a paragraph before the line breaking algorithm is run. It may also change the style
paragraphStyle :: a -> Maybe (Rectangle -> Draw b -> Draw ()) Source #
Get the paragraph bounding box and the paragraph draw command to apply additional effects
Instances
class (Style s, Monad m) => MonadStyle s m | m -> s where Source #
A MonadStyle where some typesetting operators can be used
Minimal complete definition
Methods
setStyle :: s -> m () Source #
Set the current text style
currentStyle :: m s Source #
Get the current text style
addBox :: (Show a, DisplayableBox a, Box a) => a -> PDFFloat -> PDFFloat -> PDFFloat -> m () Source #
Add a box using the current mode (horizontal or vertical. The current style is always applied to the added box)
glue :: PDFFloat -> PDFFloat -> PDFFloat -> m () Source #
Add a glue using the current style
unstyledGlue :: PDFFloat -> PDFFloat -> PDFFloat -> m () Source #
Add a glue with no style (it is just a translation)
Instances
| Style s => MonadStyle s (Para s) Source # | |
| Style s => MonadStyle s (TM ps s) Source # | |
class ComparableStyle a where Source #
Used to compare two style without taking into account the style state
Minimal complete definition
Methods
isSameStyleAs :: a -> a -> Bool Source #
Typesetting monads
Containers
Constructors
| VerState | |
Fields
| |
Container for vboxes (x,y,width,maxheight,height,currenty,current z, tolerance para) tolerance para means a paragraph is not started if too close from the bottom edge of the box
data Justification Source #
Constructors
| FullJustification | |
| Centered | |
| LeftJustification | |
| RightJustification |
Instances
data Orientation Source #
Instances
Functions
Text display
Arguments
| :: ParagraphStyle ps s | |
| => Rectangle | Text area |
| -> ps | default vertical style |
| -> s | Default horizontal style |
| -> TM ps s a | Typesetting monad |
| -> Draw a | Draw monad |
Display a formatted text in a given bounding rectangle with a given default paragraph style, a given default text style. No clipping is taking place. Drawing stop when the last line is crossing the bounding rectangle in vertical direction
Text construction operators
kern :: Style s => PDFFloat -> Para s () Source #
add a kern (space that can be dilated or compressed and on which no line breaking can occur)
addPenalty :: Int -> Para s () Source #
Add a penalty
Arguments
| :: (Show a, Box a, DisplayableBox a) | |
| => BoxDimension | Dimension of the box |
| -> Maybe s | Text style of the box (can use t) |
| -> a | Box |
| -> Letter s |
Make a letter from any box
Paragraph construction operators
forceNewLine :: Style s => Para s () Source #
For a newline and end the current paragraph
Functions useful to change the paragraph style
getParaStyle :: TM ps s ps Source #
Get the current paragraph style
setParaStyle :: ParagraphStyle ps s => ps -> TM ps s () Source #
Change the current paragraph style
Container
Arguments
| :: PDFFloat | x |
| -> PDFFloat | y |
| -> PDFFloat | width |
| -> PDFFloat | height |
| -> PDFFloat | Pargraph tolerance |
| -> Container ps s | New container |
Create a empty container to constraint the amount of line that can be displayed
Arguments
| :: (ParagraphStyle ps s, ComparableStyle ps) | |
| => VerState ps | Vertical style for interline glues |
| -> Container ps s | Container |
| -> [VBox ps s] | VBox to add |
| -> (Draw (), Container ps s, [VBox ps s]) | Component to draw, new container and remaining VBoxes due to overfull container |
Fill a container with lines
defaultVerState :: s -> VerState s Source #
Default vertical state
Default values baselineskip = (12,0.17,0.0) lineskip = (3.0,0.33,0.0) lineskiplimit = 2
Arguments
| :: ParagraphStyle ps s | |
| => ps | default vertical style |
| -> s | Default horizontal style |
| -> TM ps s a | Typesetting monad |
| -> [VBox ps s] | List of boxes |
Return the list of Vboxes for a text
containerX :: Container ps s -> PDFFloat Source #
Container horizontal position
containerY :: Container ps s -> PDFFloat Source #
Container vertical position
containerWidth :: Container ps s -> PDFFloat Source #
Get the width of the container
containerHeight :: Container ps s -> PDFFloat Source #
Get the height of the container
containerContentHeight :: Container ps s -> PDFFloat Source #
Get the content height of the container with glue dilatation
containerContentRightBorder :: Container ps s -> PDFFloat Source #
Get the maximum right border of the container content (maybe bigger than container width due to overfull lines)
containerContentLeftBorder :: Container ps s -> PDFFloat Source #
Get the minimum left border of the container content
containerCurrentHeight :: Container ps s -> PDFFloat Source #
Get the current height of the container without glue dilatation
containerContentRectangle :: Container ps s -> Rectangle Source #
Return the rectangle containing the text after formatting and glue dilatation
Arguments
| :: (ParagraphStyle ps s, Style s) | |
| => PDFFloat | x |
| -> PDFFloat | y |
| -> PDFFloat | width limit |
| -> PDFFloat | height limit |
| -> Orientation | |
| -> ps | default vertical style |
| -> s | Default horizontal style |
| -> TM ps s a | Typesetting monad |
| -> (Rectangle, Draw ()) |
Draw a text box with relative position. Useful for labels
Settings (similar to TeX ones)
Line breaking settings
setFirstPassTolerance :: PDFFloat -> TM ps s () Source #
setSecondPassTolerance :: PDFFloat -> TM ps s () Source #
setHyphenPenaltyValue :: Int -> TM ps s () Source #
setFitnessDemerit :: PDFFloat -> TM ps s () Source #
setHyphenDemerit :: PDFFloat -> TM ps s () Source #
setLinePenalty :: PDFFloat -> TM ps s () Source #
getFirstPassTolerance :: TM ps s PDFFloat Source #
getSecondPassTolerance :: TM ps s PDFFloat Source #
getHyphenPenaltyValue :: TM ps s Int Source #
getFitnessDemerit :: TM ps s PDFFloat Source #
getHyphenDemerit :: TM ps s PDFFloat Source #
getLinePenalty :: TM ps s PDFFloat Source #
Arguments
| :: Justification | Centered, left or fully justified |
| -> TM ps s () |
Vertical mode settings
setLineSkipLimit :: PDFFloat -> TM ps s () Source #
getLineSkipLimit :: TM ps s PDFFloat Source #
Styles
data StandardStyle Source #
Standard styles for sentences