diff --git a/.gitignore b/.gitignore index f7af67d..d45b0d3 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,5 @@ desktop.ini *.zip native/**/build .ccls-cache + +.fake \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json index d887356..201ae54 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -9,12 +9,14 @@ "type": "coreclr", "request": "launch", "preLaunchTask": "build", - "program": "${workspaceFolder}/bin/Release/netcoreapp3.0/fvim.dll", + "program": "${workspaceFolder}/bin/Debug/netcoreapp3.1/FVim.dll", "args": [], - "cwd": "${workspaceFolder}/bin/Release/netcoreapp3.0/", + "cwd": "${workspaceFolder}", "stopAtEntry": false, - "console": "internalConsole", - "justMyCode": false - }, + "console": "integratedTerminal", + "justMyCode": false, + "enableStepFiltering": false + } + ] } \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json index bfefeae..6278fb1 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -5,12 +5,22 @@ "tasks": [ { "label": "build", - "command": "dotnet build -c Release", "type": "shell", + "command": "dotnet", + "args": [ + "msbuild", + // Ask msbuild to generate full paths for file names. + "/property:GenerateFullPaths=true", + "/t:build", + // Do not generate summary otherwise it leads to duplicate errors in Problems panel + "/consoleloggerparameters:NoSummary" + ], "group": "build", "presentation": { + // Reveal the output only if unrecognized errors occur. "reveal": "silent" }, + // Use the standard MS compiler pattern to detect errors, warnings and infos "problemMatcher": "$msCompile" } ] diff --git a/nerd.ttf b/Fonts/nerd.ttf similarity index 100% rename from nerd.ttf rename to Fonts/nerd.ttf diff --git a/Views/Cursor.xaml.fs b/Views/Cursor.xaml.fs index c02bd5a..d14eab7 100644 --- a/Views/Cursor.xaml.fs +++ b/Views/Cursor.xaml.fs @@ -15,7 +15,6 @@ open Avalonia.Media.Imaging open Avalonia.Skia open Avalonia.Threading open Avalonia.VisualTree -open SkiaSharp open System open System.Collections.Generic open System.Reactive.Disposables @@ -29,9 +28,10 @@ type Cursor() as this = static let IsActiveProperty = AvaloniaProperty.Register("IsActive") let mutable cursor_timer: IDisposable = null - let mutable bgbrush: SolidColorBrush = SolidColorBrush(Colors.Black) - let mutable fgbrush: SolidColorBrush = SolidColorBrush(Colors.White) - let mutable spbrush: SolidColorBrush = SolidColorBrush(Colors.Red) + let mutable fg = Colors.White + let mutable bg = Colors.Black + let mutable sp = Colors.Red + let mutable cursor_fb = AllocateFramebuffer (20.0) (20.0) 1.0 let mutable cursor_fb_vm = CursorViewModel(Some -1) let mutable cursor_fb_s = 1.0 @@ -49,9 +49,8 @@ type Cursor() as this = true else false - let fgpaint = new SKPaint() - let bgpaint = new SKPaint() - let sppaint = new SKPaint() + let _buffer_glyph = [| 0u |] + let _buffer_glyph_mem = ReadOnlyMemory(_buffer_glyph) let cursorTimerRun action time = if cursor_timer <> null then @@ -81,12 +80,9 @@ type Cursor() as this = then () else (* update the settings *) - if this.ViewModel.fg <> fgbrush.Color then - fgbrush <- SolidColorBrush(this.ViewModel.fg) - if this.ViewModel.bg <> bgbrush.Color then - bgbrush <- SolidColorBrush(this.ViewModel.bg) - if this.ViewModel.sp <> spbrush.Color then - spbrush <- SolidColorBrush(this.ViewModel.sp) + fg <- this.ViewModel.fg + bg <- this.ViewModel.bg + sp <- this.ViewModel.sp (* reconfigure the cursor *) showCursor true cursorTimerRun blinkon this.ViewModel.blinkwait @@ -142,14 +138,12 @@ type Cursor() as this = match this.ViewModel.shape, this.ViewModel.cellPercentage with | CursorShape.Block, _ -> - let _, typeface = GetTypeface(this.ViewModel.text, this.ViewModel.italic, this.ViewModel.bold, this.ViewModel.typeface, this.ViewModel.wtypeface) - SetForegroundBrush(fgpaint, this.ViewModel.fg, typeface, this.ViewModel.fontSize) - bgpaint.Color <- this.ViewModel.bg.ToSKColor() - sppaint.Color <- this.ViewModel.sp.ToSKColor() + let typeface = GetTypeface(this.ViewModel.text, this.ViewModel.italic, this.ViewModel.bold, this.ViewModel.typeface, this.ViewModel.wtypeface) let bounds = Rect(this.Bounds.Size) let render_block (ctx: 'a) = if this.IsActive then - RenderText(ctx, bounds, scale, fgpaint, bgpaint, sppaint, this.ViewModel.underline, this.ViewModel.undercurl, this.ViewModel.text.ToString(), ValueNone) + _buffer_glyph.[0] <- this.ViewModel.text.Codepoint + RenderText(ctx, bounds, scale, fg, bg, sp, this.ViewModel.underline, this.ViewModel.undercurl, Unshaped _buffer_glyph_mem, typeface, this.ViewModel.fontSize) else let brush = SolidColorBrush(this.ViewModel.bg) ctx.DrawRectangle(brush, Pen(brush), RoundedRect(bounds)) @@ -158,9 +152,9 @@ type Cursor() as this = match ctx.PlatformImpl with | :? ISkiaDrawingContextImpl -> // immediate - SetOpacity fgpaint this.Opacity - SetOpacity bgpaint this.Opacity - SetOpacity sppaint this.Opacity + fg <- UpdateOpacity fg this.Opacity + bg <- UpdateOpacity bg this.Opacity + sp <- UpdateOpacity sp this.Opacity render_block ctx.PlatformImpl | _ -> // deferred diff --git a/Views/Editor.xaml.fs b/Views/Editor.xaml.fs index 991ab04..65a9321 100644 --- a/Views/Editor.xaml.fs +++ b/Views/Editor.xaml.fs @@ -4,8 +4,6 @@ open FVim.ui open FVim.wcwidth open ReactiveUI -open SkiaSharp -open SkiaSharp.HarfBuzz open Avalonia open Avalonia.Controls open Avalonia.Markup.Xaml @@ -29,6 +27,7 @@ module private EditorHelper = open EditorHelper open System.Text +open Avalonia.Media type Editor() as this = inherit Canvas() @@ -80,21 +79,14 @@ type Editor() as this = let px = pt * grid_scale Point(Math.Ceiling px.X, Math.Ceiling px.Y) / grid_scale - let mutable fgpaint = null - let mutable bgpaint = null - let mutable sppaint = null + let mutable _render_glyph_buf = [||] + let mutable _render_char_buf = [||] let drawBuffer (ctx: IDrawingContextImpl) row col colend hlid (issym: bool) = let font, fontwide, fontsize = grid_vm.GetFontAttrs() let fg, bg, sp, attrs = theme.GetDrawAttrs hlid - let shaper, typeface = GetTypeface(grid_vm.[row, col].text, attrs.italic, attrs.bold, font, fontwide) - - if fgpaint = null then - fgpaint <- new SKPaint() - bgpaint <- new SKPaint() - sppaint <- new SKPaint() - SetForegroundBrush(fgpaint, fg, typeface, fontsize) + let typeface = GetTypeface(grid_vm.[row, col].text, attrs.italic, attrs.bold, font, fontwide) let nr_col = match wswidth grid_vm.[row, colend - 1].text with @@ -107,24 +99,32 @@ type Editor() as this = let bottomRight = topLeft + grid_vm.GetPoint 1 nr_col let bg_region = Rect(topLeft, bottomRight) - bgpaint.Color <- bg.ToSKColor() - sppaint.Color <- sp.ToSKColor() - - let txt = - let sb = StringBuilder() - for i = col to colend - 1 do - match grid_vm.[row, i] with - | { text = { c1 = c1; c2 = c2; isSurrogatePair = true } } -> sb.Append(c1).Append(c2) |> ignore - | { text = { c1 = c1 } } -> sb.Append(c1) |> ignore - sb.ToString() - - let shaping = - if txt.Length > 1 && txt.Length < 5 && issym && States.font_ligature - then ValueSome shaper - else ValueNone + let txt = + if nr_col > 1 && nr_col < 5 && issym && States.font_ligature then + if _render_char_buf.Length < (colend - col) * 2 then + _render_char_buf <- Array.zeroCreate ((colend - col) * 2) + let mutable _len = 0 + for i = col to colend - 1 do + match grid_vm.[row, i].text with + | { c1 = c1; c2 = c2; isSurrogatePair = true } -> + _render_char_buf.[_len] <- c1 + _render_char_buf.[_len + 1] <- c2 + _len <- _len + 2 + | { c1 = c1 } -> + _render_char_buf.[_len] <- c1 + _len <- _len + 1 + + Shaped <| ReadOnlyMemory(_render_char_buf, 0, _len) + else + if _render_glyph_buf.Length < colend - col then + _render_glyph_buf <- Array.zeroCreate (colend - col) + for i = col to colend - 1 do + _render_glyph_buf.[i - col] <- grid_vm.[row, i].text.Codepoint + + Unshaped <| ReadOnlyMemory(_render_glyph_buf, 0, colend - col) try - RenderText(ctx, bg_region, grid_scale, fgpaint, bgpaint, sppaint, attrs.underline, attrs.undercurl, txt, shaping) + RenderText(ctx, bg_region, grid_scale, fg, bg, sp, attrs.underline, attrs.undercurl, txt, typeface, fontsize) with ex -> trace grid_vm "drawBuffer: %s" (ex.ToString()) // assembles text from grid and draw onto the context. diff --git a/Views/MainWindow.xaml.fs b/Views/MainWindow.xaml.fs index c15ebe0..8bac8d3 100644 --- a/Views/MainWindow.xaml.fs +++ b/Views/MainWindow.xaml.fs @@ -17,6 +17,8 @@ open Avalonia.Rendering open Avalonia.Interactivity open Avalonia.VisualTree +open Avalonia.Diagnostics + #nowarn "0025" open System.Runtime.InteropServices diff --git a/def.fs b/def.fs index 4a22317..25fef51 100644 --- a/def.fs +++ b/def.fs @@ -110,6 +110,10 @@ type Rune = } with override x.ToString() = if x.isSurrogatePair then sprintf "%c%c" x.c1 x.c2 else x.c1.ToString() + member x.Codepoint with get() = + if x.isSurrogatePair + then 0x10000u + (uint x.c1 - 0xD800u) * 0x400u + (uint x.c2 - 0xDC00u) + else uint x.c1 static member empty = { c1 = ' '; c2 = char 0; isSurrogatePair = false } [] diff --git a/fvim.fsproj b/fvim.fsproj index 50a7f8b..1f589ad 100644 --- a/fvim.fsproj +++ b/fvim.fsproj @@ -65,32 +65,26 @@ Designer - + - - - - + - - runtime; build; native; contentfiles; analyzers all - diff --git a/states.fs b/states.fs index d16fa9e..af36d7d 100644 --- a/states.fs +++ b/states.fs @@ -78,8 +78,8 @@ let mutable font_subpixel = true let mutable font_autosnap = true let mutable font_ligature = true let mutable font_hintLevel = SKPaintHinting.NoHinting -let mutable font_weight_normal = SKFontStyleWeight.Normal -let mutable font_weight_bold = SKFontStyleWeight.Bold +let mutable font_weight_normal = FontWeight.Normal +let mutable font_weight_bold = FontWeight.Bold let mutable font_lineheight = LineHeightOption.Default let mutable font_nonerd = false diff --git a/ui.fs b/ui.fs index 823697a..b23506f 100644 --- a/ui.fs +++ b/ui.fs @@ -11,11 +11,11 @@ open Avalonia.Input open Avalonia.Media open Avalonia.Media.Imaging open Avalonia.Platform -open Avalonia.Skia -open SkiaSharp -open SkiaSharp.HarfBuzz open System open System.Reflection +open Avalonia.Controls.Shapes +open Avalonia.Media.TextFormatting +open System.Globalization #nowarn "0009" @@ -153,20 +153,12 @@ let DefaultFontEmoji = elif RuntimeInformation.IsOSPlatform(OSPlatform.OSX) then "Apple Color Emoji" else "Noto Color Emoji" -let private nerd_typeface = SKTypeface.FromStream(Assembly.GetExecutingAssembly().GetManifestResourceStream("fvim.nerd.ttf")) -let private nerd_shaper = new SKShaper(nerd_typeface) -let private emoji_typeface = SKTypeface.FromFamilyName(DefaultFontEmoji) -let private emoji_shaper = new SKShaper(emoji_typeface) -let private fontcache = System.Collections.Generic.Dictionary() +let private nerd_typeface = Typeface("resm:fvim.Fonts.nerd.ttf?assembly=FVim#Iosevka") +let private emoji_typeface = Typeface(DefaultFontEmoji) +let private fontcache = System.Collections.Generic.Dictionary() let private InvalidateFontCache () = - List.ofSeq fontcache.Keys - |> List.iter (fun k -> - let (shaper,font) = fontcache.[k] - shaper.Dispose() - font.Dispose() - ignore(fontcache.Remove k) - ) + fontcache.Clear() ignore(States.Register.Watch "font" InvalidateFontCache) @@ -181,55 +173,50 @@ let GetTypeface(txt, italic, bold, font, wfont) = let _get fname = match fontcache.TryGetValue((fname, italic, bold)) with - | true, (shaper, typeface) -> (shaper, typeface) + | true, typeface -> typeface | _ -> trace "ui" "GetTypeface: allocating new typeface %s:%b:%b" fname italic bold let weight = if bold then States.font_weight_bold else States.font_weight_normal - let width = SKFontStyleWidth.Normal - let slang = if italic then SKFontStyleSlant.Italic else SKFontStyleSlant.Upright - let typeface = SKTypeface.FromFamilyName(fname, weight, width, slang) - let shaper = new SKShaper(typeface) - fontcache.[(fname, italic, bold)] <- (shaper, typeface) - (shaper, typeface) + let slang = if italic then FontStyle.Italic else FontStyle.Normal + let typeface = + try Typeface(fname, slang, weight) + with | _ -> Typeface.Default + fontcache.[(fname, italic, bold)] <- typeface + typeface let wfont = if String.IsNullOrEmpty wfont then font else wfont match w with | CharType.Wide -> _get wfont | CharType.Powerline - | CharType.Nerd when not States.font_nonerd -> (nerd_shaper, nerd_typeface) - | CharType.Emoji -> (emoji_shaper, emoji_typeface) + | CharType.Nerd when not States.font_nonerd -> nerd_typeface + | CharType.Emoji -> emoji_typeface | _ -> _get font let MeasureText (rune: Rune, font: string, wfont: string, fontSize: float, scaling: float) = - use paint = new SKPaint() - paint.Typeface <- snd <| GetTypeface(rune, false, false, font, wfont) - paint.TextSize <- single fontSize - paint.IsAntialias <- States.font_antialias - paint.IsAutohinted <- States.font_autohint - paint.IsLinearText <- false - paint.HintingLevel <- States.font_hintLevel - paint.LcdRenderText <- false - paint.SubpixelText <- States.font_subpixel - paint.TextAlign <- SKTextAlign.Left - paint.TextEncoding <- SKTextEncoding.Utf16 + let typeface = GetTypeface(rune, false, false, font, wfont).GlyphTypeface let mutable score = 999999999999.0 let mutable s = fontSize let mutable w = 0.0 let mutable h = 0.0 - let str = rune.ToString() let search (sizeStep: int) = + // s' is pixels per em let s' = fontSize + float(sizeStep) * 0.01 - paint.TextSize <- single s' + // u' is pixels per font design unit + let u' = s' / float typeface.DesignEmHeight + let glyph = [| typeface.GetGlyph(rune.Codepoint) |] + use run = new GlyphRun(typeface, s', Utilities.ReadOnlySlice(ReadOnlyMemory(glyph))) + let bounds = run.Bounds - let w' = float(paint.MeasureText str) + + let w' = bounds.Width let h'' = match States.font_lineheight with - | States.Absolute h' -> h' - | States.Default -> float paint.FontSpacing - | States.Add h' -> (float paint.FontSpacing) + h' + | States.Absolute lh -> lh + | States.Default -> float typeface.LineHeight * u' + | States.Add lh -> float typeface.LineHeight * u' + lh let h' = round(h'' * scaling) / scaling let h' = max h' 1.0 @@ -253,104 +240,94 @@ let AllocateFramebuffer w h scale = let pxsize = PixelSize(int <| (w * scale), int <| (h * scale)) new RenderTargetBitmap(pxsize, Vector(96.0 * scale, 96.0 * scale)) -let SetOpacity (paint: SKPaint) (opacity: float) = - paint.Color <- paint.Color.WithAlpha(byte <| opacity * 255.0) - -let SetForegroundBrush(fgpaint: SKPaint, c: Color, fontFace: SKTypeface, fontSize: float) = - fgpaint.Color <- c.ToSKColor() - fgpaint.Typeface <- fontFace - fgpaint.TextSize <- single fontSize - fgpaint.IsAntialias <- States.font_antialias - fgpaint.IsAutohinted <- States.font_autohint - fgpaint.IsLinearText <- false - fgpaint.HintingLevel <- States.font_hintLevel - fgpaint.LcdRenderText <- false // see #125, #132 - fgpaint.SubpixelText <- States.font_subpixel - fgpaint.TextAlign <- SKTextAlign.Left - fgpaint.TextEncoding <- SKTextEncoding.Utf16 - () - -let RenderText (ctx: IDrawingContextImpl, region: Rect, scale: float, fg: SKPaint, bg: SKPaint, sp: SKPaint, underline: bool, undercurl: bool, text: string, shaper: SKShaper ValueOption) = - - // don't clip all along. see #60 +let UpdateOpacity (color: Color) opacity = + Color(byte(255.0 * opacity), color.R, color.G, color.B) - // DrawText accepts the coordinate of the baseline. - let region' = region - let region = region.ToSKRect() +let mutable _render_glyph_buf = [||] - // DrawText accepts the coordinate of the baseline. - // h = [padding space 1] + above baseline | below baseline + [padding space 2] - let h = region.Bottom - region.Top - // total_padding = padding space 1 + padding space 2 - let total_padding = h - ((fg.FontMetrics.Bottom - fg.FontMetrics.Top)) - let baseline = region.Top + ceil((total_padding / 2.0f) - fg.FontMetrics.Top) - (*printfn "scale=%A pad=%A base=%A region=%A" scale total_padding baseline region*) - let fontPos = SKPoint(region.Left, baseline) +let _render_brush = SolidColorBrush() +let _sp_brush = SolidColorBrush() +let _sp_pen = Pen(_sp_brush) +let _sp_points = ResizeArray() - let skia = ctx :?> ISkiaDrawingContextImpl +[] +type TextRenderSpan = +| Shaped of chars: ReadOnlyMemory +| Unshaped of runes: ReadOnlyMemory - //lol wat?? - //fg.Shader <- SKShader.CreateCompose(SKShader.CreateColor(fg.Color), SKShader.CreatePerlinNoiseFractalNoise(0.1F, 0.1F, 1, 6.41613F)) +let RenderText (ctx: IDrawingContextImpl, region: Rect, scale: float, fg: Color, bg: Color, sp: Color, underline: bool, undercurl: bool, text: TextRenderSpan, font: Typeface, fontSize: float) = - // push clip and fill bg - let _clearColor = Avalonia.Media.Color(bg.Color.Alpha, bg.Color.Red, bg.Color.Green, bg.Color.Blue) - skia.PushClip region' - skia.Clear _clearColor - skia.PopClip () + let glyphTypeface = font.GlyphTypeface + let px_per_unit = fontSize / float glyphTypeface.DesignEmHeight - if not <| String.IsNullOrWhiteSpace text then - if shaper.IsSome then - skia.SkCanvas.DrawShapedText(shaper.Value, text.TrimEnd(), single fontPos.X, single fontPos.Y, fg) - else - skia.SkCanvas.DrawText(text.TrimEnd(), fontPos, fg) + // h = [padding space 1] + above baseline | below baseline + [padding space 2] + let h = region.Bottom - region.Top + // fh = [above baseline + below baseline] + let fh = float (glyphTypeface.Descent - glyphTypeface.Ascent) * px_per_unit + // total_padding = padding space 1 + padding space 2 + let total_padding = h - fh + let ascent = float glyphTypeface.Ascent * px_per_unit + // Text drawing is done at the coordinate of the baseline. + let baseline = region.Top + ceil((total_padding / 2.0) - ascent) + (*printfn "scale=%A pad=%A base=%A region=%A" scale total_padding baseline region*) + let fontPos = Point(region.Left, baseline) - // Text bounding box drawing: - // -------------------------------------------------- + // push clip and fill bg + ctx.PushClip region + ctx.Clear bg + // don't clip all along. see #60 + ctx.PopClip () + + use glyphrun = + match text with + | Unshaped runes -> + if _render_glyph_buf.Length < runes.Length then + _render_glyph_buf <- Array.zeroCreate runes.Length + for i in 0..runes.Length-1 do + _render_glyph_buf.[i] <- glyphTypeface.GetGlyph(runes.Span.[i]) + let slice = ReadOnlyMemory(_render_glyph_buf, 0, runes.Length) + new GlyphRun(glyphTypeface, fontSize, Utilities.ReadOnlySlice(slice)) + | Shaped chars -> + let slice = Utilities.ReadOnlySlice(chars) + TextShaper.Current.ShapeText(slice, font, fontSize, CultureInfo.CurrentCulture) + + _render_brush.Color <- fg + + ctx.DrawGlyphRun(_render_brush, glyphrun, fontPos) + + // Text bounding box drawing: if States.font_drawBounds then - let mutable bounds = SKRect() - let text = if String.IsNullOrEmpty text then " " else text - ignore <| fg.MeasureText(text, &bounds) - bounds.Left <- bounds.Left + single (fontPos.X) - bounds.Top <- bounds.Top + single (fontPos.Y) - bounds.Right <- bounds.Right + single (fontPos.X) - bounds.Bottom <- bounds.Bottom + single (fontPos.Y) - fg.Style <- SKPaintStyle.Stroke - skia.SkCanvas.DrawRect(bounds, fg) - // -------------------------------------------------- - - let sp_thickness = fg.FontMetrics.UnderlineThickness.GetValueOrDefault(1.0F) + ctx.DrawRectangle(Brushes.Transparent, Pen(_render_brush), RoundedRect(Rect(glyphrun.Bounds.TopLeft + region.TopLeft, glyphrun.Bounds.BottomRight + region.TopLeft))) + let sp_thickness = float glyphTypeface.UnderlineThickness * px_per_unit + let underline_pos = float glyphTypeface.UnderlinePosition * px_per_unit + _sp_pen.Thickness <- sp_thickness + _sp_brush.Color <- sp + if underline then - let underline_pos = fg.FontMetrics.UnderlinePosition.GetValueOrDefault() - let p1 = fontPos + SKPoint(0.0f, underline_pos) - let p2 = p1 + SKPoint(region.Width, 0.0f) - sp.Style <- SKPaintStyle.Stroke - //sppaint.StrokeWidth <- sp_thickness - skia.SkCanvas.DrawLine(p1, p2, sp) + let p1 = fontPos + Point(0.0, underline_pos) + let p2 = p1 + Point(region.Width, 0.0) + ctx.DrawLine(_sp_pen, p1, p2) if undercurl then - let underline_pos = fg.FontMetrics.UnderlinePosition.GetValueOrDefault() - let mutable px, py = single fontPos.X, single fontPos.Y - py <- py + underline_pos - let qf = 1.5F - let hf = qf * 2.0F - let q3f = qf * 3.0F - let ff = qf * 4.0F - let r = single region.Right - let py1 = py - 2.0f - let py2 = py + 2.0f - sp.Style <- SKPaintStyle.Stroke - sp.StrokeWidth <- sp_thickness - use path = new SKPath() - path.MoveTo(px, py) - while px < r do - path.LineTo(px, py) - path.LineTo(px + qf, py1) - path.LineTo(px + hf, py) - path.LineTo(px + q3f, py2) - px <- px + ff - skia.SkCanvas.DrawPath(path , sp) + let mutable p = fontPos + Point(0.0, underline_pos) + let qf = 1.5 + let hf = qf * 2.0 + let q3f = qf * 3.0 + let v1 = Point(qf, -2.0) + let v2 = Point(hf, 0.0) + let v3 = Point(q3f, 2.0) + let ff = Point(qf * 4.0, 0.0) + let r = region.Right + _sp_points.Clear() + while p.X < r do + _sp_points.Add(p) + _sp_points.Add(p + v1) + _sp_points.Add(p + v2) + _sp_points.Add(p + v3) + p <- p + ff + ctx.DrawGeometry(Brushes.Transparent, _sp_pen, PolylineGeometry(_sp_points, false).PlatformImpl) type WindowBackgroundComposition = | SolidBackground of opacity: float * color: Color diff --git a/wcwidth.fs b/wcwidth.fs index c3d3a58..10c6e72 100644 --- a/wcwidth.fs +++ b/wcwidth.fs @@ -11,289 +11,289 @@ open def // From https://github.com/jquast/wcwidth/blob/master/wcwidth/table_zero.py // at commit 0d7de112202cc8b2ebe9232ff4a5c954f19d561a (2016-07-02): let ZeroWidth = [| - (0x0300, 0x036f) // Combining Grave Accent ..Combining Latin Small Le - (0x0483, 0x0489) // Combining Cyrillic Titlo..Combining Cyrillic Milli - (0x0591, 0x05bd) // Hebrew Accent Etnahta ..Hebrew Point Meteg - (0x05bf, 0x05bf) // Hebrew Point Rafe ..Hebrew Point Rafe - (0x05c1, 0x05c2) // Hebrew Point Shin Dot ..Hebrew Point Sin Dot - (0x05c4, 0x05c5) // Hebrew Mark Upper Dot ..Hebrew Mark Lower Dot - (0x05c7, 0x05c7) // Hebrew Point Qamats Qata..Hebrew Point Qamats Qata - (0x0610, 0x061a) // Arabic Sign Sallallahou ..Arabic Small Kasra - (0x064b, 0x065f) // Arabic Fathatan ..Arabic Wavy Hamza Below - (0x0670, 0x0670) // Arabic Letter Superscrip..Arabic Letter Superscrip - (0x06d6, 0x06dc) // Arabic Small High Ligatu..Arabic Small High Seen - (0x06df, 0x06e4) // Arabic Small High Rounde..Arabic Small High Madda - (0x06e7, 0x06e8) // Arabic Small High Yeh ..Arabic Small High Noon - (0x06ea, 0x06ed) // Arabic Empty Centre Low ..Arabic Small Low Meem - (0x0711, 0x0711) // Syriac Letter Superscrip..Syriac Letter Superscrip - (0x0730, 0x074a) // Syriac Pthaha Above ..Syriac Barrekh - (0x07a6, 0x07b0) // Thaana Abafili ..Thaana Sukun - (0x07eb, 0x07f3) // Nko Combining Sh||t High..Nko Combining Double Dot - (0x0816, 0x0819) // Samaritan Mark In ..Samaritan Mark Dagesh - (0x081b, 0x0823) // Samaritan Mark Epentheti..Samaritan Vowel Sign A - (0x0825, 0x0827) // Samaritan Vowel Sign Sho..Samaritan Vowel Sign U - (0x0829, 0x082d) // Samaritan Vowel Sign Lon..Samaritan Mark Nequdaa - (0x0859, 0x085b) // Mandaic Affrication Mark..Mandaic Gemination Mark - (0x08d4, 0x08e1) // (nil) .. - (0x08e3, 0x0902) // Arabic Turned Damma Belo..Devanagari Sign Anusvara - (0x093a, 0x093a) // Devanagari Vowel Sign Oe..Devanagari Vowel Sign Oe - (0x093c, 0x093c) // Devanagari Sign Nukta ..Devanagari Sign Nukta - (0x0941, 0x0948) // Devanagari Vowel Sign U ..Devanagari Vowel Sign Ai - (0x094d, 0x094d) // Devanagari Sign Virama ..Devanagari Sign Virama - (0x0951, 0x0957) // Devanagari Stress Sign U..Devanagari Vowel Sign Uu - (0x0962, 0x0963) // Devanagari Vowel Sign Vo..Devanagari Vowel Sign Vo - (0x0981, 0x0981) // Bengali Sign Candrabindu..Bengali Sign Candrabindu - (0x09bc, 0x09bc) // Bengali Sign Nukta ..Bengali Sign Nukta - (0x09c1, 0x09c4) // Bengali Vowel Sign U ..Bengali Vowel Sign Vocal - (0x09cd, 0x09cd) // Bengali Sign Virama ..Bengali Sign Virama - (0x09e2, 0x09e3) // Bengali Vowel Sign Vocal..Bengali Vowel Sign Vocal - (0x0a01, 0x0a02) // Gurmukhi Sign Adak Bindi..Gurmukhi Sign Bindi - (0x0a3c, 0x0a3c) // Gurmukhi Sign Nukta ..Gurmukhi Sign Nukta - (0x0a41, 0x0a42) // Gurmukhi Vowel Sign U ..Gurmukhi Vowel Sign Uu - (0x0a47, 0x0a48) // Gurmukhi Vowel Sign Ee ..Gurmukhi Vowel Sign Ai - (0x0a4b, 0x0a4d) // Gurmukhi Vowel Sign Oo ..Gurmukhi Sign Virama - (0x0a51, 0x0a51) // Gurmukhi Sign Udaat ..Gurmukhi Sign Udaat - (0x0a70, 0x0a71) // Gurmukhi Tippi ..Gurmukhi Addak - (0x0a75, 0x0a75) // Gurmukhi Sign Yakash ..Gurmukhi Sign Yakash - (0x0a81, 0x0a82) // Gujarati Sign Candrabind..Gujarati Sign Anusvara - (0x0abc, 0x0abc) // Gujarati Sign Nukta ..Gujarati Sign Nukta - (0x0ac1, 0x0ac5) // Gujarati Vowel Sign U ..Gujarati Vowel Sign Cand - (0x0ac7, 0x0ac8) // Gujarati Vowel Sign E ..Gujarati Vowel Sign Ai - (0x0acd, 0x0acd) // Gujarati Sign Virama ..Gujarati Sign Virama - (0x0ae2, 0x0ae3) // Gujarati Vowel Sign Voca..Gujarati Vowel Sign Voca - (0x0b01, 0x0b01) // ||iya Sign Candrabindu ..||iya Sign Candrabindu - (0x0b3c, 0x0b3c) // ||iya Sign Nukta ..||iya Sign Nukta - (0x0b3f, 0x0b3f) // ||iya Vowel Sign I ..||iya Vowel Sign I - (0x0b41, 0x0b44) // ||iya Vowel Sign U ..||iya Vowel Sign Vocalic - (0x0b4d, 0x0b4d) // ||iya Sign Virama ..||iya Sign Virama - (0x0b56, 0x0b56) // ||iya Ai Length Mark ..||iya Ai Length Mark - (0x0b62, 0x0b63) // ||iya Vowel Sign Vocalic..||iya Vowel Sign Vocalic - (0x0b82, 0x0b82) // Tamil Sign Anusvara ..Tamil Sign Anusvara - (0x0bc0, 0x0bc0) // Tamil Vowel Sign Ii ..Tamil Vowel Sign Ii - (0x0bcd, 0x0bcd) // Tamil Sign Virama ..Tamil Sign Virama - (0x0c00, 0x0c00) // Telugu Sign Combining Ca..Telugu Sign Combining Ca - (0x0c3e, 0x0c40) // Telugu Vowel Sign Aa ..Telugu Vowel Sign Ii - (0x0c46, 0x0c48) // Telugu Vowel Sign E ..Telugu Vowel Sign Ai - (0x0c4a, 0x0c4d) // Telugu Vowel Sign O ..Telugu Sign Virama - (0x0c55, 0x0c56) // Telugu Length Mark ..Telugu Ai Length Mark - (0x0c62, 0x0c63) // Telugu Vowel Sign Vocali..Telugu Vowel Sign Vocali - (0x0c81, 0x0c81) // Kannada Sign Candrabindu..Kannada Sign Candrabindu - (0x0cbc, 0x0cbc) // Kannada Sign Nukta ..Kannada Sign Nukta - (0x0cbf, 0x0cbf) // Kannada Vowel Sign I ..Kannada Vowel Sign I - (0x0cc6, 0x0cc6) // Kannada Vowel Sign E ..Kannada Vowel Sign E - (0x0ccc, 0x0ccd) // Kannada Vowel Sign Au ..Kannada Sign Virama - (0x0ce2, 0x0ce3) // Kannada Vowel Sign Vocal..Kannada Vowel Sign Vocal - (0x0d01, 0x0d01) // Malayalam Sign Candrabin..Malayalam Sign Candrabin - (0x0d41, 0x0d44) // Malayalam Vowel Sign U ..Malayalam Vowel Sign Voc - (0x0d4d, 0x0d4d) // Malayalam Sign Virama ..Malayalam Sign Virama - (0x0d62, 0x0d63) // Malayalam Vowel Sign Voc..Malayalam Vowel Sign Voc - (0x0dca, 0x0dca) // Sinhala Sign Al-lakuna ..Sinhala Sign Al-lakuna - (0x0dd2, 0x0dd4) // Sinhala Vowel Sign Ketti..Sinhala Vowel Sign Ketti - (0x0dd6, 0x0dd6) // Sinhala Vowel Sign Diga ..Sinhala Vowel Sign Diga - (0x0e31, 0x0e31) // Thai Character Mai Han-a..Thai Character Mai Han-a - (0x0e34, 0x0e3a) // Thai Character Sara I ..Thai Character Phinthu - (0x0e47, 0x0e4e) // Thai Character Maitaikhu..Thai Character Yamakkan - (0x0eb1, 0x0eb1) // Lao Vowel Sign Mai Kan ..Lao Vowel Sign Mai Kan - (0x0eb4, 0x0eb9) // Lao Vowel Sign I ..Lao Vowel Sign Uu - (0x0ebb, 0x0ebc) // Lao Vowel Sign Mai Kon ..Lao Semivowel Sign Lo - (0x0ec8, 0x0ecd) // Lao Tone Mai Ek ..Lao Niggahita - (0x0f18, 0x0f19) // Tibetan Astrological Sig..Tibetan Astrological Sig - (0x0f35, 0x0f35) // Tibetan Mark Ngas Bzung ..Tibetan Mark Ngas Bzung - (0x0f37, 0x0f37) // Tibetan Mark Ngas Bzung ..Tibetan Mark Ngas Bzung - (0x0f39, 0x0f39) // Tibetan Mark Tsa -phru ..Tibetan Mark Tsa -phru - (0x0f71, 0x0f7e) // Tibetan Vowel Sign Aa ..Tibetan Sign Rjes Su Nga - (0x0f80, 0x0f84) // Tibetan Vowel Sign Rever..Tibetan Mark Halanta - (0x0f86, 0x0f87) // Tibetan Sign Lci Rtags ..Tibetan Sign Yang Rtags - (0x0f8d, 0x0f97) // Tibetan Subjoined Sign L..Tibetan Subjoined Letter - (0x0f99, 0x0fbc) // Tibetan Subjoined Letter..Tibetan Subjoined Letter - (0x0fc6, 0x0fc6) // Tibetan Symbol Padma Gda..Tibetan Symbol Padma Gda - (0x102d, 0x1030) // Myanmar Vowel Sign I ..Myanmar Vowel Sign Uu - (0x1032, 0x1037) // Myanmar Vowel Sign Ai ..Myanmar Sign Dot Below - (0x1039, 0x103a) // Myanmar Sign Virama ..Myanmar Sign Asat - (0x103d, 0x103e) // Myanmar Consonant Sign M..Myanmar Consonant Sign M - (0x1058, 0x1059) // Myanmar Vowel Sign Vocal..Myanmar Vowel Sign Vocal - (0x105e, 0x1060) // Myanmar Consonant Sign M..Myanmar Consonant Sign M - (0x1071, 0x1074) // Myanmar Vowel Sign Geba ..Myanmar Vowel Sign Kayah - (0x1082, 0x1082) // Myanmar Consonant Sign S..Myanmar Consonant Sign S - (0x1085, 0x1086) // Myanmar Vowel Sign Shan ..Myanmar Vowel Sign Shan - (0x108d, 0x108d) // Myanmar Sign Shan Counci..Myanmar Sign Shan Counci - (0x109d, 0x109d) // Myanmar Vowel Sign Aiton..Myanmar Vowel Sign Aiton - (0x135d, 0x135f) // Ethiopic Combining Gemin..Ethiopic Combining Gemin - (0x1712, 0x1714) // Tagalog Vowel Sign I ..Tagalog Sign Virama - (0x1732, 0x1734) // Hanunoo Vowel Sign I ..Hanunoo Sign Pamudpod - (0x1752, 0x1753) // Buhid Vowel Sign I ..Buhid Vowel Sign U - (0x1772, 0x1773) // Tagbanwa Vowel Sign I ..Tagbanwa Vowel Sign U - (0x17b4, 0x17b5) // Khmer Vowel Inherent Aq ..Khmer Vowel Inherent Aa - (0x17b7, 0x17bd) // Khmer Vowel Sign I ..Khmer Vowel Sign Ua - (0x17c6, 0x17c6) // Khmer Sign Nikahit ..Khmer Sign Nikahit - (0x17c9, 0x17d3) // Khmer Sign Muusikatoan ..Khmer Sign Bathamasat - (0x17dd, 0x17dd) // Khmer Sign Atthacan ..Khmer Sign Atthacan - (0x180b, 0x180d) // Mongolian Free Variation..Mongolian Free Variation - (0x1885, 0x1886) // Mongolian Letter Ali Gal..Mongolian Letter Ali Gal - (0x18a9, 0x18a9) // Mongolian Letter Ali Gal..Mongolian Letter Ali Gal - (0x1920, 0x1922) // Limbu Vowel Sign A ..Limbu Vowel Sign U - (0x1927, 0x1928) // Limbu Vowel Sign E ..Limbu Vowel Sign O - (0x1932, 0x1932) // Limbu Small Letter Anusv..Limbu Small Letter Anusv - (0x1939, 0x193b) // Limbu Sign Mukphreng ..Limbu Sign Sa-i - (0x1a17, 0x1a18) // Buginese Vowel Sign I ..Buginese Vowel Sign U - (0x1a1b, 0x1a1b) // Buginese Vowel Sign Ae ..Buginese Vowel Sign Ae - (0x1a56, 0x1a56) // Tai Tham Consonant Sign ..Tai Tham Consonant Sign - (0x1a58, 0x1a5e) // Tai Tham Sign Mai Kang L..Tai Tham Consonant Sign - (0x1a60, 0x1a60) // Tai Tham Sign Sakot ..Tai Tham Sign Sakot - (0x1a62, 0x1a62) // Tai Tham Vowel Sign Mai ..Tai Tham Vowel Sign Mai - (0x1a65, 0x1a6c) // Tai Tham Vowel Sign I ..Tai Tham Vowel Sign Oa B - (0x1a73, 0x1a7c) // Tai Tham Vowel Sign Oa A..Tai Tham Sign Khuen-lue - (0x1a7f, 0x1a7f) // Tai Tham Combining Crypt..Tai Tham Combining Crypt - (0x1ab0, 0x1abe) // Combining Doubled Circum..Combining Parentheses Ov - (0x1b00, 0x1b03) // Balinese Sign Ulu Ricem ..Balinese Sign Surang - (0x1b34, 0x1b34) // Balinese Sign Rerekan ..Balinese Sign Rerekan - (0x1b36, 0x1b3a) // Balinese Vowel Sign Ulu ..Balinese Vowel Sign Ra R - (0x1b3c, 0x1b3c) // Balinese Vowel Sign La L..Balinese Vowel Sign La L - (0x1b42, 0x1b42) // Balinese Vowel Sign Pepe..Balinese Vowel Sign Pepe - (0x1b6b, 0x1b73) // Balinese Musical Symbol ..Balinese Musical Symbol - (0x1b80, 0x1b81) // Sundanese Sign Panyecek ..Sundanese Sign Panglayar - (0x1ba2, 0x1ba5) // Sundanese Consonant Sign..Sundanese Vowel Sign Pan - (0x1ba8, 0x1ba9) // Sundanese Vowel Sign Pam..Sundanese Vowel Sign Pan - (0x1bab, 0x1bad) // Sundanese Sign Virama ..Sundanese Consonant Sign - (0x1be6, 0x1be6) // Batak Sign Tompi ..Batak Sign Tompi - (0x1be8, 0x1be9) // Batak Vowel Sign Pakpak ..Batak Vowel Sign Ee - (0x1bed, 0x1bed) // Batak Vowel Sign Karo O ..Batak Vowel Sign Karo O - (0x1bef, 0x1bf1) // Batak Vowel Sign U F|| S..Batak Consonant Sign H - (0x1c2c, 0x1c33) // Lepcha Vowel Sign E ..Lepcha Consonant Sign T - (0x1c36, 0x1c37) // Lepcha Sign Ran ..Lepcha Sign Nukta - (0x1cd0, 0x1cd2) // Vedic Tone Karshana ..Vedic Tone Prenkha - (0x1cd4, 0x1ce0) // Vedic Sign Yajurvedic Mi..Vedic Tone Rigvedic Kash - (0x1ce2, 0x1ce8) // Vedic Sign Visarga Svari..Vedic Sign Visarga Anuda - (0x1ced, 0x1ced) // Vedic Sign Tiryak ..Vedic Sign Tiryak - (0x1cf4, 0x1cf4) // Vedic Tone Candra Above ..Vedic Tone Candra Above - (0x1cf8, 0x1cf9) // Vedic Tone Ring Above ..Vedic Tone Double Ring A - (0x1dc0, 0x1df5) // Combining Dotted Grave A..Combining Up Tack Above - (0x1dfb, 0x1dff) // (nil) ..Combining Right Arrowhea - (0x20d0, 0x20f0) // Combining Left Harpoon A..Combining Asterisk Above - (0x2cef, 0x2cf1) // Coptic Combining Ni Abov..Coptic Combining Spiritu - (0x2d7f, 0x2d7f) // Tifinagh Consonant Joine..Tifinagh Consonant Joine - (0x2de0, 0x2dff) // Combining Cyrillic Lette..Combining Cyrillic Lette - (0x302a, 0x302d) // Ideographic Level Tone M..Ideographic Entering Ton - (0x3099, 0x309a) // Combining Katakana-hirag..Combining Katakana-hirag - (0xa66f, 0xa672) // Combining Cyrillic Vzmet..Combining Cyrillic Thous - (0xa674, 0xa67d) // Combining Cyrillic Lette..Combining Cyrillic Payer - (0xa69e, 0xa69f) // Combining Cyrillic Lette..Combining Cyrillic Lette - (0xa6f0, 0xa6f1) // Bamum Combining Mark Koq..Bamum Combining Mark Tuk - (0xa802, 0xa802) // Syloti Nagri Sign Dvisva..Syloti Nagri Sign Dvisva - (0xa806, 0xa806) // Syloti Nagri Sign Hasant..Syloti Nagri Sign Hasant - (0xa80b, 0xa80b) // Syloti Nagri Sign Anusva..Syloti Nagri Sign Anusva - (0xa825, 0xa826) // Syloti Nagri Vowel Sign ..Syloti Nagri Vowel Sign - (0xa8c4, 0xa8c5) // Saurashtra Sign Virama .. - (0xa8e0, 0xa8f1) // Combining Devanagari Dig..Combining Devanagari Sig - (0xa926, 0xa92d) // Kayah Li Vowel Ue ..Kayah Li Tone Calya Plop - (0xa947, 0xa951) // Rejang Vowel Sign I ..Rejang Consonant Sign R - (0xa980, 0xa982) // Javanese Sign Panyangga ..Javanese Sign Layar - (0xa9b3, 0xa9b3) // Javanese Sign Cecak Telu..Javanese Sign Cecak Telu - (0xa9b6, 0xa9b9) // Javanese Vowel Sign Wulu..Javanese Vowel Sign Suku - (0xa9bc, 0xa9bc) // Javanese Vowel Sign Pepe..Javanese Vowel Sign Pepe - (0xa9e5, 0xa9e5) // Myanmar Sign Shan Saw ..Myanmar Sign Shan Saw - (0xaa29, 0xaa2e) // Cham Vowel Sign Aa ..Cham Vowel Sign Oe - (0xaa31, 0xaa32) // Cham Vowel Sign Au ..Cham Vowel Sign Ue - (0xaa35, 0xaa36) // Cham Consonant Sign La ..Cham Consonant Sign Wa - (0xaa43, 0xaa43) // Cham Consonant Sign Fina..Cham Consonant Sign Fina - (0xaa4c, 0xaa4c) // Cham Consonant Sign Fina..Cham Consonant Sign Fina - (0xaa7c, 0xaa7c) // Myanmar Sign Tai Laing T..Myanmar Sign Tai Laing T - (0xaab0, 0xaab0) // Tai Viet Mai Kang ..Tai Viet Mai Kang - (0xaab2, 0xaab4) // Tai Viet Vowel I ..Tai Viet Vowel U - (0xaab7, 0xaab8) // Tai Viet Mai Khit ..Tai Viet Vowel Ia - (0xaabe, 0xaabf) // Tai Viet Vowel Am ..Tai Viet Tone Mai Ek - (0xaac1, 0xaac1) // Tai Viet Tone Mai Tho ..Tai Viet Tone Mai Tho - (0xaaec, 0xaaed) // Meetei Mayek Vowel Sign ..Meetei Mayek Vowel Sign - (0xaaf6, 0xaaf6) // Meetei Mayek Virama ..Meetei Mayek Virama - (0xabe5, 0xabe5) // Meetei Mayek Vowel Sign ..Meetei Mayek Vowel Sign - (0xabe8, 0xabe8) // Meetei Mayek Vowel Sign ..Meetei Mayek Vowel Sign - (0xabed, 0xabed) // Meetei Mayek Apun Iyek ..Meetei Mayek Apun Iyek - (0xfb1e, 0xfb1e) // Hebrew Point Judeo-spani..Hebrew Point Judeo-spani - (0xfe00, 0xfe0f) // Variation Select||-1 ..Variation Select||-16 - (0xfe20, 0xfe2f) // Combining Ligature Left ..Combining Cyrillic Titlo - (0x101fd, 0x101fd) // Phaistos Disc Sign Combi..Phaistos Disc Sign Combi - (0x102e0, 0x102e0) // Coptic Epact Thousands M..Coptic Epact Thousands M - (0x10376, 0x1037a) // Combining Old Permic Let..Combining Old Permic Let - (0x10a01, 0x10a03) // Kharoshthi Vowel Sign I ..Kharoshthi Vowel Sign Vo - (0x10a05, 0x10a06) // Kharoshthi Vowel Sign E ..Kharoshthi Vowel Sign O - (0x10a0c, 0x10a0f) // Kharoshthi Vowel Length ..Kharoshthi Sign Visarga - (0x10a38, 0x10a3a) // Kharoshthi Sign Bar Abov..Kharoshthi Sign Dot Belo - (0x10a3f, 0x10a3f) // Kharoshthi Virama ..Kharoshthi Virama - (0x10ae5, 0x10ae6) // Manichaean Abbreviation ..Manichaean Abbreviation - (0x11001, 0x11001) // Brahmi Sign Anusvara ..Brahmi Sign Anusvara - (0x11038, 0x11046) // Brahmi Vowel Sign Aa ..Brahmi Virama - (0x1107f, 0x11081) // Brahmi Number Joiner ..Kaithi Sign Anusvara - (0x110b3, 0x110b6) // Kaithi Vowel Sign U ..Kaithi Vowel Sign Ai - (0x110b9, 0x110ba) // Kaithi Sign Virama ..Kaithi Sign Nukta - (0x11100, 0x11102) // Chakma Sign Candrabindu ..Chakma Sign Visarga - (0x11127, 0x1112b) // Chakma Vowel Sign A ..Chakma Vowel Sign Uu - (0x1112d, 0x11134) // Chakma Vowel Sign Ai ..Chakma Maayyaa - (0x11173, 0x11173) // Mahajani Sign Nukta ..Mahajani Sign Nukta - (0x11180, 0x11181) // Sharada Sign Candrabindu..Sharada Sign Anusvara - (0x111b6, 0x111be) // Sharada Vowel Sign U ..Sharada Vowel Sign O - (0x111ca, 0x111cc) // Sharada Sign Nukta ..Sharada Extra Sh||t Vowe - (0x1122f, 0x11231) // Khojki Vowel Sign U ..Khojki Vowel Sign Ai - (0x11234, 0x11234) // Khojki Sign Anusvara ..Khojki Sign Anusvara - (0x11236, 0x11237) // Khojki Sign Nukta ..Khojki Sign Shadda - (0x1123e, 0x1123e) // (nil) .. - (0x112df, 0x112df) // Khudawadi Sign Anusvara ..Khudawadi Sign Anusvara - (0x112e3, 0x112ea) // Khudawadi Vowel Sign U ..Khudawadi Sign Virama - (0x11300, 0x11301) // Grantha Sign Combining A..Grantha Sign Candrabindu - (0x1133c, 0x1133c) // Grantha Sign Nukta ..Grantha Sign Nukta - (0x11340, 0x11340) // Grantha Vowel Sign Ii ..Grantha Vowel Sign Ii - (0x11366, 0x1136c) // Combining Grantha Digit ..Combining Grantha Digit - (0x11370, 0x11374) // Combining Grantha Letter..Combining Grantha Letter - (0x11438, 0x1143f) // (nil) .. - (0x11442, 0x11444) // (nil) .. - (0x11446, 0x11446) // (nil) .. - (0x114b3, 0x114b8) // Tirhuta Vowel Sign U ..Tirhuta Vowel Sign Vocal - (0x114ba, 0x114ba) // Tirhuta Vowel Sign Sh||t..Tirhuta Vowel Sign Sh||t - (0x114bf, 0x114c0) // Tirhuta Sign Candrabindu..Tirhuta Sign Anusvara - (0x114c2, 0x114c3) // Tirhuta Sign Virama ..Tirhuta Sign Nukta - (0x115b2, 0x115b5) // Siddham Vowel Sign U ..Siddham Vowel Sign Vocal - (0x115bc, 0x115bd) // Siddham Sign Candrabindu..Siddham Sign Anusvara - (0x115bf, 0x115c0) // Siddham Sign Virama ..Siddham Sign Nukta - (0x115dc, 0x115dd) // Siddham Vowel Sign Alter..Siddham Vowel Sign Alter - (0x11633, 0x1163a) // Modi Vowel Sign U ..Modi Vowel Sign Ai - (0x1163d, 0x1163d) // Modi Sign Anusvara ..Modi Sign Anusvara - (0x1163f, 0x11640) // Modi Sign Virama ..Modi Sign Ardhacandra - (0x116ab, 0x116ab) // Takri Sign Anusvara ..Takri Sign Anusvara - (0x116ad, 0x116ad) // Takri Vowel Sign Aa ..Takri Vowel Sign Aa - (0x116b0, 0x116b5) // Takri Vowel Sign U ..Takri Vowel Sign Au - (0x116b7, 0x116b7) // Takri Sign Nukta ..Takri Sign Nukta - (0x1171d, 0x1171f) // Ahom Consonant Sign Medi..Ahom Consonant Sign Medi - (0x11722, 0x11725) // Ahom Vowel Sign I ..Ahom Vowel Sign Uu - (0x11727, 0x1172b) // Ahom Vowel Sign Aw ..Ahom Sign Killer - (0x11c30, 0x11c36) // (nil) .. - (0x11c38, 0x11c3d) // (nil) .. - (0x11c3f, 0x11c3f) // (nil) .. - (0x11c92, 0x11ca7) // (nil) .. - (0x11caa, 0x11cb0) // (nil) .. - (0x11cb2, 0x11cb3) // (nil) .. - (0x11cb5, 0x11cb6) // (nil) .. - (0x16af0, 0x16af4) // Bassa Vah Combining High..Bassa Vah Combining High - (0x16b30, 0x16b36) // Pahawh Hmong Mark Cim Tu..Pahawh Hmong Mark Cim Ta - (0x16f8f, 0x16f92) // Miao Tone Right ..Miao Tone Below - (0x1bc9d, 0x1bc9e) // Duployan Thick Letter Se..Duployan Double Mark - (0x1d167, 0x1d169) // Musical Symbol Combining..Musical Symbol Combining - (0x1d17b, 0x1d182) // Musical Symbol Combining..Musical Symbol Combining - (0x1d185, 0x1d18b) // Musical Symbol Combining..Musical Symbol Combining - (0x1d1aa, 0x1d1ad) // Musical Symbol Combining..Musical Symbol Combining - (0x1d242, 0x1d244) // Combining Greek Musical ..Combining Greek Musical - (0x1da00, 0x1da36) // Signwriting Head Rim ..Signwriting Air Sucking - (0x1da3b, 0x1da6c) // Signwriting Mouth Closed..Signwriting Excitement - (0x1da75, 0x1da75) // Signwriting Upper Body T..Signwriting Upper Body T - (0x1da84, 0x1da84) // Signwriting Location Hea..Signwriting Location Hea - (0x1da9b, 0x1da9f) // Signwriting Fill Modifie..Signwriting Fill Modifie - (0x1daa1, 0x1daaf) // Signwriting Rotation Mod..Signwriting Rotation Mod - (0x1e000, 0x1e006) // (nil) .. - (0x1e008, 0x1e018) // (nil) .. - (0x1e01b, 0x1e021) // (nil) .. - (0x1e023, 0x1e024) // (nil) .. - (0x1e026, 0x1e02a) // (nil) .. - (0x1e8d0, 0x1e8d6) // Mende Kikakui Combining ..Mende Kikakui Combining - (0x1e944, 0x1e94a) // (nil) .. - (0xe0100, 0xe01ef) // Variation Select||-17 ..Variation Select||-256 + (0x0300u, 0x036fu) // Combining Grave Accent ..Combining Latin Small Le + (0x0483u, 0x0489u) // Combining Cyrillic Titlo..Combining Cyrillic Milli + (0x0591u, 0x05bdu) // Hebrew Accent Etnahta ..Hebrew Point Meteg + (0x05bfu, 0x05bfu) // Hebrew Point Rafe ..Hebrew Point Rafe + (0x05c1u, 0x05c2u) // Hebrew Point Shin Dot ..Hebrew Point Sin Dot + (0x05c4u, 0x05c5u) // Hebrew Mark Upper Dot ..Hebrew Mark Lower Dot + (0x05c7u, 0x05c7u) // Hebrew Point Qamats Qata..Hebrew Point Qamats Qata + (0x0610u, 0x061au) // Arabic Sign Sallallahou ..Arabic Small Kasra + (0x064bu, 0x065fu) // Arabic Fathatan ..Arabic Wavy Hamza Below + (0x0670u, 0x0670u) // Arabic Letter Superscrip..Arabic Letter Superscrip + (0x06d6u, 0x06dcu) // Arabic Small High Ligatu..Arabic Small High Seen + (0x06dfu, 0x06e4u) // Arabic Small High Rounde..Arabic Small High Madda + (0x06e7u, 0x06e8u) // Arabic Small High Yeh ..Arabic Small High Noon + (0x06eau, 0x06edu) // Arabic Empty Centre Low ..Arabic Small Low Meem + (0x0711u, 0x0711u) // Syriac Letter Superscrip..Syriac Letter Superscrip + (0x0730u, 0x074au) // Syriac Pthaha Above ..Syriac Barrekh + (0x07a6u, 0x07b0u) // Thaana Abafili ..Thaana Sukun + (0x07ebu, 0x07f3u) // Nko Combining Sh||t High..Nko Combining Double Dot + (0x0816u, 0x0819u) // Samaritan Mark In ..Samaritan Mark Dagesh + (0x081bu, 0x0823u) // Samaritan Mark Epentheti..Samaritan Vowel Sign A + (0x0825u, 0x0827u) // Samaritan Vowel Sign Sho..Samaritan Vowel Sign U + (0x0829u, 0x082du) // Samaritan Vowel Sign Lon..Samaritan Mark Nequdaa + (0x0859u, 0x085bu) // Mandaic Affrication Mark..Mandaic Gemination Mark + (0x08d4u, 0x08e1u) // (nil) .. + (0x08e3u, 0x0902u) // Arabic Turned Damma Belo..Devanagari Sign Anusvara + (0x093au, 0x093au) // Devanagari Vowel Sign Oe..Devanagari Vowel Sign Oe + (0x093cu, 0x093cu) // Devanagari Sign Nukta ..Devanagari Sign Nukta + (0x0941u, 0x0948u) // Devanagari Vowel Sign U ..Devanagari Vowel Sign Ai + (0x094du, 0x094du) // Devanagari Sign Virama ..Devanagari Sign Virama + (0x0951u, 0x0957u) // Devanagari Stress Sign U..Devanagari Vowel Sign Uu + (0x0962u, 0x0963u) // Devanagari Vowel Sign Vo..Devanagari Vowel Sign Vo + (0x0981u, 0x0981u) // Bengali Sign Candrabindu..Bengali Sign Candrabindu + (0x09bcu, 0x09bcu) // Bengali Sign Nukta ..Bengali Sign Nukta + (0x09c1u, 0x09c4u) // Bengali Vowel Sign U ..Bengali Vowel Sign Vocal + (0x09cdu, 0x09cdu) // Bengali Sign Virama ..Bengali Sign Virama + (0x09e2u, 0x09e3u) // Bengali Vowel Sign Vocal..Bengali Vowel Sign Vocal + (0x0a01u, 0x0a02u) // Gurmukhi Sign Adak Bindi..Gurmukhi Sign Bindi + (0x0a3cu, 0x0a3cu) // Gurmukhi Sign Nukta ..Gurmukhi Sign Nukta + (0x0a41u, 0x0a42u) // Gurmukhi Vowel Sign U ..Gurmukhi Vowel Sign Uu + (0x0a47u, 0x0a48u) // Gurmukhi Vowel Sign Ee ..Gurmukhi Vowel Sign Ai + (0x0a4bu, 0x0a4du) // Gurmukhi Vowel Sign Oo ..Gurmukhi Sign Virama + (0x0a51u, 0x0a51u) // Gurmukhi Sign Udaat ..Gurmukhi Sign Udaat + (0x0a70u, 0x0a71u) // Gurmukhi Tippi ..Gurmukhi Addak + (0x0a75u, 0x0a75u) // Gurmukhi Sign Yakash ..Gurmukhi Sign Yakash + (0x0a81u, 0x0a82u) // Gujarati Sign Candrabind..Gujarati Sign Anusvara + (0x0abcu, 0x0abcu) // Gujarati Sign Nukta ..Gujarati Sign Nukta + (0x0ac1u, 0x0ac5u) // Gujarati Vowel Sign U ..Gujarati Vowel Sign Cand + (0x0ac7u, 0x0ac8u) // Gujarati Vowel Sign E ..Gujarati Vowel Sign Ai + (0x0acdu, 0x0acdu) // Gujarati Sign Virama ..Gujarati Sign Virama + (0x0ae2u, 0x0ae3u) // Gujarati Vowel Sign Voca..Gujarati Vowel Sign Voca + (0x0b01u, 0x0b01u) // ||iya Sign Candrabindu ..||iya Sign Candrabindu + (0x0b3cu, 0x0b3cu) // ||iya Sign Nukta ..||iya Sign Nukta + (0x0b3fu, 0x0b3fu) // ||iya Vowel Sign I ..||iya Vowel Sign I + (0x0b41u, 0x0b44u) // ||iya Vowel Sign U ..||iya Vowel Sign Vocalic + (0x0b4du, 0x0b4du) // ||iya Sign Virama ..||iya Sign Virama + (0x0b56u, 0x0b56u) // ||iya Ai Length Mark ..||iya Ai Length Mark + (0x0b62u, 0x0b63u) // ||iya Vowel Sign Vocalic..||iya Vowel Sign Vocalic + (0x0b82u, 0x0b82u) // Tamil Sign Anusvara ..Tamil Sign Anusvara + (0x0bc0u, 0x0bc0u) // Tamil Vowel Sign Ii ..Tamil Vowel Sign Ii + (0x0bcdu, 0x0bcdu) // Tamil Sign Virama ..Tamil Sign Virama + (0x0c00u, 0x0c00u) // Telugu Sign Combining Ca..Telugu Sign Combining Ca + (0x0c3eu, 0x0c40u) // Telugu Vowel Sign Aa ..Telugu Vowel Sign Ii + (0x0c46u, 0x0c48u) // Telugu Vowel Sign E ..Telugu Vowel Sign Ai + (0x0c4au, 0x0c4du) // Telugu Vowel Sign O ..Telugu Sign Virama + (0x0c55u, 0x0c56u) // Telugu Length Mark ..Telugu Ai Length Mark + (0x0c62u, 0x0c63u) // Telugu Vowel Sign Vocali..Telugu Vowel Sign Vocali + (0x0c81u, 0x0c81u) // Kannada Sign Candrabindu..Kannada Sign Candrabindu + (0x0cbcu, 0x0cbcu) // Kannada Sign Nukta ..Kannada Sign Nukta + (0x0cbfu, 0x0cbfu) // Kannada Vowel Sign I ..Kannada Vowel Sign I + (0x0cc6u, 0x0cc6u) // Kannada Vowel Sign E ..Kannada Vowel Sign E + (0x0cccu, 0x0ccdu) // Kannada Vowel Sign Au ..Kannada Sign Virama + (0x0ce2u, 0x0ce3u) // Kannada Vowel Sign Vocal..Kannada Vowel Sign Vocal + (0x0d01u, 0x0d01u) // Malayalam Sign Candrabin..Malayalam Sign Candrabin + (0x0d41u, 0x0d44u) // Malayalam Vowel Sign U ..Malayalam Vowel Sign Voc + (0x0d4du, 0x0d4du) // Malayalam Sign Virama ..Malayalam Sign Virama + (0x0d62u, 0x0d63u) // Malayalam Vowel Sign Voc..Malayalam Vowel Sign Voc + (0x0dcau, 0x0dcau) // Sinhala Sign Al-lakuna ..Sinhala Sign Al-lakuna + (0x0dd2u, 0x0dd4u) // Sinhala Vowel Sign Ketti..Sinhala Vowel Sign Ketti + (0x0dd6u, 0x0dd6u) // Sinhala Vowel Sign Diga ..Sinhala Vowel Sign Diga + (0x0e31u, 0x0e31u) // Thai Character Mai Han-a..Thai Character Mai Han-a + (0x0e34u, 0x0e3au) // Thai Character Sara I ..Thai Character Phinthu + (0x0e47u, 0x0e4eu) // Thai Character Maitaikhu..Thai Character Yamakkan + (0x0eb1u, 0x0eb1u) // Lao Vowel Sign Mai Kan ..Lao Vowel Sign Mai Kan + (0x0eb4u, 0x0eb9u) // Lao Vowel Sign I ..Lao Vowel Sign Uu + (0x0ebbu, 0x0ebcu) // Lao Vowel Sign Mai Kon ..Lao Semivowel Sign Lo + (0x0ec8u, 0x0ecdu) // Lao Tone Mai Ek ..Lao Niggahita + (0x0f18u, 0x0f19u) // Tibetan Astrological Sig..Tibetan Astrological Sig + (0x0f35u, 0x0f35u) // Tibetan Mark Ngas Bzung ..Tibetan Mark Ngas Bzung + (0x0f37u, 0x0f37u) // Tibetan Mark Ngas Bzung ..Tibetan Mark Ngas Bzung + (0x0f39u, 0x0f39u) // Tibetan Mark Tsa -phru ..Tibetan Mark Tsa -phru + (0x0f71u, 0x0f7eu) // Tibetan Vowel Sign Aa ..Tibetan Sign Rjes Su Nga + (0x0f80u, 0x0f84u) // Tibetan Vowel Sign Rever..Tibetan Mark Halanta + (0x0f86u, 0x0f87u) // Tibetan Sign Lci Rtags ..Tibetan Sign Yang Rtags + (0x0f8du, 0x0f97u) // Tibetan Subjoined Sign L..Tibetan Subjoined Letter + (0x0f99u, 0x0fbcu) // Tibetan Subjoined Letter..Tibetan Subjoined Letter + (0x0fc6u, 0x0fc6u) // Tibetan Symbol Padma Gda..Tibetan Symbol Padma Gda + (0x102du, 0x1030u) // Myanmar Vowel Sign I ..Myanmar Vowel Sign Uu + (0x1032u, 0x1037u) // Myanmar Vowel Sign Ai ..Myanmar Sign Dot Below + (0x1039u, 0x103au) // Myanmar Sign Virama ..Myanmar Sign Asat + (0x103du, 0x103eu) // Myanmar Consonant Sign M..Myanmar Consonant Sign M + (0x1058u, 0x1059u) // Myanmar Vowel Sign Vocal..Myanmar Vowel Sign Vocal + (0x105eu, 0x1060u) // Myanmar Consonant Sign M..Myanmar Consonant Sign M + (0x1071u, 0x1074u) // Myanmar Vowel Sign Geba ..Myanmar Vowel Sign Kayah + (0x1082u, 0x1082u) // Myanmar Consonant Sign S..Myanmar Consonant Sign S + (0x1085u, 0x1086u) // Myanmar Vowel Sign Shan ..Myanmar Vowel Sign Shan + (0x108du, 0x108du) // Myanmar Sign Shan Counci..Myanmar Sign Shan Counci + (0x109du, 0x109du) // Myanmar Vowel Sign Aiton..Myanmar Vowel Sign Aiton + (0x135du, 0x135fu) // Ethiopic Combining Gemin..Ethiopic Combining Gemin + (0x1712u, 0x1714u) // Tagalog Vowel Sign I ..Tagalog Sign Virama + (0x1732u, 0x1734u) // Hanunoo Vowel Sign I ..Hanunoo Sign Pamudpod + (0x1752u, 0x1753u) // Buhid Vowel Sign I ..Buhid Vowel Sign U + (0x1772u, 0x1773u) // Tagbanwa Vowel Sign I ..Tagbanwa Vowel Sign U + (0x17b4u, 0x17b5u) // Khmer Vowel Inherent Aq ..Khmer Vowel Inherent Aa + (0x17b7u, 0x17bdu) // Khmer Vowel Sign I ..Khmer Vowel Sign Ua + (0x17c6u, 0x17c6u) // Khmer Sign Nikahit ..Khmer Sign Nikahit + (0x17c9u, 0x17d3u) // Khmer Sign Muusikatoan ..Khmer Sign Bathamasat + (0x17ddu, 0x17ddu) // Khmer Sign Atthacan ..Khmer Sign Atthacan + (0x180bu, 0x180du) // Mongolian Free Variation..Mongolian Free Variation + (0x1885u, 0x1886u) // Mongolian Letter Ali Gal..Mongolian Letter Ali Gal + (0x18a9u, 0x18a9u) // Mongolian Letter Ali Gal..Mongolian Letter Ali Gal + (0x1920u, 0x1922u) // Limbu Vowel Sign A ..Limbu Vowel Sign U + (0x1927u, 0x1928u) // Limbu Vowel Sign E ..Limbu Vowel Sign O + (0x1932u, 0x1932u) // Limbu Small Letter Anusv..Limbu Small Letter Anusv + (0x1939u, 0x193bu) // Limbu Sign Mukphreng ..Limbu Sign Sa-i + (0x1a17u, 0x1a18u) // Buginese Vowel Sign I ..Buginese Vowel Sign U + (0x1a1bu, 0x1a1bu) // Buginese Vowel Sign Ae ..Buginese Vowel Sign Ae + (0x1a56u, 0x1a56u) // Tai Tham Consonant Sign ..Tai Tham Consonant Sign + (0x1a58u, 0x1a5eu) // Tai Tham Sign Mai Kang L..Tai Tham Consonant Sign + (0x1a60u, 0x1a60u) // Tai Tham Sign Sakot ..Tai Tham Sign Sakot + (0x1a62u, 0x1a62u) // Tai Tham Vowel Sign Mai ..Tai Tham Vowel Sign Mai + (0x1a65u, 0x1a6cu) // Tai Tham Vowel Sign I ..Tai Tham Vowel Sign Oa B + (0x1a73u, 0x1a7cu) // Tai Tham Vowel Sign Oa A..Tai Tham Sign Khuen-lue + (0x1a7fu, 0x1a7fu) // Tai Tham Combining Crypt..Tai Tham Combining Crypt + (0x1ab0u, 0x1abeu) // Combining Doubled Circum..Combining Parentheses Ov + (0x1b00u, 0x1b03u) // Balinese Sign Ulu Ricem ..Balinese Sign Surang + (0x1b34u, 0x1b34u) // Balinese Sign Rerekan ..Balinese Sign Rerekan + (0x1b36u, 0x1b3au) // Balinese Vowel Sign Ulu ..Balinese Vowel Sign Ra R + (0x1b3cu, 0x1b3cu) // Balinese Vowel Sign La L..Balinese Vowel Sign La L + (0x1b42u, 0x1b42u) // Balinese Vowel Sign Pepe..Balinese Vowel Sign Pepe + (0x1b6bu, 0x1b73u) // Balinese Musical Symbol ..Balinese Musical Symbol + (0x1b80u, 0x1b81u) // Sundanese Sign Panyecek ..Sundanese Sign Panglayar + (0x1ba2u, 0x1ba5u) // Sundanese Consonant Sign..Sundanese Vowel Sign Pan + (0x1ba8u, 0x1ba9u) // Sundanese Vowel Sign Pam..Sundanese Vowel Sign Pan + (0x1babu, 0x1badu) // Sundanese Sign Virama ..Sundanese Consonant Sign + (0x1be6u, 0x1be6u) // Batak Sign Tompi ..Batak Sign Tompi + (0x1be8u, 0x1be9u) // Batak Vowel Sign Pakpak ..Batak Vowel Sign Ee + (0x1bedu, 0x1bedu) // Batak Vowel Sign Karo O ..Batak Vowel Sign Karo O + (0x1befu, 0x1bf1u) // Batak Vowel Sign U F|| S..Batak Consonant Sign H + (0x1c2cu, 0x1c33u) // Lepcha Vowel Sign E ..Lepcha Consonant Sign T + (0x1c36u, 0x1c37u) // Lepcha Sign Ran ..Lepcha Sign Nukta + (0x1cd0u, 0x1cd2u) // Vedic Tone Karshana ..Vedic Tone Prenkha + (0x1cd4u, 0x1ce0u) // Vedic Sign Yajurvedic Mi..Vedic Tone Rigvedic Kash + (0x1ce2u, 0x1ce8u) // Vedic Sign Visarga Svari..Vedic Sign Visarga Anuda + (0x1cedu, 0x1cedu) // Vedic Sign Tiryak ..Vedic Sign Tiryak + (0x1cf4u, 0x1cf4u) // Vedic Tone Candra Above ..Vedic Tone Candra Above + (0x1cf8u, 0x1cf9u) // Vedic Tone Ring Above ..Vedic Tone Double Ring A + (0x1dc0u, 0x1df5u) // Combining Dotted Grave A..Combining Up Tack Above + (0x1dfbu, 0x1dffu) // (nil) ..Combining Right Arrowhea + (0x20d0u, 0x20f0u) // Combining Left Harpoon A..Combining Asterisk Above + (0x2cefu, 0x2cf1u) // Coptic Combining Ni Abov..Coptic Combining Spiritu + (0x2d7fu, 0x2d7fu) // Tifinagh Consonant Joine..Tifinagh Consonant Joine + (0x2de0u, 0x2dffu) // Combining Cyrillic Lette..Combining Cyrillic Lette + (0x302au, 0x302du) // Ideographic Level Tone M..Ideographic Entering Ton + (0x3099u, 0x309au) // Combining Katakana-hirag..Combining Katakana-hirag + (0xa66fu, 0xa672u) // Combining Cyrillic Vzmet..Combining Cyrillic Thous + (0xa674u, 0xa67du) // Combining Cyrillic Lette..Combining Cyrillic Payer + (0xa69eu, 0xa69fu) // Combining Cyrillic Lette..Combining Cyrillic Lette + (0xa6f0u, 0xa6f1u) // Bamum Combining Mark Koq..Bamum Combining Mark Tuk + (0xa802u, 0xa802u) // Syloti Nagri Sign Dvisva..Syloti Nagri Sign Dvisva + (0xa806u, 0xa806u) // Syloti Nagri Sign Hasant..Syloti Nagri Sign Hasant + (0xa80bu, 0xa80bu) // Syloti Nagri Sign Anusva..Syloti Nagri Sign Anusva + (0xa825u, 0xa826u) // Syloti Nagri Vowel Sign ..Syloti Nagri Vowel Sign + (0xa8c4u, 0xa8c5u) // Saurashtra Sign Virama .. + (0xa8e0u, 0xa8f1u) // Combining Devanagari Dig..Combining Devanagari Sig + (0xa926u, 0xa92du) // Kayah Li Vowel Ue ..Kayah Li Tone Calya Plop + (0xa947u, 0xa951u) // Rejang Vowel Sign I ..Rejang Consonant Sign R + (0xa980u, 0xa982u) // Javanese Sign Panyangga ..Javanese Sign Layar + (0xa9b3u, 0xa9b3u) // Javanese Sign Cecak Telu..Javanese Sign Cecak Telu + (0xa9b6u, 0xa9b9u) // Javanese Vowel Sign Wulu..Javanese Vowel Sign Suku + (0xa9bcu, 0xa9bcu) // Javanese Vowel Sign Pepe..Javanese Vowel Sign Pepe + (0xa9e5u, 0xa9e5u) // Myanmar Sign Shan Saw ..Myanmar Sign Shan Saw + (0xaa29u, 0xaa2eu) // Cham Vowel Sign Aa ..Cham Vowel Sign Oe + (0xaa31u, 0xaa32u) // Cham Vowel Sign Au ..Cham Vowel Sign Ue + (0xaa35u, 0xaa36u) // Cham Consonant Sign La ..Cham Consonant Sign Wa + (0xaa43u, 0xaa43u) // Cham Consonant Sign Fina..Cham Consonant Sign Fina + (0xaa4cu, 0xaa4cu) // Cham Consonant Sign Fina..Cham Consonant Sign Fina + (0xaa7cu, 0xaa7cu) // Myanmar Sign Tai Laing T..Myanmar Sign Tai Laing T + (0xaab0u, 0xaab0u) // Tai Viet Mai Kang ..Tai Viet Mai Kang + (0xaab2u, 0xaab4u) // Tai Viet Vowel I ..Tai Viet Vowel U + (0xaab7u, 0xaab8u) // Tai Viet Mai Khit ..Tai Viet Vowel Ia + (0xaabeu, 0xaabfu) // Tai Viet Vowel Am ..Tai Viet Tone Mai Ek + (0xaac1u, 0xaac1u) // Tai Viet Tone Mai Tho ..Tai Viet Tone Mai Tho + (0xaaecu, 0xaaedu) // Meetei Mayek Vowel Sign ..Meetei Mayek Vowel Sign + (0xaaf6u, 0xaaf6u) // Meetei Mayek Virama ..Meetei Mayek Virama + (0xabe5u, 0xabe5u) // Meetei Mayek Vowel Sign ..Meetei Mayek Vowel Sign + (0xabe8u, 0xabe8u) // Meetei Mayek Vowel Sign ..Meetei Mayek Vowel Sign + (0xabedu, 0xabedu) // Meetei Mayek Apun Iyek ..Meetei Mayek Apun Iyek + (0xfb1eu, 0xfb1eu) // Hebrew Point Judeo-spani..Hebrew Point Judeo-spani + (0xfe00u, 0xfe0fu) // Variation Select||-1 ..Variation Select||-16 + (0xfe20u, 0xfe2fu) // Combining Ligature Left ..Combining Cyrillic Titlo + (0x101fdu, 0x101fdu) // Phaistos Disc Sign Combi..Phaistos Disc Sign Combi + (0x102e0u, 0x102e0u) // Coptic Epact Thousands M..Coptic Epact Thousands M + (0x10376u, 0x1037au) // Combining Old Permic Let..Combining Old Permic Let + (0x10a01u, 0x10a03u) // Kharoshthi Vowel Sign I ..Kharoshthi Vowel Sign Vo + (0x10a05u, 0x10a06u) // Kharoshthi Vowel Sign E ..Kharoshthi Vowel Sign O + (0x10a0cu, 0x10a0fu) // Kharoshthi Vowel Length ..Kharoshthi Sign Visarga + (0x10a38u, 0x10a3au) // Kharoshthi Sign Bar Abov..Kharoshthi Sign Dot Belo + (0x10a3fu, 0x10a3fu) // Kharoshthi Virama ..Kharoshthi Virama + (0x10ae5u, 0x10ae6u) // Manichaean Abbreviation ..Manichaean Abbreviation + (0x11001u, 0x11001u) // Brahmi Sign Anusvara ..Brahmi Sign Anusvara + (0x11038u, 0x11046u) // Brahmi Vowel Sign Aa ..Brahmi Virama + (0x1107fu, 0x11081u) // Brahmi Number Joiner ..Kaithi Sign Anusvara + (0x110b3u, 0x110b6u) // Kaithi Vowel Sign U ..Kaithi Vowel Sign Ai + (0x110b9u, 0x110bau) // Kaithi Sign Virama ..Kaithi Sign Nukta + (0x11100u, 0x11102u) // Chakma Sign Candrabindu ..Chakma Sign Visarga + (0x11127u, 0x1112bu) // Chakma Vowel Sign A ..Chakma Vowel Sign Uu + (0x1112du, 0x11134u) // Chakma Vowel Sign Ai ..Chakma Maayyaa + (0x11173u, 0x11173u) // Mahajani Sign Nukta ..Mahajani Sign Nukta + (0x11180u, 0x11181u) // Sharada Sign Candrabindu..Sharada Sign Anusvara + (0x111b6u, 0x111beu) // Sharada Vowel Sign U ..Sharada Vowel Sign O + (0x111cau, 0x111ccu) // Sharada Sign Nukta ..Sharada Extra Sh||t Vowe + (0x1122fu, 0x11231u) // Khojki Vowel Sign U ..Khojki Vowel Sign Ai + (0x11234u, 0x11234u) // Khojki Sign Anusvara ..Khojki Sign Anusvara + (0x11236u, 0x11237u) // Khojki Sign Nukta ..Khojki Sign Shadda + (0x1123eu, 0x1123eu) // (nil) .. + (0x112dfu, 0x112dfu) // Khudawadi Sign Anusvara ..Khudawadi Sign Anusvara + (0x112e3u, 0x112eau) // Khudawadi Vowel Sign U ..Khudawadi Sign Virama + (0x11300u, 0x11301u) // Grantha Sign Combining A..Grantha Sign Candrabindu + (0x1133cu, 0x1133cu) // Grantha Sign Nukta ..Grantha Sign Nukta + (0x11340u, 0x11340u) // Grantha Vowel Sign Ii ..Grantha Vowel Sign Ii + (0x11366u, 0x1136cu) // Combining Grantha Digit ..Combining Grantha Digit + (0x11370u, 0x11374u) // Combining Grantha Letter..Combining Grantha Letter + (0x11438u, 0x1143fu) // (nil) .. + (0x11442u, 0x11444u) // (nil) .. + (0x11446u, 0x11446u) // (nil) .. + (0x114b3u, 0x114b8u) // Tirhuta Vowel Sign U ..Tirhuta Vowel Sign Vocal + (0x114bau, 0x114bau) // Tirhuta Vowel Sign Sh||t..Tirhuta Vowel Sign Sh||t + (0x114bfu, 0x114c0u) // Tirhuta Sign Candrabindu..Tirhuta Sign Anusvara + (0x114c2u, 0x114c3u) // Tirhuta Sign Virama ..Tirhuta Sign Nukta + (0x115b2u, 0x115b5u) // Siddham Vowel Sign U ..Siddham Vowel Sign Vocal + (0x115bcu, 0x115bdu) // Siddham Sign Candrabindu..Siddham Sign Anusvara + (0x115bfu, 0x115c0u) // Siddham Sign Virama ..Siddham Sign Nukta + (0x115dcu, 0x115ddu) // Siddham Vowel Sign Alter..Siddham Vowel Sign Alter + (0x11633u, 0x1163au) // Modi Vowel Sign U ..Modi Vowel Sign Ai + (0x1163du, 0x1163du) // Modi Sign Anusvara ..Modi Sign Anusvara + (0x1163fu, 0x11640u) // Modi Sign Virama ..Modi Sign Ardhacandra + (0x116abu, 0x116abu) // Takri Sign Anusvara ..Takri Sign Anusvara + (0x116adu, 0x116adu) // Takri Vowel Sign Aa ..Takri Vowel Sign Aa + (0x116b0u, 0x116b5u) // Takri Vowel Sign U ..Takri Vowel Sign Au + (0x116b7u, 0x116b7u) // Takri Sign Nukta ..Takri Sign Nukta + (0x1171du, 0x1171fu) // Ahom Consonant Sign Medi..Ahom Consonant Sign Medi + (0x11722u, 0x11725u) // Ahom Vowel Sign I ..Ahom Vowel Sign Uu + (0x11727u, 0x1172bu) // Ahom Vowel Sign Aw ..Ahom Sign Killer + (0x11c30u, 0x11c36u) // (nil) .. + (0x11c38u, 0x11c3du) // (nil) .. + (0x11c3fu, 0x11c3fu) // (nil) .. + (0x11c92u, 0x11ca7u) // (nil) .. + (0x11caau, 0x11cb0u) // (nil) .. + (0x11cb2u, 0x11cb3u) // (nil) .. + (0x11cb5u, 0x11cb6u) // (nil) .. + (0x16af0u, 0x16af4u) // Bassa Vah Combining High..Bassa Vah Combining High + (0x16b30u, 0x16b36u) // Pahawh Hmong Mark Cim Tu..Pahawh Hmong Mark Cim Ta + (0x16f8fu, 0x16f92u) // Miao Tone Right ..Miao Tone Below + (0x1bc9du, 0x1bc9eu) // Duployan Thick Letter Se..Duployan Double Mark + (0x1d167u, 0x1d169u) // Musical Symbol Combining..Musical Symbol Combining + (0x1d17bu, 0x1d182u) // Musical Symbol Combining..Musical Symbol Combining + (0x1d185u, 0x1d18bu) // Musical Symbol Combining..Musical Symbol Combining + (0x1d1aau, 0x1d1adu) // Musical Symbol Combining..Musical Symbol Combining + (0x1d242u, 0x1d244u) // Combining Greek Musical ..Combining Greek Musical + (0x1da00u, 0x1da36u) // Signwriting Head Rim ..Signwriting Air Sucking + (0x1da3bu, 0x1da6cu) // Signwriting Mouth Closed..Signwriting Excitement + (0x1da75u, 0x1da75u) // Signwriting Upper Body T..Signwriting Upper Body T + (0x1da84u, 0x1da84u) // Signwriting Location Hea..Signwriting Location Hea + (0x1da9bu, 0x1da9fu) // Signwriting Fill Modifie..Signwriting Fill Modifie + (0x1daa1u, 0x1daafu) // Signwriting Rotation Mod..Signwriting Rotation Mod + (0x1e000u, 0x1e006u) // (nil) .. + (0x1e008u, 0x1e018u) // (nil) .. + (0x1e01bu, 0x1e021u) // (nil) .. + (0x1e023u, 0x1e024u) // (nil) .. + (0x1e026u, 0x1e02au) // (nil) .. + (0x1e8d0u, 0x1e8d6u) // Mende Kikakui Combining ..Mende Kikakui Combining + (0x1e944u, 0x1e94au) // (nil) .. + (0xe0100u, 0xe01efu) // Variation Select||-17 ..Variation Select||-256 |] // from: http://www.unicode.org/emoji/charts-12.0/emoji-list.html @@ -301,227 +301,227 @@ let ZeroWidth = [| // ref: https://unicode.org/reports/tr51/ let Emoji = [| - (0x23, 0x23) // keycap: # ..keycap: # - (0x2A, 0x2A) // keycap: * ..keycap: * - (0x30, 0x39) // keycap: 0 ..keycap: 9 - (0xA9, 0xA9) // copyright ..copyright - (0xAE, 0xAE) // registered ..registered - (0x203C, 0x203C) // double exclamation mark ..double exclamation mark - (0x2049, 0x2049) // exclamation question mark..exclamation question mark - (0x2122, 0x2122) // trade mark ..trade mark - (0x2139, 0x2139) // information ..information - (0x2194, 0x2199) // left-right arrow ..down-left arrow - (0x21A9, 0x21AA) // right arrow curving left..left arrow curving right - (0x231A, 0x231B) // watch ..hourglass done - (0x2328, 0x2328) // keyboard ..keyboard - (0x23CF, 0x23CF) // eject button ..eject button - (0x23E9, 0x23F3) // fast-forward button ..hourglass not done - (0x23F8, 0x23FA) // pause button ..record button - (0x24C2, 0x24C2) // circled M ..circled M - (0x25AA, 0x25AB) // black small square ..white small square - (0x25B6, 0x25B6) // play button ..play button - (0x25C0, 0x25C0) // reverse button ..reverse button - (0x25FB, 0x25FE) // white medium square ..black medium-small square - (0x2600, 0x2604) // sun ..comet - (0x260E, 0x260E) // telephone ..telephone - (0x2611, 0x2611) // check box with check ..check box with check - (0x2614, 0x2615) // umbrella with rain drops..hot beverage - (0x2618, 0x2618) // shamrock ..shamrock - (0x261D, 0x261D) // index pointing up ..index pointing up - (0x2620, 0x2620) // skull and crossbones ..skull and crossbones - (0x2622, 0x2623) // radioactive ..biohazard - (0x2626, 0x2626) // orthodox cross ..orthodox cross - (0x262A, 0x262A) // star and crescent ..star and crescent - (0x262E, 0x262F) // peace symbol ..yin yang - (0x2638, 0x263A) // wheel of dharma ..smiling face - (0x2640, 0x2640) // female sign ..female sign - (0x2642, 0x2642) // male sign ..male sign - (0x2648, 0x2653) // Aries ..Pisces - (0x265F, 0x2660) // chess pawn ..spade suit - (0x2663, 0x2663) // club suit ..club suit - (0x2665, 0x2666) // heart suit ..diamond suit - (0x2668, 0x2668) // hot springs ..hot springs - (0x267B, 0x267B) // recycling symbol ..recycling symbol - (0x267E, 0x267F) // infinity ..wheelchair symbol - (0x2692, 0x2697) // hammer and pick ..alembic - (0x2699, 0x2699) // gear ..gear - (0x269B, 0x269C) // atom symbol ..fleur-de-lis - (0x26A0, 0x26A1) // warning ..high voltage - (0x26AA, 0x26AB) // white circle ..black circle - (0x26B0, 0x26B1) // coffin ..funeral urn - (0x26BD, 0x26BE) // soccer ball ..baseball - (0x26C4, 0x26C5) // snowman without snow ..sun behind cloud - (0x26C8, 0x26C8) // cloud with lightning and rain..cloud with lightning and rain - (0x26CE, 0x26CF) // Ophiuchus ..pick - (0x26D1, 0x26D1) // rescue worker’s helmet ..rescue worker’s helmet - (0x26D3, 0x26D4) // chains ..no entry - (0x26E9, 0x26EA) // shinto shrine ..church - (0x26F0, 0x26F5) // mountain ..sailboat - (0x26F7, 0x26FA) // skier ..tent - (0x26FD, 0x26FD) // fuel pump ..fuel pump - (0x2702, 0x2702) // scissors ..scissors - (0x2705, 0x2705) // check mark button ..check mark button - (0x2708, 0x270D) // airplane ..writing hand - (0x270F, 0x270F) // pencil ..pencil - (0x2712, 0x2712) // black nib ..black nib - (0x2714, 0x2714) // check mark ..check mark - (0x2716, 0x2716) // multiplication sign ..multiplication sign - (0x271D, 0x271D) // latin cross ..latin cross - (0x2721, 0x2721) // star of David ..star of David - (0x2728, 0x2728) // sparkles ..sparkles - (0x2733, 0x2734) // eight-spoked asterisk ..eight-pointed star - (0x2744, 0x2744) // snowflake ..snowflake - (0x2747, 0x2747) // sparkle ..sparkle - (0x274C, 0x274C) // cross mark ..cross mark - (0x274E, 0x274E) // cross mark button ..cross mark button - (0x2753, 0x2755) // question mark ..white exclamation mark - (0x2757, 0x2757) // exclamation mark ..exclamation mark - (0x2763, 0x2764) // heart exclamation ..red heart - (0x2795, 0x2797) // plus sign ..division sign - (0x27A1, 0x27A1) // right arrow ..right arrow - (0x27B0, 0x27B0) // curly loop ..curly loop - (0x27BF, 0x27BF) // double curly loop ..double curly loop - (0x2934, 0x2935) // right arrow curving up ..right arrow curving down - (0x2B05, 0x2B07) // left arrow ..down arrow - (0x2B1B, 0x2B1C) // black large square ..white large square - (0x2B50, 0x2B50) // star ..star - (0x2B55, 0x2B55) // hollow red circle ..hollow red circle - (0x3030, 0x3030) // wavy dash ..wavy dash - (0x303D, 0x303D) // part alternation mark ..part alternation mark - (0x3297, 0x3297) // Japanese “congratulations” button..Japanese “congratulations” button - (0x3299, 0x3299) // Japanese “secret” button..Japanese “secret” button - (0x1F004, 0x1F004) // mahjong red dragon ..mahjong red dragon - (0x1F0CF, 0x1F0CF) // joker ..joker - (0x1F170, 0x1F171) // A button (blood type) ..B button (blood type) - (0x1F17E, 0x1F17F) // O button (blood type) ..P button - (0x1F18E, 0x1F18E) // AB button (blood type) ..AB button (blood type) - (0x1F191, 0x1F19A) // CL button ..VS button - (0x1F1E6, 0x1F1FF) // flag: Ascension Island ..flag: Zimbabwe - (0x1F201, 0x1F202) // Japanese “here” button ..Japanese “service charge” button - (0x1F21A, 0x1F21A) // Japanese “free of charge” button..Japanese “free of charge” button - (0x1F22F, 0x1F22F) // Japanese “reserved” button..Japanese “reserved” button - (0x1F232, 0x1F23A) // Japanese “prohibited” button..Japanese “open for business” button - (0x1F250, 0x1F251) // Japanese “bargain” button..Japanese “acceptable” button - (0x1F300, 0x1F321) // cyclone ..thermometer - (0x1F324, 0x1F393) // sun behind small cloud ..graduation cap - (0x1F396, 0x1F397) // military medal ..reminder ribbon - (0x1F399, 0x1F39B) // studio microphone ..control knobs - (0x1F39E, 0x1F3F0) // film frames ..castle - (0x1F3F3, 0x1F3F5) // white flag ..rosette - (0x1F3F7, 0x1F3FA) // label ..amphora - (0x1F400, 0x1F4FD) // rat ..film projector - (0x1F4FF, 0x1F53D) // prayer beads ..downwards button - (0x1F549, 0x1F54E) // om ..menorah - (0x1F550, 0x1F567) // one o’clock ..twelve-thirty - (0x1F56F, 0x1F570) // candle ..mantelpiece clock - (0x1F573, 0x1F57A) // hole ..man dancing - (0x1F587, 0x1F587) // linked paperclips ..linked paperclips - (0x1F58A, 0x1F58D) // pen ..crayon - (0x1F590, 0x1F590) // hand with fingers splayed..hand with fingers splayed - (0x1F595, 0x1F596) // middle finger ..vulcan salute - (0x1F5A4, 0x1F5A5) // black heart ..desktop computer - (0x1F5A8, 0x1F5A8) // printer ..printer - (0x1F5B1, 0x1F5B2) // computer mouse ..trackball - (0x1F5BC, 0x1F5BC) // framed picture ..framed picture - (0x1F5C2, 0x1F5C4) // card index dividers ..file cabinet - (0x1F5D1, 0x1F5D3) // wastebasket ..spiral calendar - (0x1F5DC, 0x1F5DE) // clamp ..rolled-up newspaper - (0x1F5E1, 0x1F5E1) // dagger ..dagger - (0x1F5E3, 0x1F5E3) // speaking head ..speaking head - (0x1F5E8, 0x1F5E8) // left speech bubble ..left speech bubble - (0x1F5EF, 0x1F5EF) // right anger bubble ..right anger bubble - (0x1F5F3, 0x1F5F3) // ballot box with ballot ..ballot box with ballot - (0x1F5FA, 0x1F64F) // world map ..folded hands - (0x1F680, 0x1F6C5) // rocket ..left luggage - (0x1F6CB, 0x1F6D2) // couch and lamp ..shopping cart - (0x1F6D5, 0x1F6D5) // ⊛ hindu temple ..⊛ hindu temple - (0x1F6E0, 0x1F6E5) // hammer and wrench ..motor boat - (0x1F6E9, 0x1F6E9) // small airplane ..small airplane - (0x1F6EB, 0x1F6EC) // airplane departure ..airplane arrival - (0x1F6F0, 0x1F6F0) // satellite ..satellite - (0x1F6F3, 0x1F6FA) // passenger ship ..⊛ auto rickshaw - (0x1F7E0, 0x1F7EB) // ⊛ orange circle ..⊛ brown square - (0x1F90D, 0x1F93A) // ⊛ white heart ..person fencing - (0x1F93C, 0x1F945) // people wrestling ..goal net - (0x1F947, 0x1F971) // 1st place medal ..⊛ yawning face - (0x1F973, 0x1F976) // partying face ..cold face - (0x1F97A, 0x1F9A2) // pleading face ..swan - (0x1F9A5, 0x1F9AA) // ⊛ sloth ..⊛ oyster - (0x1F9AE, 0x1F9CA) // ⊛ guide dog ..⊛ ice - (0x1F9CD, 0x1F9FF) // ⊛ person standing ..nazar amulet - (0x1FA70, 0x1FA73) // ⊛ ballet shoes ..⊛ shorts - (0x1FA78, 0x1FA7A) // ⊛ drop of blood ..⊛ stethoscope - (0x1FA80, 0x1FA82) // ⊛ yo-yo ..⊛ parachute + (0x23u, 0x23u) // keycap: # ..keycap: # + (0x2Au, 0x2Au) // keycap: * ..keycap: * + (0x30u, 0x39u) // keycap: 0 ..keycap: 9 + (0xA9u, 0xA9u) // copyright ..copyright + (0xAEu, 0xAEu) // registered ..registered + (0x203Cu, 0x203Cu) // double exclamation mark ..double exclamation mark + (0x2049u, 0x2049u) // exclamation question mark..exclamation question mark + (0x2122u, 0x2122u) // trade mark ..trade mark + (0x2139u, 0x2139u) // information ..information + (0x2194u, 0x2199u) // left-right arrow ..down-left arrow + (0x21A9u, 0x21AAu) // right arrow curving left..left arrow curving right + (0x231Au, 0x231Bu) // watch ..hourglass done + (0x2328u, 0x2328u) // keyboard ..keyboard + (0x23CFu, 0x23CFu) // eject button ..eject button + (0x23E9u, 0x23F3u) // fast-forward button ..hourglass not done + (0x23F8u, 0x23FAu) // pause button ..record button + (0x24C2u, 0x24C2u) // circled M ..circled M + (0x25AAu, 0x25ABu) // black small square ..white small square + (0x25B6u, 0x25B6u) // play button ..play button + (0x25C0u, 0x25C0u) // reverse button ..reverse button + (0x25FBu, 0x25FEu) // white medium square ..black medium-small square + (0x2600u, 0x2604u) // sun ..comet + (0x260Eu, 0x260Eu) // telephone ..telephone + (0x2611u, 0x2611u) // check box with check ..check box with check + (0x2614u, 0x2615u) // umbrella with rain drops..hot beverage + (0x2618u, 0x2618u) // shamrock ..shamrock + (0x261Du, 0x261Du) // index pointing up ..index pointing up + (0x2620u, 0x2620u) // skull and crossbones ..skull and crossbones + (0x2622u, 0x2623u) // radioactive ..biohazard + (0x2626u, 0x2626u) // orthodox cross ..orthodox cross + (0x262Au, 0x262Au) // star and crescent ..star and crescent + (0x262Eu, 0x262Fu) // peace symbol ..yin yang + (0x2638u, 0x263Au) // wheel of dharma ..smiling face + (0x2640u, 0x2640u) // female sign ..female sign + (0x2642u, 0x2642u) // male sign ..male sign + (0x2648u, 0x2653u) // Aries ..Pisces + (0x265Fu, 0x2660u) // chess pawn ..spade suit + (0x2663u, 0x2663u) // club suit ..club suit + (0x2665u, 0x2666u) // heart suit ..diamond suit + (0x2668u, 0x2668u) // hot springs ..hot springs + (0x267Bu, 0x267Bu) // recycling symbol ..recycling symbol + (0x267Eu, 0x267Fu) // infinity ..wheelchair symbol + (0x2692u, 0x2697u) // hammer and pick ..alembic + (0x2699u, 0x2699u) // gear ..gear + (0x269Bu, 0x269Cu) // atom symbol ..fleur-de-lis + (0x26A0u, 0x26A1u) // warning ..high voltage + (0x26AAu, 0x26ABu) // white circle ..black circle + (0x26B0u, 0x26B1u) // coffin ..funeral urn + (0x26BDu, 0x26BEu) // soccer ball ..baseball + (0x26C4u, 0x26C5u) // snowman without snow ..sun behind cloud + (0x26C8u, 0x26C8u) // cloud with lightning and rain..cloud with lightning and rain + (0x26CEu, 0x26CFu) // Ophiuchus ..pick + (0x26D1u, 0x26D1u) // rescue worker’s helmet ..rescue worker’s helmet + (0x26D3u, 0x26D4u) // chains ..no entry + (0x26E9u, 0x26EAu) // shinto shrine ..church + (0x26F0u, 0x26F5u) // mountain ..sailboat + (0x26F7u, 0x26FAu) // skier ..tent + (0x26FDu, 0x26FDu) // fuel pump ..fuel pump + (0x2702u, 0x2702u) // scissors ..scissors + (0x2705u, 0x2705u) // check mark button ..check mark button + (0x2708u, 0x270Du) // airplane ..writing hand + (0x270Fu, 0x270Fu) // pencil ..pencil + (0x2712u, 0x2712u) // black nib ..black nib + (0x2714u, 0x2714u) // check mark ..check mark + (0x2716u, 0x2716u) // multiplication sign ..multiplication sign + (0x271Du, 0x271Du) // latin cross ..latin cross + (0x2721u, 0x2721u) // star of David ..star of David + (0x2728u, 0x2728u) // sparkles ..sparkles + (0x2733u, 0x2734u) // eight-spoked asterisk ..eight-pointed star + (0x2744u, 0x2744u) // snowflake ..snowflake + (0x2747u, 0x2747u) // sparkle ..sparkle + (0x274Cu, 0x274Cu) // cross mark ..cross mark + (0x274Eu, 0x274Eu) // cross mark button ..cross mark button + (0x2753u, 0x2755u) // question mark ..white exclamation mark + (0x2757u, 0x2757u) // exclamation mark ..exclamation mark + (0x2763u, 0x2764u) // heart exclamation ..red heart + (0x2795u, 0x2797u) // plus sign ..division sign + (0x27A1u, 0x27A1u) // right arrow ..right arrow + (0x27B0u, 0x27B0u) // curly loop ..curly loop + (0x27BFu, 0x27BFu) // double curly loop ..double curly loop + (0x2934u, 0x2935u) // right arrow curving up ..right arrow curving down + (0x2B05u, 0x2B07u) // left arrow ..down arrow + (0x2B1Bu, 0x2B1Cu) // black large square ..white large square + (0x2B50u, 0x2B50u) // star ..star + (0x2B55u, 0x2B55u) // hollow red circle ..hollow red circle + (0x3030u, 0x3030u) // wavy dash ..wavy dash + (0x303Du, 0x303Du) // part alternation mark ..part alternation mark + (0x3297u, 0x3297u) // Japanese “congratulations” button..Japanese “congratulations” button + (0x3299u, 0x3299u) // Japanese “secret” button..Japanese “secret” button + (0x1F004u, 0x1F004u) // mahjong red dragon ..mahjong red dragon + (0x1F0CFu, 0x1F0CFu) // joker ..joker + (0x1F170u, 0x1F171u) // A button (blood type) ..B button (blood type) + (0x1F17Eu, 0x1F17Fu) // O button (blood type) ..P button + (0x1F18Eu, 0x1F18Eu) // AB button (blood type) ..AB button (blood type) + (0x1F191u, 0x1F19Au) // CL button ..VS button + (0x1F1E6u, 0x1F1FFu) // flag: Ascension Island ..flag: Zimbabwe + (0x1F201u, 0x1F202u) // Japanese “here” button ..Japanese “service charge” button + (0x1F21Au, 0x1F21Au) // Japanese “free of charge” button..Japanese “free of charge” button + (0x1F22Fu, 0x1F22Fu) // Japanese “reserved” button..Japanese “reserved” button + (0x1F232u, 0x1F23Au) // Japanese “prohibited” button..Japanese “open for business” button + (0x1F250u, 0x1F251u) // Japanese “bargain” button..Japanese “acceptable” button + (0x1F300u, 0x1F321u) // cyclone ..thermometer + (0x1F324u, 0x1F393u) // sun behind small cloud ..graduation cap + (0x1F396u, 0x1F397u) // military medal ..reminder ribbon + (0x1F399u, 0x1F39Bu) // studio microphone ..control knobs + (0x1F39Eu, 0x1F3F0u) // film frames ..castle + (0x1F3F3u, 0x1F3F5u) // white flag ..rosette + (0x1F3F7u, 0x1F3FAu) // label ..amphora + (0x1F400u, 0x1F4FDu) // rat ..film projector + (0x1F4FFu, 0x1F53Du) // prayer beads ..downwards button + (0x1F549u, 0x1F54Eu) // om ..menorah + (0x1F550u, 0x1F567u) // one o’clock ..twelve-thirty + (0x1F56Fu, 0x1F570u) // candle ..mantelpiece clock + (0x1F573u, 0x1F57Au) // hole ..man dancing + (0x1F587u, 0x1F587u) // linked paperclips ..linked paperclips + (0x1F58Au, 0x1F58Du) // pen ..crayon + (0x1F590u, 0x1F590u) // hand with fingers splayed..hand with fingers splayed + (0x1F595u, 0x1F596u) // middle finger ..vulcan salute + (0x1F5A4u, 0x1F5A5u) // black heart ..desktop computer + (0x1F5A8u, 0x1F5A8u) // printer ..printer + (0x1F5B1u, 0x1F5B2u) // computer mouse ..trackball + (0x1F5BCu, 0x1F5BCu) // framed picture ..framed picture + (0x1F5C2u, 0x1F5C4u) // card index dividers ..file cabinet + (0x1F5D1u, 0x1F5D3u) // wastebasket ..spiral calendar + (0x1F5DCu, 0x1F5DEu) // clamp ..rolled-up newspaper + (0x1F5E1u, 0x1F5E1u) // dagger ..dagger + (0x1F5E3u, 0x1F5E3u) // speaking head ..speaking head + (0x1F5E8u, 0x1F5E8u) // left speech bubble ..left speech bubble + (0x1F5EFu, 0x1F5EFu) // right anger bubble ..right anger bubble + (0x1F5F3u, 0x1F5F3u) // ballot box with ballot ..ballot box with ballot + (0x1F5FAu, 0x1F64Fu) // world map ..folded hands + (0x1F680u, 0x1F6C5u) // rocket ..left luggage + (0x1F6CBu, 0x1F6D2u) // couch and lamp ..shopping cart + (0x1F6D5u, 0x1F6D5u) // ⊛ hindu temple ..⊛ hindu temple + (0x1F6E0u, 0x1F6E5u) // hammer and wrench ..motor boat + (0x1F6E9u, 0x1F6E9u) // small airplane ..small airplane + (0x1F6EBu, 0x1F6ECu) // airplane departure ..airplane arrival + (0x1F6F0u, 0x1F6F0u) // satellite ..satellite + (0x1F6F3u, 0x1F6FAu) // passenger ship ..⊛ auto rickshaw + (0x1F7E0u, 0x1F7EBu) // ⊛ orange circle ..⊛ brown square + (0x1F90Du, 0x1F93Au) // ⊛ white heart ..person fencing + (0x1F93Cu, 0x1F945u) // people wrestling ..goal net + (0x1F947u, 0x1F971u) // 1st place medal ..⊛ yawning face + (0x1F973u, 0x1F976u) // partying face ..cold face + (0x1F97Au, 0x1F9A2u) // pleading face ..swan + (0x1F9A5u, 0x1F9AAu) // ⊛ sloth ..⊛ oyster + (0x1F9AEu, 0x1F9CAu) // ⊛ guide dog ..⊛ ice + (0x1F9CDu, 0x1F9FFu) // ⊛ person standing ..nazar amulet + (0x1FA70u, 0x1FA73u) // ⊛ ballet shoes ..⊛ shorts + (0x1FA78u, 0x1FA7Au) // ⊛ drop of blood ..⊛ stethoscope + (0x1FA80u, 0x1FA82u) // ⊛ yo-yo ..⊛ parachute |] // https://github.com/jquast/wcwidth/blob/master/wcwidth/table_wide.py // at commit 0d7de112202cc8b2ebe9232ff4a5c954f19d561a (2016-07-02): let WideEastAsian = [| - (0x1100, 0x115f) // Hangul Choseong Kiyeok ..Hangul Choseong Filler - (0x2329, 0x232a) // Left-pointing Angle Brac..Right-pointing Angle Bra - (0x2e80, 0x2e99) // Cjk Radical Repeat ..Cjk Radical Rap - (0x2e9b, 0x2ef3) // Cjk Radical Choke ..Cjk Radical C-simplified - (0x2f00, 0x2fd5) // Kangxi Radical One ..Kangxi Radical Flute - (0x2ff0, 0x2ffb) // Ideographic Description ..Ideographic Description - (0x3000, 0x303e) // Ideographic Space ..Ideographic Variation In - (0x3041, 0x3096) // Hiragana Letter Small A ..Hiragana Letter Small Ke - (0x3099, 0x30ff) // Combining Katakana-hirag..Katakana Digraph Koto - (0x3105, 0x312d) // Bopomofo Letter B ..Bopomofo Letter Ih - (0x3131, 0x318e) // Hangul Letter Kiyeok ..Hangul Letter Araeae - (0x3190, 0x31ba) // Ideographic Annotation L..Bopomofo Letter Zy - (0x31c0, 0x31e3) // Cjk Stroke T ..Cjk Stroke Q - (0x31f0, 0x321e) // Katakana Letter Small Ku..Parenthesized K||ean Cha - (0x3220, 0x3247) // Parenthesized Ideograph ..Circled Ideograph Koto - (0x3250, 0x32fe) // Partnership Sign ..Circled Katakana Wo - (0x3300, 0x4dbf) // Square Apaato .. - (0x4e00, 0xa48c) // Cjk Unified Ideograph-4e..Yi Syllable Yyr - (0xa490, 0xa4c6) // Yi Radical Qot ..Yi Radical Ke - (0xa960, 0xa97c) // Hangul Choseong Tikeut-m..Hangul Choseong Ssangyeo - (0xac00, 0xd7a3) // Hangul Syllable Ga ..Hangul Syllable Hih - (0xf900, 0xfaff) // Cjk Compatibility Ideogr.. - (0xfe10, 0xfe19) // Presentation F||m F|| Ve..Presentation F||m F|| Ve - (0xfe30, 0xfe52) // Presentation F||m F|| Ve..Small Full Stop - (0xfe54, 0xfe66) // Small Semicolon ..Small Equals Sign - (0xfe68, 0xfe6b) // Small Reverse Solidus ..Small Commercial At - (0xff01, 0xff60) // Fullwidth Exclamation Ma..Fullwidth Right White Pa - (0xffe0, 0xffe6) // Fullwidth Cent Sign ..Fullwidth Won Sign - (0x20000, 0x2fffd) // Cjk Unified Ideograph-20.. - (0x30000, 0x3fffd) // (nil) .. + (0x1100u, 0x115fu) // Hangul Choseong Kiyeok ..Hangul Choseong Filler + (0x2329u, 0x232au) // Left-pointing Angle Brac..Right-pointing Angle Bra + (0x2e80u, 0x2e99u) // Cjk Radical Repeat ..Cjk Radical Rap + (0x2e9bu, 0x2ef3u) // Cjk Radical Choke ..Cjk Radical C-simplified + (0x2f00u, 0x2fd5u) // Kangxi Radical One ..Kangxi Radical Flute + (0x2ff0u, 0x2ffbu) // Ideographic Description ..Ideographic Description + (0x3000u, 0x303eu) // Ideographic Space ..Ideographic Variation In + (0x3041u, 0x3096u) // Hiragana Letter Small A ..Hiragana Letter Small Ke + (0x3099u, 0x30ffu) // Combining Katakana-hirag..Katakana Digraph Koto + (0x3105u, 0x312du) // Bopomofo Letter B ..Bopomofo Letter Ih + (0x3131u, 0x318eu) // Hangul Letter Kiyeok ..Hangul Letter Araeae + (0x3190u, 0x31bau) // Ideographic Annotation L..Bopomofo Letter Zy + (0x31c0u, 0x31e3u) // Cjk Stroke T ..Cjk Stroke Q + (0x31f0u, 0x321eu) // Katakana Letter Small Ku..Parenthesized K||ean Cha + (0x3220u, 0x3247u) // Parenthesized Ideograph ..Circled Ideograph Koto + (0x3250u, 0x32feu) // Partnership Sign ..Circled Katakana Wo + (0x3300u, 0x4dbfu) // Square Apaato .. + (0x4e00u, 0xa48cu) // Cjk Unified Ideograph-4e..Yi Syllable Yyr + (0xa490u, 0xa4c6u) // Yi Radical Qot ..Yi Radical Ke + (0xa960u, 0xa97cu) // Hangul Choseong Tikeut-m..Hangul Choseong Ssangyeo + (0xac00u, 0xd7a3u) // Hangul Syllable Ga ..Hangul Syllable Hih + (0xf900u, 0xfaffu) // Cjk Compatibility Ideogr.. + (0xfe10u, 0xfe19u) // Presentation F||m F|| Ve..Presentation F||m F|| Ve + (0xfe30u, 0xfe52u) // Presentation F||m F|| Ve..Small Full Stop + (0xfe54u, 0xfe66u) // Small Semicolon ..Small Equals Sign + (0xfe68u, 0xfe6bu) // Small Reverse Solidus ..Small Commercial At + (0xff01u, 0xff60u) // Fullwidth Exclamation Ma..Fullwidth Right White Pa + (0xffe0u, 0xffe6u) // Fullwidth Cent Sign ..Fullwidth Won Sign + (0x20000u, 0x2fffdu) // Cjk Unified Ideograph-20.. + (0x30000u, 0x3fffdu) // (nil) .. |] let Powerline = [| - (0xe0a0, 0xe0a2) // Powerline Symbols - (0xe0a3, 0xe0a3) // Powerline Extra Symbols - (0xe0b0, 0xe0b3) // Powerline Symbols - (0xe0b4, 0xe0c8) // Powerline Extra Symbols - (0xe0ca, 0xe0ca) // Powerline Extra Symbols - (0xe0cc, 0xe0d4) // Powerline Extra Symbols + (0xe0a0u, 0xe0a2u) // Powerline Symbols + (0xe0a3u, 0xe0a3u) // Powerline Extra Symbols + (0xe0b0u, 0xe0b3u) // Powerline Symbols + (0xe0b4u, 0xe0c8u) // Powerline Extra Symbols + (0xe0cau, 0xe0cau) // Powerline Extra Symbols + (0xe0ccu, 0xe0d4u) // Powerline Extra Symbols |] // The complete set is recorded in nerdfont.txt let NerdFont = [| - (0x23fb, 0x23fe) // Power Symbols - (0x2665, 0x2665) // Octicons - (0x26a1, 0x26a1) // Octicons - (0x2b58, 0x2b58) // Power Symbols - (0xe000, 0xe00a) // Pomicons - (0xe0a0, 0xe0a2) // Powerline Symbols - (0xe0a3, 0xe0a3) // Powerline Extra Symbols - (0xe0b0, 0xe0b3) // Powerline Symbols - (0xe0b4, 0xe0c8) // Powerline Extra Symbols - (0xe0ca, 0xe0ca) // Powerline Extra Symbols - (0xe0cc, 0xe0d4) // Powerline Extra Symbols - (0xe200, 0xe2a9) // Font Awesome Extension - (0xe300, 0xe3e3) // Weather - (0xe5fa, 0xe62e) // Custom + Seti - (0xe700, 0xe7c5) // Devicons - (0xf000, 0xf2e0) // Font Awesome - (0xf300, 0xf31c) // Font Logos (Font Linux) - (0xf400, 0xf4a8) // Octicons - (0xf500, 0xfd46) // Material + (0x23fbu, 0x23feu) // Power Symbols + (0x2665u, 0x2665u) // Octicons + (0x26a1u, 0x26a1u) // Octicons + (0x2b58u, 0x2b58u) // Power Symbols + (0xe000u, 0xe00au) // Pomicons + (0xe0a0u, 0xe0a2u) // Powerline Symbols + (0xe0a3u, 0xe0a3u) // Powerline Extra Symbols + (0xe0b0u, 0xe0b3u) // Powerline Symbols + (0xe0b4u, 0xe0c8u) // Powerline Extra Symbols + (0xe0cau, 0xe0cau) // Powerline Extra Symbols + (0xe0ccu, 0xe0d4u) // Powerline Extra Symbols + (0xe200u, 0xe2a9u) // Font Awesome Extension + (0xe300u, 0xe3e3u) // Weather + (0xe5fau, 0xe62eu) // Custom + Seti + (0xe700u, 0xe7c5u) // Devicons + (0xf000u, 0xf2e0u) // Font Awesome + (0xf300u, 0xf31cu) // Font Logos (Font Linux) + (0xf400u, 0xf4a8u) // Octicons + (0xf500u, 0xfd46u) // Material |] -let private intable (table: (int*int)[]) (ucs: int) = +let private intable (table: (uint*uint)[]) (ucs: uint) = let rec intable_impl lower upper = if lower > upper then false else @@ -541,34 +541,33 @@ type CharType = | Nerd = 4 | Emoji = 5 -let wcwidth(ucs: int) = +let wcwidth(ucs: uint) = // NOTE: created by hand, there isn't anything identifiable other than // general Cf category code to identify these, and some characters in Cf // category code are of non-zero width. - if ucs = 0 || ucs = 0x034F || (0x200B <= ucs && ucs <= 0x200F) || - ucs = 0x2028 || ucs = 0x2029 || (0x202A <= ucs && ucs <= 0x202E) || - (0x2060 <= ucs && ucs <= 0x2063) then CharType.Invisible + if ucs = 0u || ucs = 0x034Fu || (0x200Bu <= ucs && ucs <= 0x200Fu) || + ucs = 0x2028u || ucs = 0x2029u || (0x202Au <= ucs && ucs <= 0x202Eu) || + (0x2060u <= ucs && ucs <= 0x2063u) then CharType.Invisible // C0/C1 control characters. - elif ucs < 32 || (0x07F <= ucs && ucs < 0x0A0) then CharType.Control + elif ucs < 32u || (0x07Fu <= ucs && ucs < 0x0A0u) then CharType.Control // neovim uses these in drawing the UI - elif ucs = 0x2502 || ucs = 0x2630 || ucs = 0x2026 then CharType.Narrow + elif ucs = 0x2502u || ucs = 0x2630u || ucs = 0x2026u then CharType.Narrow // ASCII-7 - elif ucs < 0x7F then CharType.Narrow - elif intable Emoji ucs then CharType.Emoji - elif intable Powerline ucs then CharType.Powerline - elif intable NerdFont ucs then CharType.Nerd - elif intable WideEastAsian ucs then CharType.Wide + elif ucs < 0x7Fu then CharType.Narrow + elif intable Emoji ucs then CharType.Emoji + elif intable Powerline ucs then CharType.Powerline + elif intable NerdFont ucs then CharType.Nerd + elif intable WideEastAsian ucs then CharType.Wide // Combining characters with zero width. - elif intable ZeroWidth ucs then CharType.Invisible + elif intable ZeroWidth ucs then CharType.Invisible else (*trace "wcwidth" "unknown codepoint: %c (%X)" (char ucs) (ucs)*) CharType.Narrow let wswidth = function - | { c1 = c1; c2 = c2; isSurrogatePair = true } -> wcwidth (0x10000 + (int c1 - 0xD800) * 0x400 + (int c2 - 0xDC00)) | { c1 = c1 } when System.Char.IsWhiteSpace c1 -> CharType.Invisible - | { c1 = c1 } -> wcwidth <| int c1 + | x -> wcwidth x.Codepoint /// /// true if the string could be a part of a programming