Requires Love 0.9.1+
Version: 2.2
This library is for printing pretty texts. The basic premise is to
use tags in strings to do special effects. Additionally, the library
supports proper text wrapping and UTF8 decoding. To use the module,
copy the src folder (and rename it if you wish) to where you need it and
do require "src.tastytext"
.
An example:
lib = require 'src.tastytext'
str = [[
This is <red>red</red>
This is a <small>small<regular> text
]]
tags = {
red = {255,0,0,255}, -- r,g,b,a
['/red']= {255,255,255}, -- alpha defaults to 255
small = love.graphics.newFont(12),
regular = love.graphics.newFont(24),
}
limit = 800
text = lib.new(str,limit,tags.regular,tags)
function love.draw() text:draw() end
The following are public functions for each TastyText
object.
Return a new TastyText
object. The str
parameter accepts a string.
The string can contain <name>
tags, which can be anything enclosed
between <
>
brackets. The name of each tag references a key in the
tags
table. For example, <red>
references tags.red
. To escape the
brackets, use \
before one of the brackets like \<
or \>
.
Note that this example, <\>>
, is interpreted as a tag.
The limit
parameter accepts a number, which specifies the horizontal
text limit before wrapping.
The default_font
parameter accepts a default Font
for the text. If
one is not specified, the current font is used. The default font is
also used for aligning the baselines of other fonts with the default one.
The line_height
parameter accepts an optional number, which affects
the height and spacing of each line. By default, the line_height
is equal to
default_font:getHeight()
, which is a line spacing of 0
.
Set the "sub" text to draw from i
to j
. The default is to draw from
1
to object.length
. Negative numbers are interpreted as going
backward from the end (e.g -2
= object.length-1
). It's useful for
rendering a portion of the text.
Draws the object.
Render the text to a new canvas and return it. The size (w x h) of the canvas is equal to the limit (w) by total height (h).
The following are useful properties for each TastyText
object. All properties
are read only (i.e don't modify!) unless specified otherwise.
Wrap the line after this many horizontal pixels.
The default font to use and for aligning baselines.
The height of each line.
The number of lines of "text".
The "length" of the text object.
The index to begin drawing the text. Must be between 1 and "length".
The index to stop drawing the text. Must be between 1 and "length".
Modifiable property to change the text alignment. Valid values are "left", "center", or "right".
Modifiable property to change the subtext alignment. Valid values are "left", "center", or "right".
Table storing the length of each line. For example, the length of line
1 is .line_lengths[1]
Table storing the width of each line. For example, the width of line
1 is .line_widths[1]
Table storing the tags. Same as the table passed to the .new(...)
To use tags in strings, their names must be associated with an object
in the tags
table. A tag object can be a Font
, Image
, color table, or
custom draw table.
The custom draw table must contain a draw
callback, optional length
(0
default), optional width
(0
default), or optional properties
table for storing things. The draw
callback is passed a table containing
the tag information and the tag location draw(t,x,y)
. Using :setSub
,
it's possible to avoid calling the function by rendering a portion of
the text. The following are the fields of t
.
The callback.
The length of the tag. It must be 1 or greater if the tag has a non-zero width.
The width of the tag.
The line index of the tag.
The properties table as passed via the tags
table.
The parent TastyText
object.
Example:
tags = {
font = love.graphics.newFont('font.ttf'),
color = {255,255,255},
image = love.graphics.newImage('image.png'),
custom= {
draw = function(chunk,x,y)
print(chunk.line)
print(chunk.width)
print(chunk.length)
print(chunk.properties.test)
end,
length = 2,
width = 2,
properties= {test = true},
},
}
You can change the brackets and escape character in the source file.
For example, you may want to change them to {
and }
.
Long "words" which can overflow a line are splitted. Texts are word wrapped.
Leading and trailing spaces on each line are removed. Spaces inbetween are unmodified.