# hslua-module-doclayout [![GitHub CI][CI badge]](https://github.com/hslua/hslua-module-doclayout/actions) [![Hackage][Hackage badge]](https://hackage.haskell.org/package/hslua-module-doclayout) [![Stackage Lts][Stackage Lts badge]](http://stackage.org/lts/package/hslua-module-doclayout) [![Stackage Nightly][Stackage Nightly badge]](http://stackage.org/nightly/package/hslua-module-doclayout) [![MIT license][License badge]](LICENSE) Lua module wrapping the [doclayout] Haskell package. [doclayout]: https://hackage.haskell.org/package/doclayout [CI badge]: https://github.com/hslua/hslua-module-doclayout/workflows/CI/badge.svg [Hackage badge]: https://img.shields.io/hackage/v/hslua-module-doclayout.svg?logo=haskell [Stackage Lts badge]: http://stackage.org/package/hslua-module-doclayout/badge/lts [Stackage Nightly badge]: http://stackage.org/package/hslua-module-doclayout/badge/nightly [License badge]: https://img.shields.io/badge/license-MIT-blue.svg Example ------- ``` haskell loadProg :: Lua Status loadProg = do openlibs preloadModule "doclayout" dostring $ unlines [ "doc = require 'doclayout'" , "local example_doc = (doc.literal 'Line' + 'One')" , " // (doc.literal 'Line' + 'Two')" , "-- prints:" , "-- Line One" , "--" , "-- Line Two" , "print(doc.render(example_doc))" , "" , "-- prints:" , "-- Line" , "-- One" , "--" , "-- Line" , "-- Two" , "local columns = 5" , "print(doc.render(example_doc, columns))" ] ``` Documentation ------------- ### Functions #### render `render (doc[, colwidth])` Render the `Doc` using the given column width. Parameters: `doc` : Doc to render `colwidth` : Maximum number of characters per line ### Doc construction All functions return a fresh `Doc` element. #### after_break `after_break` Creates a `Doc` which is conditionally included only if it comes at the beginning of a line. #### before_non_blank `before_non_blank (doc)` Conditionally includes the given `Doc` unless it is followed by a blank space. #### blankline `blankline` Inserts a blank line unless one exists already. #### blanklines `blanklines (n)` Insert blank lines unless they exist already. Parameters: `n` : Number of blank lines to insert. #### braces `braces (doc)` Puts a `Doc` in curly braces. #### brackets `brackets (doc)` Puts a `Doc` in square brackets. #### cblock `cblock (width, doc)` Like `lblock` but aligned centered. Parameters: `width` : Width of the created block, in characters `doc` : Contents of the block ([Doc]) #### chomp `chomp (doc)` Chomps trailing blank space off of a `Doc`. #### concat `concat (docs[, sep])` Concatenate the given `Doc`s, interspersing `sep` if specified. Parameters: `docs` : List of `Doc`s `sep` : Separator `Doc` #### cr A carriage return. Does nothing if we're at the beginning of a line; otherwise inserts a newline. #### double_quotes `double_quotes (doc)` Wraps a `Doc` in double quotes #### empty The empty document. #### flush `flush (doc)` Makes a `Doc` flush against the left margin. #### hang `hang (indent, start, doc)` Creates a hanging indent. Parameters: `indent` : Indentation width in characters `start` : Start, printed unindented `doc` : Doc which is indented by `indent` spaces on every line. #### inside `inside (start, end, contents)` Encloses a `Doc` inside a start and end `Doc`. Parameters: `start` : Doc before contents `end` : Doc after contents `contents` : Contents Doc #### lblock `lblock (width, doc)` Creates a block with the given width and content, aligned to the left. Parameters: `width` : Width of the created block, in characters `doc` : Contents of the block ([Doc]) #### literal `literal (string)` Creates a `Doc` from a string. #### nest `nest (indent)` Indents a `Doc` by the specified number of spaces. Parameters: `indent` : Indentation width. #### nestle `nestle (doc)` Removes leading blank lines from a `Doc`. #### nowrap `nowrap (doc)` Makes a `Doc` non-reflowable. #### parens `parens (doc)` Puts a `Doc` in parentheses. #### prefixed `prefixed (prefix, doc)` Uses the specified string as a prefix for every line of the inside document (except the first, if not at the beginning of the line). Parameters: `prefix` : Prefix to prepend to each line `doc` : Inside Doc. #### quotes `quotes (doc)` Wraps a `Doc` in single quotes. #### rblock `rblock (indent, doc)` Like `lblock` but aligned to the right. Parameters: `width` : Width of the created block, in characters `doc` : Contents of the block ([Doc]) #### space A breaking (reflowable) space. #### vfill `vfill` Creates an expandable border that, when placed next to a box, expands to the height of the box. Parameters: `text` : Border text ### Operators #### `..` Concatenate two `Doc` elements. #### `+` Concatenate two `Doc`s, inserting a reflowable space between them. #### `/` If `a` and `b` are `Doc` elements, then `a / b` puts `a` above `b`. #### `//` If `a` and `b` are `Doc` elements, then `a // b` puts `a` above `b`, inserting a blank line between them. ### Document Querying #### is_empty `is_empty (doc)` Returns `true` iff `doc` is the empty document, `false` otherwise. #### min_offset `min_offset (doc)` Returns the minimal width of a @'Doc'@ when reflowed at breakable spaces. #### update_column `update_column (doc, i)` Returns the column that would be occupied by the last laid out character. #### height `height (doc)` Returns the height of a block or other Doc. #### real_length `real_length (str)` Returns the real length of a string in a monospace font: 0 for a combining character, 1, for a regular character, 2 for an East Asian wide character. #### offset `offset (doc)` Returns the width of a `Doc` (as number of characters). License ------- This package is made available under the MIT license. See [`LICENSE`](LICENSE) for details.