ChartDirector 7.0 (Python Edition)

ChartDirector Mark Up Language


ChartDirector Mark Up Language (CDML) is a language for including formatting information in text by marking up the text with tags. It allows using different fonts and colors for different parts of the text, embedding images and symbols in the text, and customizing the text layout.

Font Styles

You can change the style of the text by using CDML tags. For example, the line:

<*font=Times New Roman Italic,size=16,color=FF0000*>Hello <*font=Arial,size=12,color=008000*>world!

will result in the following text rendered:


In general, all tags in CDML are enclosed by <* and *>. If you want to include <* in text without being interpreted as CDML tags, use <<* as the escape sequence.

The following table describes the supported font style attributes in CDML. Multiple font style attributes can be put in the same tag, separated by commas, or you may put each attribute in its own tag.

See Font Specification for details on various font attributes.

AttributeDescription
fontStarts a new style section, and sets the font name. You may use this attribute without a value (that is, use "font" instead of "font=arial.ttf") to create a new style section without modifying the font name. To terminate a style section, use "/font". This restores the style to the state before the style section.
sizeThe font size.
widthThe font width. This attribute is used to set the font width and height to different values. If the width and height are the same, use the size attribute.
heightThe font height. This attribute is used to set the font width and height to different values. If the width and height are the same, use the size attribute.
colorThe text color in hex format.
bgColorThe background color of the text in hex format.
underlineThe line width of the line used to underline the following characters. Set to 0 to disable underline.
subSet the following text to be in subscript style. This attribute does not need to have a value. (You may use "sub" as the attribute instead of "sub=1".)
superSet the following text to be in superscript style.

Set the following text to be in superscript style. This attribute does not need to have a value. (You may use "super" as the attribute instead of "super=1".)
xoffsetDraw the following the text by shifting the text horizontally from the original position by the specified offset in pixels.
yoffsetDraw the following the text by shifting the text vertically from the original position by the specified offset in pixels.
advanceMove the cursor forward (to the right) by the number of pixels as specified by the value this attribute.
advanceToMove the cursor forward (to the right) to the position as specified by the value this attribute. The position is specified as the number of pixels to the right of the left border of the block. If the cursor has already passed through the specified position, the cursor is not moved.

Note that unlike HTML tags, no double or single quotes are used in the tags. It is because CDML tags are often embedded as string literals in source code. The double or single quotes, if used, will conflict with the string literal quotes in the source code. Therefore in CDML, no quotes are necessary and they must not be used.

Also, unlike HTML tags, CDML uses the comma character as the delimiter between attributes. It is because certain attributes may contain embed spaces (such as the font file name). So space is not used as the delimiter and the comma character is used instead.

Blocks and Lines

In CDML, a text string may contain multiple blocks. A block may contain multiple lines of text by separating them with new line characters ("\n") or with <*br*>. The latter is useful for programming languages that cannot represent new line characters easily.

For example, the line:

<*size=15*><*block*><*color=FF*>BLOCK<*br*>ONE<*/*> and <*block*><*color=FF00*>BLOCK<*br*>TWO<*/*>

will result in the following:


The above example contains a line of text. The line contains two blocks with the characters " and " in between. Each block in turn contains two lines. The blocks are defined using <*block*> as the start tag and <*/*> as the end tag.

When a block ends, font styles will be restored to the state before entering the block.

Embedding Images and Symbols

CDML supports embedding images in text using the following syntax:

<*img=my_image_file.png*>

where my_image_file.png is the path name of the image file.

For example, the line:

<*size=20*>A <*img=sun.png*> day

will result in the following:


ChartDirector will automatically detect the image file format using the file extension, which must either png, jpg, jpeg, gif, wbmp or wmp (case insensitive).

Please refer to Path Specification on how ChartDirector interprets pathnames.

The <*img*> tag may optionally contain width and height attributes to specify its pixel width and height. In this case, ChartDirector will stretch or compress the image if necessary to the required width and height.

Apart from using image files, the <*img*> also supports built-in symbols. An example is:

<*size=10*>Change: <*img=@Triangle,color=00CC00,width=7,height=10*>+50%

The above will result in the following:


To use built-in symbols, instead of a filename, a '@' character should be used, followed by the shape id. The available built-in shapes are described in Shape Specification. Note that in CDML, the shape id does not have the trailing "Shape" word. For example, the "DiamondShape" in the Shape Specification should be represented as "@Diamond" in CDML. If the shape requires a parameter, it can be enclosed in parentheses, like "@Star(4)" for a four pointed star. Custom shapes are supported by using the @PolyShape(.....), with the NewShape constant entered directly as text. For example, the following is a donut shape consisting of two concentric circles:

<*img=@PolyShape(0,500,500,500,NewShape,0,500,300,300),width=13,color=FF0000*>

The symbol width, height, fill color and edge color can be specified with the "width", "height", "color" and "edgeColor" attributes respectively.

The following table describes the supported attributes inside the <*img*> tag:

AttributeDescription
imgThe image specification, which can be the path name for an image file, or a '@' character followed by the shape id for a built-in symbol.
widthThe width of the image or symbol in pixels.
heightThe height of the image or symbol in pixels.
sizeA shortcut to set both the width and height of the image or symbol to the same value in pixels.
colorThe color of the symbol.
edgeColorThe edgeColor of the symbol.

Blocks Attributes

CDML supports nesting blocks, that is, a block can contain other sub-blocks. Attributes are supported in the <*block*> tag to control the alignment and orientation of the sub-blocks. The <*img=my_image_file.png*> is treated as a block for layout purposes.

For example, the line:

<*block,valign=absmiddle*><*img=molecule.png*> <*block*>Hydrazino\nMolecule<*/*><*/*>

will result in the following text rendered:


The the above starts <*block,valign=absmiddle*> which specifies its content should align with each others in the vertical direction using the absolute middle alignment. The block contains an image, followed by a space characters, and then another block which has two lines of text.

The following table describes the supported attributes inside the <*block*> tag:

AttributeDescription
widthThe width of the block in pixels. By default, the width is automatically determined to be the width necessary for the contents of the block. If the width attribute is specified, it will be used as the width of the block. If the width is insufficient for the contents, the contents will be wrapped into multiple lines.
heightThe height of the block in pixels. By default, the height is automatically determined to be the height necessary for the contents of the block. If the height attribute is specified, it will be used as the height of the block.
maxwidthThe maximum width of the block in pixels. If the content is wider than maximum width, it will be wrapped into multiple lines.
truncateThe maximum number of lines of the block. If the content requires more than the maximum number of lines, it will be truncated. In particular, if truncate is 1, the content will be truncated if it exceeds the maximum width (as specified by maxwidth or width) without wrapping. The last few characters at the truncation point will be replaced with "...".
linespacingThe spacing between lines as a ratio to the default line spacing. For example, a line spacing of 2 means the line spacing is two times the default line spacing. The default line spacing is the line spacing as specified in the font used.
bgColorThe background color of the block in hex format.
edgeColorThe edge color of the block in hex format.
roundedCornersThe radius of the rounded corners of the block in pixels. If one value is provided, it will be used as the radius for all 4 corners. If 4 values separated by spaces are provided, they will be the radii of the top-left, top-right, bottom-right and bottom-left corners of the block.
raisedEffectThe raised effect of the block. Please refer to Box.setBackground on how this parameter is used.
marginThe margins between the content of the block to the edges of the block. If the margin is a single number, it will be applied to the left, right, top and bottom margins. If the margin is two to four numbers separated by spaces, they will be applied to the left, right, top and bottom margins, with the default value of 0. For example, "margin=3 5" will set the left and right margins to 3 and 5 pixels, and the top and bottom margins to 0.
valignThe vertical alignment of sub-blocks. This is for blocks that contain sub-blocks. Supported values are baseline, top, bottom, middle and absmiddle.

The value baseline means the baseline of sub-blocks should align with the baseline of the block. The baseline is the underline position of text. This is normal method of aligning text, and is the default in CDML. For images or blocks that are rotated, the baseline is the same as the bottom.

The value top means the top line of sub-blocks should align with the top line of the block.

The value bottom means the bottom line of sub-blocks should align with the bottom line of the block.

The value middle means the middle line of sub-blocks should align with the the middle line of the block. The middle line is the middle position between the top line and the baseline.

The value absmiddle means the absolute middle line of sub-blocks should align with the absolute middle line of the block. The absolute middle line is the middle position between the top line and the bottom line.
halignThe horizontal alignment of lines. This is for blocks that contain multiple lines. Supported values are left, center and right.

The value left means the left border of each line should align with the left border of the block. This is the default.

The value center means the horizontal center of each line should align with the horizontal center of the block.

The value right means the right border of each line should align with the right border of the block.
angleRotate the content of the block by an angle. The angle is specified in degrees in counter-clockwise direction.