### Install RichTextKit NuGet Package Source: https://github.com/toptensoftware/richtextkit/blob/main/docsrc/install.md Installs the RichTextKit NuGet package into a .NET project. This package supports `net462` and `net5.0` frameworks. ```PowerShell Install-Package Topten.RichTextKit ``` -------------------------------- ### Define Text Styles for RichTextKit in C# Source: https://github.com/toptensoftware/richtextkit/blob/main/docsrc/textBlock.md This code illustrates how to create Style objects, which are fundamental for applying various formatting attributes to text within a TextBlock. It provides examples for defining both a basic normal style and a more complex bold-italic style, setting properties like font family, size, weight, and italicization. ```csharp // Create normal style var styleNormal = new Style() { FontFamily = "Arial", FontSize = 14 } // Create bold italic style var styleBoldItalic = new Style() { FontFamily = "Arial", FontSize = 14, FontWeight = 700, FontItalic = true, } ``` -------------------------------- ### Grapheme Cluster Boundary Test Examples Source: https://github.com/toptensoftware/richtextkit/blob/main/Topten.RichTextKit.Test/TestData/GraphemeBreakTest.txt Examples demonstrating the rules for grapheme cluster segmentation. Each line shows a sequence of Unicode code points, with '÷' indicating a grapheme cluster break and '×' indicating that characters combine within the same cluster. The comments in the original source provide character names and properties, aiding in understanding the test case. ```Unicode Grapheme Break Test ÷ 0600 × 0308 × 0300 ÷ ``` ```Unicode Grapheme Break Test ÷ 0600 × 200D ÷ ``` ```Unicode Grapheme Break Test ÷ 0600 × 0308 × 200D ÷ ``` ```Unicode Grapheme Break Test ÷ 0600 × 0378 ÷ ``` ```Unicode Grapheme Break Test ÷ 0600 × 0308 ÷ 0378 ÷ ``` ```Unicode Grapheme Break Test ÷ 0903 ÷ 0020 ÷ ``` ```Unicode Grapheme Break Test ÷ 0903 × 0308 ÷ 0020 ÷ ``` ```Unicode Grapheme Break Test ÷ 0903 ÷ 000D ÷ ``` ```Unicode Grapheme Break Test ÷ 0903 × 0308 ÷ 000D ÷ ``` ```Unicode Grapheme Break Test ÷ 0903 ÷ 000A ÷ ``` ```Unicode Grapheme Break Test ÷ 0903 × 0308 ÷ 000A ÷ ``` ```Unicode Grapheme Break Test ÷ 0903 ÷ 0001 ÷ ``` ```Unicode Grapheme Break Test ÷ 0903 × 0308 ÷ 0001 ÷ ``` ```Unicode Grapheme Break Test ÷ 0903 × 034F ÷ ``` ```Unicode Grapheme Break Test ÷ 0903 × 0308 × 034F ÷ ``` ```Unicode Grapheme Break Test ÷ 0903 ÷ 1F1E6 ÷ ``` ```Unicode Grapheme Break Test ÷ 0903 × 0308 ÷ 1F1E6 ÷ ``` ```Unicode Grapheme Break Test ÷ 0903 ÷ 0600 ÷ ``` ```Unicode Grapheme Break Test ÷ 0903 × 0308 ÷ 0600 ÷ ``` ```Unicode Grapheme Break Test ÷ 0903 × 0903 ÷ ``` ```Unicode Grapheme Break Test ÷ 0903 × 0308 × 0903 ÷ ``` ```Unicode Grapheme Break Test ÷ 0903 ÷ 1100 ÷ ``` ```Unicode Grapheme Break Test ÷ 0903 × 0308 ÷ 1100 ÷ ``` ```Unicode Grapheme Break Test ÷ 0903 ÷ 1160 ÷ ``` ```Unicode Grapheme Break Test ÷ 0903 × 0308 ÷ 1160 ÷ ``` ```Unicode Grapheme Break Test ÷ 0903 ÷ 11A8 ÷ ``` ```Unicode Grapheme Break Test ÷ 0903 × 0308 ÷ 11A8 ÷ ``` ```Unicode Grapheme Break Test ÷ 0903 ÷ AC00 ÷ ``` ```Unicode Grapheme Break Test ÷ 0903 × 0308 ÷ AC00 ÷ ``` ```Unicode Grapheme Break Test ÷ 0903 ÷ AC01 ÷ ``` ```Unicode Grapheme Break Test ÷ 0903 × 0308 ÷ AC01 ÷ ``` ```Unicode Grapheme Break Test ÷ 0903 ÷ 231A ÷ ``` ```Unicode Grapheme Break Test ÷ 0903 × 0308 ÷ 231A ÷ ``` ```Unicode Grapheme Break Test ÷ 0903 × 0300 ÷ ``` ```Unicode Grapheme Break Test ÷ 0903 × 0308 × 0300 ÷ ``` ```Unicode Grapheme Break Test ÷ 0903 × 200D ÷ ``` -------------------------------- ### Render Text with Selection Highlight in C# Source: https://github.com/toptensoftware/richtextkit/blob/main/docsrc/rendering.md This snippet demonstrates how to render text with a specific portion highlighted. It involves creating a TextPaintOptions object to define the selection's start and end code points, along with its color, and then applying these options during the paint operation. ```csharp // Highlight code points 10 through 19... var options = new TextPaintOptions() { SelectionStart = 10, SelectionEnd = 20, SelectionColor = new SKColor(0xFFFF0000), } // Paint with options textBlockOrRichString.Paint(canvas, new SKPaint(100,100), options); ``` -------------------------------- ### Render Text at Specific Position in C# Source: https://github.com/toptensoftware/richtextkit/blob/main/docsrc/rendering.md This example illustrates how to render text at a custom position on a canvas. It shows passing an SKPoint object as a second parameter to the Paint method to specify the desired coordinates, such as (100,100). ```csharp // Paint at (100,100) textBlockOrRichString.Paint(canvas, new SKPoint(100,100)); ``` -------------------------------- ### Create and Configure TextBlock in C# Source: https://github.com/toptensoftware/richtextkit/blob/main/docsrc/textBlock.md This snippet demonstrates how to instantiate the TextBlock class and configure its essential layout properties, such as MaxWidth and Alignment, which control how the text block will render its content. It also shows the necessary namespace import. ```csharp // You'll need this namespace using Topten.RichTextKit; // Create the text block var tb = new TextBlock(); // Configure layout properties tb.MaxWidth = 900; tb.Alignment = TextAlignment.Center; ``` -------------------------------- ### Create and Configure a RichString Object Source: https://github.com/toptensoftware/richtextkit/blob/main/docsrc/basics.md Demonstrates how to instantiate the `RichString` class and chain multiple methods to set text alignment, font family, margins, and add text with specific font size, weight, and italic styling. This is the primary high-level interface for building richly decorated text. ```csharp // Create a RichString var rs = new RichString() .Alignment(TextAlignment.Center) .FontFamily("Segoe UI") .MarginBottom(20) .Add("Welcome To RichTextKit", fontSize:24, fontWeight: 700, fontItalic: true) .Paragraph().Alignment(TextAlignment.Left) .FontSize(18) .Add("This is a test string"); ``` -------------------------------- ### Paint a RichString to a SkiaSharp Canvas Source: https://github.com/toptensoftware/richtextkit/blob/main/docsrc/basics.md Shows how to render the formatted content of a `RichString` object onto a `SkiaSharp` canvas. The `Paint` method requires a `SKCanvas` object and an `SKPoint` to specify the top-left corner for drawing. ```csharp // Paint it rs.Paint(skia_canvas, new SKPoint(50, 50)); ``` -------------------------------- ### Add Text to TextBlock with Styles in C# Source: https://github.com/toptensoftware/richtextkit/blob/main/docsrc/textBlock.md This snippet demonstrates the process of adding text content to an initialized TextBlock instance. It utilizes the AddText() method, showing how to apply different, previously defined Style objects to distinct segments of text within the same block. ```csharp // Add text to the text block tb.AddText("Hello World. ", styleNormal); tb.AddText("Welcome to RichTextKit", styleBoldItalic) ``` -------------------------------- ### Set RichString Layout Dimensions Source: https://github.com/toptensoftware/richtextkit/blob/main/docsrc/basics.md Illustrates how to configure the maximum width and height properties of a `RichString` object. These properties are crucial for enabling text wrapping and cropping behavior, ensuring the text fits within a defined area. ```csharp rs.MaxWidth = 640; rs.MaxHeight = 480; ``` -------------------------------- ### RichTextKit Core Classes API Reference Source: https://github.com/toptensoftware/richtextkit/blob/main/docsrc/basics.md API documentation for fundamental classes and interfaces within RichTextKit, detailing their purpose and role in text rendering and manipulation. These components represent different levels of abstraction, from high-level text construction to low-level text block and style management. ```APIDOC Class: RichString Description: Provides a convenient set of methods for constructing richly decorated text, serving as the easiest way to work with RichTextKit. ``` ```APIDOC Class: TextBlock Description: A lower-level concept describing a single block of text. Internally, RichString builds one TextBlock for each paragraph. Can contain forced line breaks (\n) as in-paragraph soft returns. ``` ```APIDOC Class: StyleRun Description: Represents a run of text within a TextBlock, each tagged with a single style. Used when dealing directly with TextBlocks. ``` ```APIDOC Interface: IStyle Description: Used to control the text direction property on style runs, processing text in the same manner as an "isolating sequence" as described in UAX #9. ``` ```APIDOC Class: FontRun Description: Derived by splitting style runs into smaller segments when text is wrapped or font fallback is required. Each FontRun represents a single run of text using the same font and style attributes. ``` ```APIDOC Class: TextLine Description: Represents a single line of text after a text block has been laid out, consisting of one or more font runs. ``` -------------------------------- ### Retrieve RichString Measured Size Source: https://github.com/toptensoftware/richtextkit/blob/main/docsrc/basics.md Demonstrates how to access the calculated dimensions of a `RichString` object after its content has been laid out. The `MeasuredWidth` and `MeasuredHeight` properties provide the actual space occupied by the rendered text. ```csharp Console.WriteLine($"Size: {rs.MeasuredWidth} x {rs.MeasuredHeight}"); ``` -------------------------------- ### APIDOC: RichString Layout Properties and Methods Source: https://github.com/toptensoftware/richtextkit/blob/main/docsrc/layout.md Documents properties and fluent methods available on the Topten.RichTextKit.RichString class for controlling its layout, including overall dimensions, line limits, default alignment, and per-paragraph margins and text direction. ```APIDOC Topten.RichTextKit.RichString: Properties: - MaxWidth - MaxHeight - MaxLines - DefaultAlignment - DefaultDirection Fluent Methods (Per-paragraph control): - MarginLeft - MarginTop - MarginRight - MarginBottom - Alignment - TextDirection ``` -------------------------------- ### APIDOC: TextBlock Layout Properties Source: https://github.com/toptensoftware/richtextkit/blob/main/docsrc/layout.md Documents properties available on the Topten.RichTextKit.TextBlock class for controlling its layout, including overall dimensions, line limits, alignment, and base direction. ```APIDOC Topten.RichTextKit.TextBlock: Properties: - MaxWidth - MaxHeight - MaxLines - Alignment - BaseDirection ``` -------------------------------- ### Unicode 6.3 Bracket Character Mappings Source: https://github.com/toptensoftware/richtextkit/blob/main/BuildUnicodeData/BidiBrackets.txt This snippet lists Unicode 6.3 character codes for various opening and closing bracket pairs. Each line specifies the opening character's hex code, the closing character's hex code, its type ('o' for open, 'c' for close), and a descriptive name. This data is essential for text parsing and bracket matching within the RichTextKit library. ```Plain Text # for Unicode 6.3. 0028; 0029; o # LEFT PARENTHESIS 0029; 0028; c # RIGHT PARENTHESIS 005B; 005D; o # LEFT SQUARE BRACKET 005D; 005B; c # RIGHT SQUARE BRACKET 007B; 007D; o # LEFT CURLY BRACKET 007D; 007B; c # RIGHT CURLY BRACKET 0F3A; 0F3B; o # TIBETAN MARK GUG RTAGS GYON 0F3B; 0F3A; c # TIBETAN MARK GUG RTAGS GYAS 0F3C; 0F3D; o # TIBETAN MARK ANG KHANG GYON 0F3D; 0F3C; c # TIBETAN MARK ANG KHANG GYAS 169B; 169C; o # OGHAM FEATHER MARK 169C; 169B; c # OGHAM REVERSED FEATHER MARK 2045; 2046; o # LEFT SQUARE BRACKET WITH QUILL 2046; 2045; c # RIGHT SQUARE BRACKET WITH QUILL 207D; 207E; o # SUPERSCRIPT LEFT PARENTHESIS 207E; 207D; c # SUPERSCRIPT RIGHT PARENTHESIS 208D; 208E; o # SUBSCRIPT LEFT PARENTHESIS 208E; 208D; c # SUBSCRIPT RIGHT PARENTHESIS 2308; 2309; o # LEFT CEILING 2309; 2308; c # RIGHT CEILING 230A; 230B; o # LEFT FLOOR 230B; 230A; c # RIGHT FLOOR 2329; 232A; o # LEFT-POINTING ANGLE BRACKET 232A; 2329; c # RIGHT-POINTING ANGLE BRACKET 2768; 2769; o # MEDIUM LEFT PARENTHESIS ORNAMENT 2769; 2768; c # MEDIUM RIGHT PARENTHESIS ORNAMENT 276A; 276B; o # MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT 276B; 276A; c # MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT 276C; 276D; o # MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT 276D; 276C; c # MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT 276E; 276F; o # HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT 276F; 276E; c # HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT 2770; 2771; o # HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT 2771; 2770; c # HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT 2772; 2773; o # LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT 2773; 2772; c # LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT 2774; 2775; o # MEDIUM LEFT CURLY BRACKET ORNAMENT 2775; 2774; c # MEDIUM RIGHT CURLY BRACKET ORNAMENT 27C5; 27C6; o # LEFT S-SHAPED BAG DELIMITER 27C6; 27C5; c # RIGHT S-SHAPED BAG DELIMITER 27E6; 27E7; o # MATHEMATICAL LEFT WHITE SQUARE BRACKET 27E7; 27E6; c # MATHEMATICAL RIGHT WHITE SQUARE BRACKET 27E8; 27E9; o # MATHEMATICAL LEFT ANGLE BRACKET 27E9; 27E8; c # MATHEMATICAL RIGHT ANGLE BRACKET 27EA; 27EB; o # MATHEMATICAL LEFT DOUBLE ANGLE BRACKET 27EB; 27EA; c # MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET 27EC; 27ED; o # MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET 27ED; 27EC; c # MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET 27EE; 27EF; o # MATHEMATICAL LEFT FLATTENED PARENTHESIS 27EF; 27EE; c # MATHEMATICAL RIGHT FLATTENED PARENTHESIS 2983; 2984; o # LEFT WHITE CURLY BRACKET 2984; 2983; c # RIGHT WHITE CURLY BRACKET 2985; 2986; o # LEFT WHITE PARENTHESIS 2986; 2985; c # RIGHT WHITE PARENTHESIS 2987; 2988; o # Z NOTATION LEFT IMAGE BRACKET 2988; 2987; c # Z NOTATION RIGHT IMAGE BRACKET 2989; 298A; o # Z NOTATION LEFT BINDING BRACKET 298A; 2989; c # Z NOTATION RIGHT BINDING BRACKET 298B; 298C; o # LEFT SQUARE BRACKET WITH UNDERBAR 298C; 298B; c # RIGHT SQUARE BRACKET WITH UNDERBAR 298D; 2990; o # LEFT SQUARE BRACKET WITH TICK IN TOP CORNER 298E; 298F; c # RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER 298F; 298E; o # LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER 2990; 298D; c # RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER 2991; 2992; o # LEFT ANGLE BRACKET WITH DOT 2992; 2991; c # RIGHT ANGLE BRACKET WITH DOT 2993; 2994; o # LEFT ARC LESS-THAN BRACKET 2994; 2993; c # RIGHT ARC GREATER-THAN BRACKET 2995; 2996; o # DOUBLE LEFT ARC GREATER-THAN BRACKET 2996; 2995; c # DOUBLE RIGHT ARC LESS-THAN BRACKET 2997; 2998; o # LEFT BLACK TORTOISE SHELL BRACKET 2998; 2997; c # RIGHT BLACK TORTOISE SHELL BRACKET 29D8; 29D9; o # LEFT WIGGLY FENCE 29D9; 29D8; c # RIGHT WIGGLY FENCE 29DA; 29DB; o # LEFT DOUBLE WIGGLY FENCE 29DB; 29DA; c # RIGHT DOUBLE WIGGLY FENCE 29FC; 29FD; o # LEFT-POINTING CURVED ANGLE BRACKET 29FD; 29FC; c # RIGHT-POINTING CURVED ANGLE BRACKET 2E22; 2E23; o # TOP LEFT HALF BRACKET 2E23; 2E22; c # TOP RIGHT HALF BRACKET 2E24; 2E25; o # BOTTOM LEFT HALF BRACKET 2E25; 2E24; c # BOTTOM RIGHT HALF BRACKET 2E26; 2E27; o # LEFT SIDEWAYS U BRACKET 2E27; 2E26; c # RIGHT SIDEWAYS U BRACKET 2E28; 2E29; o # LEFT DOUBLE PARENTHESIS 2E29; 2E28; c # RIGHT DOUBLE PARENTHESIS 3008; 3009; o # LEFT ANGLE BRACKET 3009; 3008; c # RIGHT ANGLE BRACKET 300A; 300B; o # LEFT DOUBLE ANGLE BRACKET 300B; 300A; c # RIGHT DOUBLE ANGLE BRACKET 300C; 300D; o # LEFT CORNER BRACKET 300D; 300C; c # RIGHT CORNER BRACKET 300E; 300F; o # LEFT WHITE CORNER BRACKET 300F; 300E; c # RIGHT WHITE CORNER BRACKET 3010; 3011; o # LEFT BLACK LENTICULAR BRACKET 3011; 3010; c # RIGHT BLACK LENTICULAR BRACKET 3014; 3015; o # LEFT TORTOISE SHELL BRACKET 3015; 3014; c # RIGHT TORTOISE SHELL BRACKET 3016; 3017; o # LEFT WHITE LENTICULAR BRACKET 3017; 3016; c # RIGHT WHITE LENTICULAR BRACKET 3018; 3019; o # LEFT WHITE TORTOISE SHELL BRACKET 3019; 3018; c # RIGHT WHITE TORTOISE SHELL BRACKET 301A; 301B; o # LEFT WHITE SQUARE BRACKET 301B; 301A; c # RIGHT WHITE SQUARE BRACKET FE59; FE5A; o # SMALL LEFT PARENTHESIS FE5A; FE59; c # SMALL RIGHT PARENTHESIS FE5B; FE5C; o # SMALL LEFT CURLY BRACKET ``` -------------------------------- ### TextBlock Class Measurement Properties API Source: https://github.com/toptensoftware/richtextkit/blob/main/docsrc/measuring.md Documents the properties of the TextBlock class that provide various measurements of its contained text, including measured width, height, length, padding, and overhang. It also references deeper inspection capabilities through its Lines and FontRuns collections. ```APIDOC TextBlock Class Properties: MeasuredWidth: The measured width of the TextBlock's text. MeasuredHeight: The measured height of the TextBlock's text. MeasuredLength: The measured length of the TextBlock's text. MeasuredPadding: The measured padding of the TextBlock. MeasuredOverhang: The measured overhang of the TextBlock. Further Inspection: Lines: Collection of TextBlockLine objects for detailed layout information. FontRuns: Collection of FontRun objects (within each line) for detailed font information. ``` -------------------------------- ### Perform Hit Testing on TextBlock in C# Source: https://github.com/toptensoftware/richtextkit/blob/main/docsrc/hittesting.md Demonstrates how to use the HitTest method on a TextBlock object to find the character cluster at a specific mouse coordinate. The x and y coordinates must be relative to the top-left corner of the object. The method returns a HitTestResult structure, describing the line and code point cluster the point is over or closest to. This functionality is also available on RichString. ```csharp // Hit test a mouse co-ordinate for example var htr = tb.HitTest(x, y); ``` -------------------------------- ### RichString Class Measurement Properties API Source: https://github.com/toptensoftware/richtextkit/blob/main/docsrc/measuring.md Documents the properties of the RichString class that provide various measurements of its contained text, such as measured width, height, length, and line count. ```APIDOC RichString Class Properties: MeasuredWidth: The measured width of the RichString's text. MeasuredHeight: The measured height of the RichString's text. MeasuredLength: The measured length of the RichString's text. LineCount: The number of lines in the RichString. ``` -------------------------------- ### Grapheme Cluster Break Test Cases Source: https://github.com/toptensoftware/richtextkit/blob/main/Topten.RichTextKit.Test/TestData/GraphemeBreakTest.txt A collection of individual test cases, each line representing a specific sequence of Unicode code points. The format `÷ U+XXXX [rule] ... × U+YYYY [rule] ÷` indicates break opportunities (÷) and non-break points (×) between characters. The hexadecimal values are Unicode code points, and the text in parentheses describes their Unicode properties (e.g., ExtPict, Extend_ExtCccZwj). The bracketed numbers represent Grapheme_Cluster_Break property values or rule application, crucial for correct text rendering. ```Unicode Grapheme Cluster Test Data ÷ 231A × 0308 ÷ AC01 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] ``` ```Unicode Grapheme Cluster Test Data ÷ 231A ÷ 231A ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] ``` ```Unicode Grapheme Cluster Test Data ÷ 231A × 0308 ÷ 231A ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] ``` ```Unicode Grapheme Cluster Test Data ÷ 231A × 0300 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] ``` ```Unicode Grapheme Cluster Test Data ÷ 231A × 0308 × 0300 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [0.3] ``` ```Unicode Grapheme Cluster Test Data ÷ 231A × 200D ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] ``` ```Unicode Grapheme Cluster Test Data ÷ 231A × 0308 × 200D ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] ZERO WIDTH JOINER (ZWJ_ExtCccZwj) ÷ [0.3] ``` ```Unicode Grapheme Cluster Test Data ÷ 231A ÷ 0378 ÷ # ÷ [0.2] WATCH (ExtPict) ÷ [999.0] (Other) ÷ [0.3] ``` ```Unicode Grapheme Cluster Test Data ÷ 231A × 0308 ÷ 0378 ÷ # ÷ [0.2] WATCH (ExtPict) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] (Other) ÷ [0.3] ``` ```Unicode Grapheme Cluster Test Data ÷ 0300 ÷ 0020 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] ``` ```Unicode Grapheme Cluster Test Data ÷ 0300 × 0308 ÷ 0020 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] SPACE (Other) ÷ [0.3] ``` ```Unicode Grapheme Cluster Test Data ÷ 0300 ÷ 000D ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [5.0] (CR) ÷ [0.3] ``` ```Unicode Grapheme Cluster Test Data ÷ 0300 × 0308 ÷ 000D ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (CR) ÷ [0.3] ``` ```Unicode Grapheme Cluster Test Data ÷ 0300 ÷ 000A ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [5.0] (LF) ÷ [0.3] ``` ```Unicode Grapheme Cluster Test Data ÷ 0300 × 0308 ÷ 000A ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (LF) ÷ [0.3] ``` ```Unicode Grapheme Cluster Test Data ÷ 0300 ÷ 0001 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] ``` ```Unicode Grapheme Cluster Test Data ÷ 0300 × 0308 ÷ 0001 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [5.0] (Control) ÷ [0.3] ``` ```Unicode Grapheme Cluster Test Data ÷ 0300 × 034F ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] ``` ```Unicode Grapheme Cluster Test Data ÷ 0300 × 0308 × 034F ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.0] COMBINING GRAPHEME JOINER (Extend) ÷ [0.3] ``` ```Unicode Grapheme Cluster Test Data ÷ 0300 ÷ 1F1E6 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] ``` ```Unicode Grapheme Cluster Test Data ÷ 0300 × 0308 ÷ 1F1E6 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] REGIONAL INDICATOR SYMBOL LETTER A (RI) ÷ [0.3] ``` ```Unicode Grapheme Cluster Test Data ÷ 0300 ÷ 0600 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] ``` ```Unicode Grapheme Cluster Test Data ÷ 0300 × 0308 ÷ 0600 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] ARABIC NUMBER SIGN (Prepend) ÷ [0.3] ``` ```Unicode Grapheme Cluster Test Data ÷ 0300 × 0903 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] ``` ```Unicode Grapheme Cluster Test Data ÷ 0300 × 0308 × 0903 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) × [9.1] DEVANAGARI SIGN VISARGA (SpacingMark) ÷ [0.3] ``` ```Unicode Grapheme Cluster Test Data ÷ 0300 ÷ 1100 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] ``` ```Unicode Grapheme Cluster Test Data ÷ 0300 × 0308 ÷ 1100 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL CHOSEONG KIYEOK (L) ÷ [0.3] ``` ```Unicode Grapheme Cluster Test Data ÷ 0300 ÷ 1160 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] ``` ```Unicode Grapheme Cluster Test Data ÷ 0300 × 0308 ÷ 1160 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JUNGSEONG FILLER (V) ÷ [0.3] ``` ```Unicode Grapheme Cluster Test Data ÷ 0300 ÷ 11A8 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] ``` ```Unicode Grapheme Cluster Test Data ÷ 0300 × 0308 ÷ 11A8 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL JONGSEONG KIYEOK (T) ÷ [0.3] ``` ```Unicode Grapheme Cluster Test Data ÷ 0300 ÷ AC00 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] ``` ```Unicode Grapheme Cluster Test Data ÷ 0300 × 0308 ÷ AC00 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GA (LV) ÷ [0.3] ``` ```Unicode Grapheme Cluster Test Data ÷ 0300 ÷ AC01 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] ``` ```Unicode Grapheme Cluster Test Data ÷ 0300 × 0308 ÷ AC01 ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) × [9.0] COMBINING DIAERESIS (Extend_ExtCccZwj) ÷ [999.0] HANGUL SYLLABLE GAG (LVT) ÷ [0.3] ``` ```Unicode Grapheme Cluster Test Data ÷ 0300 ÷ 231A ÷ # ÷ [0.2] COMBINING GRAVE ACCENT (Extend_ExtCccZwj) ÷ [999.0] WATCH (ExtPict) ÷ [0.3] ``` -------------------------------- ### Render Text at Default Position (0,0) in C# Source: https://github.com/toptensoftware/richtextkit/blob/main/docsrc/rendering.md This snippet demonstrates how to render text at the default top-left position (0,0) on a canvas. It utilizes the Paint method available on both RichString and TextBlock objects. ```csharp // Paint at (0,0) textBlockOrRichString.Paint(canvas); ``` -------------------------------- ### Core Line Breaking Rule Set Source: https://github.com/toptensoftware/richtextkit/blob/main/LineBreakV12/LineBreakerRules.txt This snippet contains the complete set of rules that dictate where line breaks can occur. Each rule specifies a condition for a break (indicated by '�') or a mandatory break (indicated by '==>') between different character categories or sequences, ensuring correct text flow and word wrapping. ```Line Breaking Rules 0.2 sot � any 0.3 any � eot 4.0 BK � any 5.01 CR � LF 5.02 CR � any 5.03 LF � any 5.04 NL � any 6.0 any � ( BK | CR | LF | NL ) 7.01 any � SP 7.02 any � ZW 8.0 ==> ZW SP* � any 8.1 ZWJ_O � any 9.0 [^ SP BK CR LF NL ZW] � CM 11.01 any � WJ 11.02 WJ � any 12.0 GL � any 12.1 [^ SP BA HY CM] � GL 12.2 ==> [^ BA HY CM] CM+ � GL 12.3 ==> ^ CM+ � GL 13.01 any � EX 13.02 [^ NU CM] � (CL | CP | IS | SY) 13.03 ==> [^ NU CM] CM+ � (CL | CP | IS | SY) 13.04 ==> ^ CM+ � (CL | CP | IS | SY) 14.0 ==> OP SP* � any 15.0 ==> QU SP* � OP 16.0 ==> (CL | CP) SP* � NS 17.0 ==> B2 SP* � B2 18.0 SP � any 19.01 any � QU 19.02 QU � any 20.01 any � CB 20.02 CB � any 21.01 any � BA 21.02 any � HY 21.03 any � NS 21.04 BB � any 21.1 ==> HL (HY | BA) � any 21.2 SY � HL 22.01 (AL | HL) � IN 22.02 EX � IN 22.03 (ID | EB | EM) � IN 22.04 IN � IN 22.05 NU � IN 23.02 (AL | HL) � NU 23.03 NU � (AL | HL) 23.12 PR � (ID | EB | EM) 23.13 (ID | EB | EM) � PO 24.02 (PR | PO) � (AL | HL) 24.03 (AL | HL) � (PR | PO) 25.01 (PR | PO) � ( OP | HY )? NU 25.02 ( OP | HY ) � NU 25.03 NU � (NU | SY | IS) 25.04 ==> NU (NU | SY | IS)* � (NU | SY | IS | CL | CP) 25.05 ==> NU (NU | SY | IS)* (CL | CP)? � (PO | PR) 26.01 JL � JL | JV | H2 | H3 26.02 JV | H2 � JV | JT 26.03 JT | H3 � JT 27.01 JL | JV | JT | H2 | H3 � IN 27.02 JL | JV | JT | H2 | H3 � PO 27.03 PR � JL | JV | JT | H2 | H3 28.0 (AL | HL) � (AL | HL) 29.0 IS � (AL | HL) 30.01 (AL | HL | NU) � OP 30.02 CP � (AL | HL | NU) 30.11 ==> ^ (RI RI)* RI � RI 30.12 ==> [^RI] (RI RI)* RI � RI 30.13 RI � RI 30.2 EB � EM 999.0 any � Any ``` -------------------------------- ### Unicode Grapheme Cluster Break: LF Property Source: https://github.com/toptensoftware/richtextkit/blob/main/BuildUnicodeData/GraphemeBreakProperty.txt This snippet defines the Unicode code point for Line Feed (LF) and its assignment to the 'LF' grapheme cluster break property, indicating a mandatory break opportunity. ```Unicode Data 000A ; LF # Cc ``` -------------------------------- ### Unicode Grapheme Cluster Break: Prepend Property Source: https://github.com/toptensoftware/richtextkit/blob/main/BuildUnicodeData/GraphemeBreakProperty.txt This section lists Unicode code points assigned the 'Prepend' grapheme cluster break property. Characters with this property are typically ignored when determining grapheme cluster boundaries and are conceptually prepended to the following grapheme cluster. ```Unicode Data 0600..0605 ; Prepend # Cf [6] ARABIC NUMBER SIGN..ARABIC NUMBER MARK ABOVE 06DD ; Prepend # Cf ARABIC END OF AYAH 070F ; Prepend # Cf SYRIAC ABBREVIATION MARK 08E2 ; Prepend # Cf ARABIC DISPUTED END OF AYAH 0D4E ; Prepend # Lo MALAYALAM LETTER DOT REPH 110BD ; Prepend # Cf KAITHI NUMBER SIGN 110CD ; Prepend # Cf KAITHI NUMBER SIGN ABOVE 111C2..111C3 ; Prepend # Lo [2] SHARADA SIGN JIHVAMULIYA..SHARADA SIGN UPADHMANIYA 1193F ; Prepend # Lo DIVES AKURU PREFIXED NASAL SIGN 11941 ; Prepend # Lo DIVES AKURU INITIAL RA 11A3A ; Prepend # Lo ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA 11A84..11A89 ; Prepend # Lo [6] SOYOMBO SIGN JIHVAMULIYA..SOYOMBO CLUSTER-INITIAL LETTER SA 11D46 ; Prepend # Lo MASARAM GONDI REPHA ``` -------------------------------- ### Hangul Syllable Type: Leading Jamo Source: https://github.com/toptensoftware/richtextkit/blob/main/BuildUnicodeData/HangulSyllableType.txt Specifies Unicode code point ranges that are classified as 'Leading_Jamo' (L) in the Hangul Syllable Type property. These typically represent initial consonants (Choseong) in Hangul syllables. ```APIDOC 1100..115F ; L # Lo [96] HANGUL CHOSEONG KIYEOK..HANGUL CHOSEONG FILLER A960..A97C ; L # Lo [29] HANGUL CHOSEONG TIKEUT-MIEUM..HANGUL CHOSEONG SSANGYEORINHIEUH ``` -------------------------------- ### Hangul LV Syllable Unicode Character Mappings Source: https://github.com/toptensoftware/richtextkit/blob/main/BuildUnicodeData/HangulSyllableType.txt This snippet provides a direct mapping of hexadecimal Unicode code points to their official Hangul LV (Lead Vowel) syllable names. Such data is fundamental for applications dealing with Unicode character properties, text rendering, and collation, ensuring correct handling of complex scripts like Hangul. ```Unicode Character Data AC00 ; LV # Lo HANGUL SYLLABLE GA AC1C ; LV # Lo HANGUL SYLLABLE GAE AC38 ; LV # Lo HANGUL SYLLABLE GYA AC54 ; LV # Lo HANGUL SYLLABLE GYAE AC70 ; LV # Lo HANGUL SYLLABLE GEO AC8C ; LV # Lo HANGUL SYLLABLE GE ACA8 ; LV # Lo HANGUL SYLLABLE GYEO ACC4 ; LV # Lo HANGUL SYLLABLE GYE ACE0 ; LV # Lo HANGUL SYLLABLE GO ACFC ; LV # Lo HANGUL SYLLABLE GWA AD18 ; LV # Lo HANGUL SYLLABLE GWAE AD34 ; LV # Lo HANGUL SYLLABLE GOE AD50 ; LV # Lo HANGUL SYLLABLE GYO AD6C ; LV # Lo HANGUL SYLLABLE GU AD88 ; LV # Lo HANGUL SYLLABLE GWEO ADA4 ; LV # Lo HANGUL SYLLABLE GWE ADC0 ; LV # Lo HANGUL SYLLABLE GWI ADDC ; LV # Lo HANGUL SYLLABLE GYU ADF8 ; LV # Lo HANGUL SYLLABLE GEU AE14 ; LV # Lo HANGUL SYLLABLE GYI AE30 ; LV # Lo HANGUL SYLLABLE GI AE4C ; LV # Lo HANGUL SYLLABLE GGA AE68 ; LV # Lo HANGUL SYLLABLE GGAE AE84 ; LV # Lo HANGUL SYLLABLE GGYA AEA0 ; LV # Lo HANGUL SYLLABLE GGYAE AEBC ; LV # Lo HANGUL SYLLABLE GGEO AED8 ; LV # Lo HANGUL SYLLABLE GGE AEF4 ; LV # Lo HANGUL SYLLABLE GGYEO AF10 ; LV # Lo HANGUL SYLLABLE GGYE AF2C ; LV # Lo HANGUL SYLLABLE GGO AF48 ; LV # Lo HANGUL SYLLABLE GGWA AF64 ; LV # Lo HANGUL SYLLABLE GGWAE AF80 ; LV # Lo HANGUL SYLLABLE GGOE AF9C ; LV # Lo HANGUL SYLLABLE GGYO AFB8 ; LV # Lo HANGUL SYLLABLE GGU AFD4 ; LV # Lo HANGUL SYLLABLE GGWEO AFF0 ; LV # Lo HANGUL SYLLABLE GGWE B00C ; LV # Lo HANGUL SYLLABLE GGWI B028 ; LV # Lo HANGUL SYLLABLE GGYU B044 ; LV # Lo HANGUL SYLLABLE GGEU B060 ; LV # Lo HANGUL SYLLABLE GGYI B07C ; LV # Lo HANGUL SYLLABLE GGI B098 ; LV # Lo HANGUL SYLLABLE NA B0B4 ; LV # Lo HANGUL SYLLABLE NAE B0D0 ; LV # Lo HANGUL SYLLABLE NYA B0EC ; LV # Lo HANGUL SYLLABLE NYAE B108 ; LV # Lo HANGUL SYLLABLE NEO B124 ; LV # Lo HANGUL SYLLABLE NE B140 ; LV # Lo HANGUL SYLLABLE NYEO B15C ; LV # Lo HANGUL SYLLABLE NYE B178 ; LV # Lo HANGUL SYLLABLE NO B194 ; LV # Lo HANGUL SYLLABLE NWA B1B0 ; LV # Lo HANGUL SYLLABLE NWAE B1CC ; LV # Lo HANGUL SYLLABLE NOE B1E8 ; LV # Lo HANGUL SYLLABLE NYO B204 ; LV # Lo HANGUL SYLLABLE NU B220 ; LV # Lo HANGUL SYLLABLE NWEO B23C ; LV # Lo HANGUL SYLLABLE NWE B258 ; LV # Lo HANGUL SYLLABLE NWI B274 ; LV # Lo HANGUL SYLLABLE NYU B290 ; LV # Lo HANGUL SYLLABLE NEU B2AC ; LV # Lo HANGUL SYLLABLE NYI B2C8 ; LV # Lo HANGUL SYLLABLE NI B2E4 ; LV # Lo HANGUL SYLLABLE DA B300 ; LV # Lo HANGUL SYLLABLE DAE B31C ; LV # Lo HANGUL SYLLABLE DYA B338 ; LV # Lo HANGUL SYLLABLE DYAE B354 ; LV # Lo HANGUL SYLLABLE DEO B370 ; LV # Lo HANGUL SYLLABLE DE B38C ; LV # Lo HANGUL SYLLABLE DYEO B3A8 ; LV # Lo HANGUL SYLLABLE DYE B3C4 ; LV # Lo HANGUL SYLLABLE DO B3E0 ; LV # Lo HANGUL SYLLABLE DWA B3FC ; LV # Lo HANGUL SYLLABLE DWAE B418 ; LV # Lo HANGUL SYLLABLE DOE B434 ; LV # Lo HANGUL SYLLABLE DYO B450 ; LV # Lo HANGUL SYLLABLE DU B46C ; LV # Lo HANGUL SYLLABLE DWEO B488 ; LV # Lo HANGUL SYLLABLE DWE B4A4 ; LV # Lo HANGUL SYLLABLE DWI B4C0 ; LV # Lo HANGUL SYLLABLE DYU B4DC ; LV # Lo HANGUL SYLLABLE DEU B4F8 ; LV # Lo HANGUL SYLLABLE DYI B514 ; LV # Lo HANGUL SYLLABLE DI B530 ; LV # Lo HANGUL SYLLABLE DDA B54C ; LV # Lo HANGUL SYLLABLE DDAE B568 ; LV # Lo HANGUL SYLLABLE DDYA B584 ; LV # Lo HANGUL SYLLABLE DDYAE B5A0 ; LV # Lo HANGUL SYLLABLE DDEO B5BC ; LV # Lo HANGUL SYLLABLE DDE B5D8 ; LV # Lo HANGUL SYLLABLE DDYEO B5F4 ; LV # Lo HANGUL SYLLABLE DDYE B610 ; LV # Lo HANGUL SYLLABLE DDO B62C ; LV # Lo HANGUL SYLLABLE DDWA B648 ; LV # Lo HANGUL SYLLABLE DDWAE B664 ; LV # Lo HANGUL SYLLABLE DDOE B680 ; LV # Lo HANGUL SYLLABLE DDYO B69C ; LV # Lo HANGUL SYLLABLE DDU ``` -------------------------------- ### Unicode Grapheme Cluster Break: CR Property Source: https://github.com/toptensoftware/richtextkit/blob/main/BuildUnicodeData/GraphemeBreakProperty.txt This snippet defines the Unicode code point for Carriage Return (CR) and its assignment to the 'CR' grapheme cluster break property, indicating a mandatory break opportunity. ```Unicode Data 000D ; CR # Cc ``` -------------------------------- ### Hangul Syllable Type: Not Applicable Source: https://github.com/toptensoftware/richtextkit/blob/main/BuildUnicodeData/HangulSyllableType.txt Defines the default Hangul Syllable Type for all code points not explicitly listed, which is 'Not_Applicable'. This ensures all Unicode code points have a defined Hangul Syllable Type. ```APIDOC @missing: 0000..10FFFF; Not_Applicable ``` -------------------------------- ### Unicode Extend Property Character Definitions for Rich Text Source: https://github.com/toptensoftware/richtextkit/blob/main/BuildUnicodeData/GraphemeBreakProperty.txt This snippet defines Unicode code points and ranges classified as 'Extend' characters, specifically Nonspacing Marks (Mn) and Spacing Combining Marks (Mc). It covers various scripts such as Tamil, Telugu, Kannada, Malayalam, Sinhala, Thai, Lao, Tibetan, Myanmar, Ethiopic, Tagalog, Hanunoo, Buhid, Tagbanwa, and Khmer. This data is essential for applications that need to correctly handle text layout, rendering, and collation for complex script systems. ```Unicode Character Data 0BC0 ; Extend # Mn TAMIL VOWEL SIGN II 0BCD ; Extend # Mn TAMIL SIGN VIRAMA 0BD7 ; Extend # Mc TAMIL AU LENGTH MARK 0C00 ; Extend # Mn TELUGU SIGN COMBINING CANDRABINDU ABOVE 0C04 ; Extend # Mn TELUGU SIGN COMBINING ANUSVARA ABOVE 0C3E..0C40 ; Extend # Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II 0C46..0C48 ; Extend # Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI 0C4A..0C4D ; Extend # Mn [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA 0C55..0C56 ; Extend # Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK 0C62..0C63 ; Extend # Mn [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL 0C81 ; Extend # Mn KANNADA SIGN CANDRABINDU 0CBC ; Extend # Mn KANNADA SIGN NUKTA 0CBF ; Extend # Mn KANNADA VOWEL SIGN I 0CC2 ; Extend # Mc KANNADA VOWEL SIGN UU 0CC6 ; Extend # Mn KANNADA VOWEL SIGN E 0CCC..0CCD ; Extend # Mn [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA 0CD5..0CD6 ; Extend # Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK 0CE2..0CE3 ; Extend # Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL 0D00..0D01 ; Extend # Mn [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU 0D3B..0D3C ; Extend # Mn [2] MALAYALAM SIGN VERTICAL BAR VIRAMA..MALAYALAM SIGN CIRCULAR VIRAMA 0D3E ; Extend # Mc MALAYALAM VOWEL SIGN AA 0D41..0D44 ; Extend # Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR 0D4D ; Extend # Mn MALAYALAM SIGN VIRAMA 0D57 ; Extend # Mc MALAYALAM AU LENGTH MARK 0D62..0D63 ; Extend # Mn [2] MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL 0D81 ; Extend # Mn SINHALA SIGN CANDRABINDU 0DCA ; Extend # Mn SINHALA SIGN AL-LAKUNA 0DCF ; Extend # Mc SINHALA VOWEL SIGN AELA-PILLA 0DD2..0DD4 ; Extend # Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA 0DD6 ; Extend # Mn SINHALA VOWEL SIGN DIGA PAA-PILLA 0DDF ; Extend # Mc SINHALA VOWEL SIGN GAYANUKITTA 0E31 ; Extend # Mn THAI CHARACTER MAI HAN-AKAT 0E34..0E3A ; Extend # Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU 0E47..0E4E ; Extend # Mn [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN 0EB1 ; Extend # Mn LAO VOWEL SIGN MAI KAN 0EB4..0EBC ; Extend # Mn [9] LAO VOWEL SIGN I..LAO SEMIVOWEL SIGN LO 0EC8..0ECD ; Extend # Mn [6] LAO TONE MAI EK..LAO NIGGAHITA 0F18..0F19 ; Extend # Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS 0F35 ; Extend # Mn TIBETAN MARK NGAS BZUNG NYI ZLA 0F37 ; Extend # Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS 0F39 ; Extend # Mn TIBETAN MARK TSA -PHRU 0F71..0F7E ; Extend # Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO 0F80..0F84 ; Extend # Mn [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA 0F86..0F87 ; Extend # Mn [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS 0F8D..0F97 ; Extend # Mn [11] TIBETAN SUBJOINED SIGN LCE TSA CAN..TIBETAN SUBJOINED LETTER JA 0F99..0FBC ; Extend # Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA 0FC6 ; Extend # Mn TIBETAN SYMBOL PADMA GDAN 102D..1030 ; Extend # Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU 1032..1037 ; Extend # Mn [6] MYANMAR VOWEL SIGN AI..MYANMAR SIGN DOT BELOW 1039..103A ; Extend # Mn [2] MYANMAR SIGN VIRAMA..MYANMAR SIGN ASAT 103D..103E ; Extend # Mn [2] MYANMAR CONSONANT SIGN MEDIAL WA..MYANMAR CONSONANT SIGN MEDIAL HA 1058..1059 ; Extend # Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL 105E..1060 ; Extend # Mn [3] MYANMAR CONSONANT SIGN MON MEDIAL NA..MYANMAR CONSONANT SIGN MON MEDIAL LA 1071..1074 ; Extend # Mn [4] MYANMAR VOWEL SIGN GEBA KAREN I..MYANMAR VOWEL SIGN KAYAH EE 1082 ; Extend # Mn MYANMAR CONSONANT SIGN SHAN MEDIAL WA 1085..1086 ; Extend # Mn [2] MYANMAR VOWEL SIGN SHAN E ABOVE..MYANMAR VOWEL SIGN SHAN FINAL Y 108D ; Extend # Mn MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE 109D ; Extend # Mn MYANMAR VOWEL SIGN AITON AI 135D..135F ; Extend # Mn [3] ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK..ETHIOPIC COMBINING GEMINATION MARK 1712..1714 ; Extend # Mn [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA 1732..1734 ; Extend # Mn [3] HANUNOO VOWEL SIGN I..HANUNOO SIGN PAMUDPOD 1752..1753 ; Extend # Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U 1772..1773 ; Extend # Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U 17B4..17B5 ; Extend # Mn [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA 17B7..17BD ; Extend # Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA ```