this repo has no description
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

First effort

authored by

David Sancho Moreno and committed by jon.recoil.org 40157de5 409ca81b

+2467 -16
+2 -2
src/markdown2/config.ml
··· 1 1 (* Markdown output configuration *) 2 2 3 - type t = { root_url : string option } 3 + type t = { root_url : string option; allow_html : bool } 4 4 5 - let v ~root_url () = { root_url } 5 + let make ~root_url ~allow_html () = { root_url; allow_html }
+652
src/markdown2/data_uchar.ml
··· 1 + (*--------------------------------------------------------------------------- 2 + Copyright (c) 2024 The cmarkit programmers. All rights reserved. 3 + SPDX-License-Identifier: ISC 4 + ---------------------------------------------------------------------------*) 5 + 6 + 7 + let unicode_version = "16.0.0" 8 + 9 + let [@ocamlformat "disable"] whitespace = 10 + [|0x0009; 0x000A; 0x000C; 0x000D; 0x0020; 0x00A0; 0x1680; 0x2000; 0x2001; 11 + 0x2002; 0x2003; 0x2004; 0x2005; 0x2006; 0x2007; 0x2008; 0x2009; 0x200A; 12 + 0x202F; 0x205F; 0x3000|] 13 + 14 + let [@ocamlformat "disable"] punctuation = 15 + [|0x0021; 0x0022; 0x0023; 0x0024; 0x0025; 0x0026; 0x0027; 0x0028; 0x0029; 16 + 0x002A; 0x002B; 0x002C; 0x002D; 0x002E; 0x002F; 0x003A; 0x003B; 0x003C; 17 + 0x003D; 0x003E; 0x003F; 0x0040; 0x005B; 0x005C; 0x005D; 0x005E; 0x005F; 18 + 0x0060; 0x007B; 0x007C; 0x007D; 0x007E; 0x00A1; 0x00A7; 0x00AB; 0x00B6; 19 + 0x00B7; 0x00BB; 0x00BF; 0x037E; 0x0387; 0x055A; 0x055B; 0x055C; 0x055D; 20 + 0x055E; 0x055F; 0x0589; 0x058A; 0x05BE; 0x05C0; 0x05C3; 0x05C6; 0x05F3; 21 + 0x05F4; 0x0609; 0x060A; 0x060C; 0x060D; 0x061B; 0x061D; 0x061E; 0x061F; 22 + 0x066A; 0x066B; 0x066C; 0x066D; 0x06D4; 0x0700; 0x0701; 0x0702; 0x0703; 23 + 0x0704; 0x0705; 0x0706; 0x0707; 0x0708; 0x0709; 0x070A; 0x070B; 0x070C; 24 + 0x070D; 0x07F7; 0x07F8; 0x07F9; 0x0830; 0x0831; 0x0832; 0x0833; 0x0834; 25 + 0x0835; 0x0836; 0x0837; 0x0838; 0x0839; 0x083A; 0x083B; 0x083C; 0x083D; 26 + 0x083E; 0x085E; 0x0964; 0x0965; 0x0970; 0x09FD; 0x0A76; 0x0AF0; 0x0C77; 27 + 0x0C84; 0x0DF4; 0x0E4F; 0x0E5A; 0x0E5B; 0x0F04; 0x0F05; 0x0F06; 0x0F07; 28 + 0x0F08; 0x0F09; 0x0F0A; 0x0F0B; 0x0F0C; 0x0F0D; 0x0F0E; 0x0F0F; 0x0F10; 29 + 0x0F11; 0x0F12; 0x0F14; 0x0F3A; 0x0F3B; 0x0F3C; 0x0F3D; 0x0F85; 0x0FD0; 30 + 0x0FD1; 0x0FD2; 0x0FD3; 0x0FD4; 0x0FD9; 0x0FDA; 0x104A; 0x104B; 0x104C; 31 + 0x104D; 0x104E; 0x104F; 0x10FB; 0x1360; 0x1361; 0x1362; 0x1363; 0x1364; 32 + 0x1365; 0x1366; 0x1367; 0x1368; 0x1400; 0x166E; 0x169B; 0x169C; 0x16EB; 33 + 0x16EC; 0x16ED; 0x1735; 0x1736; 0x17D4; 0x17D5; 0x17D6; 0x17D8; 0x17D9; 34 + 0x17DA; 0x1800; 0x1801; 0x1802; 0x1803; 0x1804; 0x1805; 0x1806; 0x1807; 35 + 0x1808; 0x1809; 0x180A; 0x1944; 0x1945; 0x1A1E; 0x1A1F; 0x1AA0; 0x1AA1; 36 + 0x1AA2; 0x1AA3; 0x1AA4; 0x1AA5; 0x1AA6; 0x1AA8; 0x1AA9; 0x1AAA; 0x1AAB; 37 + 0x1AAC; 0x1AAD; 0x1B4E; 0x1B4F; 0x1B5A; 0x1B5B; 0x1B5C; 0x1B5D; 0x1B5E; 38 + 0x1B5F; 0x1B60; 0x1B7D; 0x1B7E; 0x1B7F; 0x1BFC; 0x1BFD; 0x1BFE; 0x1BFF; 39 + 0x1C3B; 0x1C3C; 0x1C3D; 0x1C3E; 0x1C3F; 0x1C7E; 0x1C7F; 0x1CC0; 0x1CC1; 40 + 0x1CC2; 0x1CC3; 0x1CC4; 0x1CC5; 0x1CC6; 0x1CC7; 0x1CD3; 0x2010; 0x2011; 41 + 0x2012; 0x2013; 0x2014; 0x2015; 0x2016; 0x2017; 0x2018; 0x2019; 0x201A; 42 + 0x201B; 0x201C; 0x201D; 0x201E; 0x201F; 0x2020; 0x2021; 0x2022; 0x2023; 43 + 0x2024; 0x2025; 0x2026; 0x2027; 0x2030; 0x2031; 0x2032; 0x2033; 0x2034; 44 + 0x2035; 0x2036; 0x2037; 0x2038; 0x2039; 0x203A; 0x203B; 0x203C; 0x203D; 45 + 0x203E; 0x203F; 0x2040; 0x2041; 0x2042; 0x2043; 0x2045; 0x2046; 0x2047; 46 + 0x2048; 0x2049; 0x204A; 0x204B; 0x204C; 0x204D; 0x204E; 0x204F; 0x2050; 47 + 0x2051; 0x2053; 0x2054; 0x2055; 0x2056; 0x2057; 0x2058; 0x2059; 0x205A; 48 + 0x205B; 0x205C; 0x205D; 0x205E; 0x207D; 0x207E; 0x208D; 0x208E; 0x2308; 49 + 0x2309; 0x230A; 0x230B; 0x2329; 0x232A; 0x2768; 0x2769; 0x276A; 0x276B; 50 + 0x276C; 0x276D; 0x276E; 0x276F; 0x2770; 0x2771; 0x2772; 0x2773; 0x2774; 51 + 0x2775; 0x27C5; 0x27C6; 0x27E6; 0x27E7; 0x27E8; 0x27E9; 0x27EA; 0x27EB; 52 + 0x27EC; 0x27ED; 0x27EE; 0x27EF; 0x2983; 0x2984; 0x2985; 0x2986; 0x2987; 53 + 0x2988; 0x2989; 0x298A; 0x298B; 0x298C; 0x298D; 0x298E; 0x298F; 0x2990; 54 + 0x2991; 0x2992; 0x2993; 0x2994; 0x2995; 0x2996; 0x2997; 0x2998; 0x29D8; 55 + 0x29D9; 0x29DA; 0x29DB; 0x29FC; 0x29FD; 0x2CF9; 0x2CFA; 0x2CFB; 0x2CFC; 56 + 0x2CFE; 0x2CFF; 0x2D70; 0x2E00; 0x2E01; 0x2E02; 0x2E03; 0x2E04; 0x2E05; 57 + 0x2E06; 0x2E07; 0x2E08; 0x2E09; 0x2E0A; 0x2E0B; 0x2E0C; 0x2E0D; 0x2E0E; 58 + 0x2E0F; 0x2E10; 0x2E11; 0x2E12; 0x2E13; 0x2E14; 0x2E15; 0x2E16; 0x2E17; 59 + 0x2E18; 0x2E19; 0x2E1A; 0x2E1B; 0x2E1C; 0x2E1D; 0x2E1E; 0x2E1F; 0x2E20; 60 + 0x2E21; 0x2E22; 0x2E23; 0x2E24; 0x2E25; 0x2E26; 0x2E27; 0x2E28; 0x2E29; 61 + 0x2E2A; 0x2E2B; 0x2E2C; 0x2E2D; 0x2E2E; 0x2E30; 0x2E31; 0x2E32; 0x2E33; 62 + 0x2E34; 0x2E35; 0x2E36; 0x2E37; 0x2E38; 0x2E39; 0x2E3A; 0x2E3B; 0x2E3C; 63 + 0x2E3D; 0x2E3E; 0x2E3F; 0x2E40; 0x2E41; 0x2E42; 0x2E43; 0x2E44; 0x2E45; 64 + 0x2E46; 0x2E47; 0x2E48; 0x2E49; 0x2E4A; 0x2E4B; 0x2E4C; 0x2E4D; 0x2E4E; 65 + 0x2E4F; 0x2E52; 0x2E53; 0x2E54; 0x2E55; 0x2E56; 0x2E57; 0x2E58; 0x2E59; 66 + 0x2E5A; 0x2E5B; 0x2E5C; 0x2E5D; 0x3001; 0x3002; 0x3003; 0x3008; 0x3009; 67 + 0x300A; 0x300B; 0x300C; 0x300D; 0x300E; 0x300F; 0x3010; 0x3011; 0x3014; 68 + 0x3015; 0x3016; 0x3017; 0x3018; 0x3019; 0x301A; 0x301B; 0x301C; 0x301D; 69 + 0x301E; 0x301F; 0x3030; 0x303D; 0x30A0; 0x30FB; 0xA4FE; 0xA4FF; 0xA60D; 70 + 0xA60E; 0xA60F; 0xA673; 0xA67E; 0xA6F2; 0xA6F3; 0xA6F4; 0xA6F5; 0xA6F6; 71 + 0xA6F7; 0xA874; 0xA875; 0xA876; 0xA877; 0xA8CE; 0xA8CF; 0xA8F8; 0xA8F9; 72 + 0xA8FA; 0xA8FC; 0xA92E; 0xA92F; 0xA95F; 0xA9C1; 0xA9C2; 0xA9C3; 0xA9C4; 73 + 0xA9C5; 0xA9C6; 0xA9C7; 0xA9C8; 0xA9C9; 0xA9CA; 0xA9CB; 0xA9CC; 0xA9CD; 74 + 0xA9DE; 0xA9DF; 0xAA5C; 0xAA5D; 0xAA5E; 0xAA5F; 0xAADE; 0xAADF; 0xAAF0; 75 + 0xAAF1; 0xABEB; 0xFD3E; 0xFD3F; 0xFE10; 0xFE11; 0xFE12; 0xFE13; 0xFE14; 76 + 0xFE15; 0xFE16; 0xFE17; 0xFE18; 0xFE19; 0xFE30; 0xFE31; 0xFE32; 0xFE33; 77 + 0xFE34; 0xFE35; 0xFE36; 0xFE37; 0xFE38; 0xFE39; 0xFE3A; 0xFE3B; 0xFE3C; 78 + 0xFE3D; 0xFE3E; 0xFE3F; 0xFE40; 0xFE41; 0xFE42; 0xFE43; 0xFE44; 0xFE45; 79 + 0xFE46; 0xFE47; 0xFE48; 0xFE49; 0xFE4A; 0xFE4B; 0xFE4C; 0xFE4D; 0xFE4E; 80 + 0xFE4F; 0xFE50; 0xFE51; 0xFE52; 0xFE54; 0xFE55; 0xFE56; 0xFE57; 0xFE58; 81 + 0xFE59; 0xFE5A; 0xFE5B; 0xFE5C; 0xFE5D; 0xFE5E; 0xFE5F; 0xFE60; 0xFE61; 82 + 0xFE63; 0xFE68; 0xFE6A; 0xFE6B; 0xFF01; 0xFF02; 0xFF03; 0xFF05; 0xFF06; 83 + 0xFF07; 0xFF08; 0xFF09; 0xFF0A; 0xFF0C; 0xFF0D; 0xFF0E; 0xFF0F; 0xFF1A; 84 + 0xFF1B; 0xFF1F; 0xFF20; 0xFF3B; 0xFF3C; 0xFF3D; 0xFF3F; 0xFF5B; 0xFF5D; 85 + 0xFF5F; 0xFF60; 0xFF61; 0xFF62; 0xFF63; 0xFF64; 0xFF65; 0x10100; 0x10101; 86 + 0x10102; 0x1039F; 0x103D0; 0x1056F; 0x10857; 0x1091F; 0x1093F; 0x10A50; 87 + 0x10A51; 0x10A52; 0x10A53; 0x10A54; 0x10A55; 0x10A56; 0x10A57; 0x10A58; 88 + 0x10A7F; 0x10AF0; 0x10AF1; 0x10AF2; 0x10AF3; 0x10AF4; 0x10AF5; 0x10AF6; 89 + 0x10B39; 0x10B3A; 0x10B3B; 0x10B3C; 0x10B3D; 0x10B3E; 0x10B3F; 0x10B99; 90 + 0x10B9A; 0x10B9B; 0x10B9C; 0x10D6E; 0x10EAD; 0x10F55; 0x10F56; 0x10F57; 91 + 0x10F58; 0x10F59; 0x10F86; 0x10F87; 0x10F88; 0x10F89; 0x11047; 0x11048; 92 + 0x11049; 0x1104A; 0x1104B; 0x1104C; 0x1104D; 0x110BB; 0x110BC; 0x110BE; 93 + 0x110BF; 0x110C0; 0x110C1; 0x11140; 0x11141; 0x11142; 0x11143; 0x11174; 94 + 0x11175; 0x111C5; 0x111C6; 0x111C7; 0x111C8; 0x111CD; 0x111DB; 0x111DD; 95 + 0x111DE; 0x111DF; 0x11238; 0x11239; 0x1123A; 0x1123B; 0x1123C; 0x1123D; 96 + 0x112A9; 0x113D4; 0x113D5; 0x113D7; 0x113D8; 0x1144B; 0x1144C; 0x1144D; 97 + 0x1144E; 0x1144F; 0x1145A; 0x1145B; 0x1145D; 0x114C6; 0x115C1; 0x115C2; 98 + 0x115C3; 0x115C4; 0x115C5; 0x115C6; 0x115C7; 0x115C8; 0x115C9; 0x115CA; 99 + 0x115CB; 0x115CC; 0x115CD; 0x115CE; 0x115CF; 0x115D0; 0x115D1; 0x115D2; 100 + 0x115D3; 0x115D4; 0x115D5; 0x115D6; 0x115D7; 0x11641; 0x11642; 0x11643; 101 + 0x11660; 0x11661; 0x11662; 0x11663; 0x11664; 0x11665; 0x11666; 0x11667; 102 + 0x11668; 0x11669; 0x1166A; 0x1166B; 0x1166C; 0x116B9; 0x1173C; 0x1173D; 103 + 0x1173E; 0x1183B; 0x11944; 0x11945; 0x11946; 0x119E2; 0x11A3F; 0x11A40; 104 + 0x11A41; 0x11A42; 0x11A43; 0x11A44; 0x11A45; 0x11A46; 0x11A9A; 0x11A9B; 105 + 0x11A9C; 0x11A9E; 0x11A9F; 0x11AA0; 0x11AA1; 0x11AA2; 0x11B00; 0x11B01; 106 + 0x11B02; 0x11B03; 0x11B04; 0x11B05; 0x11B06; 0x11B07; 0x11B08; 0x11B09; 107 + 0x11BE1; 0x11C41; 0x11C42; 0x11C43; 0x11C44; 0x11C45; 0x11C70; 0x11C71; 108 + 0x11EF7; 0x11EF8; 0x11F43; 0x11F44; 0x11F45; 0x11F46; 0x11F47; 0x11F48; 109 + 0x11F49; 0x11F4A; 0x11F4B; 0x11F4C; 0x11F4D; 0x11F4E; 0x11F4F; 0x11FFF; 110 + 0x12470; 0x12471; 0x12472; 0x12473; 0x12474; 0x12FF1; 0x12FF2; 0x16A6E; 111 + 0x16A6F; 0x16AF5; 0x16B37; 0x16B38; 0x16B39; 0x16B3A; 0x16B3B; 0x16B44; 112 + 0x16D6D; 0x16D6E; 0x16D6F; 0x16E97; 0x16E98; 0x16E99; 0x16E9A; 0x16FE2; 113 + 0x1BC9F; 0x1DA87; 0x1DA88; 0x1DA89; 0x1DA8A; 0x1DA8B; 0x1E5FF; 0x1E95E; 114 + 0x1E95F|] 115 + 116 + let case_fold = 117 + [|0x0041, "\u{0061}"; 0x0042, "\u{0062}"; 0x0043, "\u{0063}"; 118 + 0x0044, "\u{0064}"; 0x0045, "\u{0065}"; 0x0046, "\u{0066}"; 119 + 0x0047, "\u{0067}"; 0x0048, "\u{0068}"; 0x0049, "\u{0069}"; 120 + 0x004A, "\u{006A}"; 0x004B, "\u{006B}"; 0x004C, "\u{006C}"; 121 + 0x004D, "\u{006D}"; 0x004E, "\u{006E}"; 0x004F, "\u{006F}"; 122 + 0x0050, "\u{0070}"; 0x0051, "\u{0071}"; 0x0052, "\u{0072}"; 123 + 0x0053, "\u{0073}"; 0x0054, "\u{0074}"; 0x0055, "\u{0075}"; 124 + 0x0056, "\u{0076}"; 0x0057, "\u{0077}"; 0x0058, "\u{0078}"; 125 + 0x0059, "\u{0079}"; 0x005A, "\u{007A}"; 0x00B5, "\u{03BC}"; 126 + 0x00C0, "\u{00E0}"; 0x00C1, "\u{00E1}"; 0x00C2, "\u{00E2}"; 127 + 0x00C3, "\u{00E3}"; 0x00C4, "\u{00E4}"; 0x00C5, "\u{00E5}"; 128 + 0x00C6, "\u{00E6}"; 0x00C7, "\u{00E7}"; 0x00C8, "\u{00E8}"; 129 + 0x00C9, "\u{00E9}"; 0x00CA, "\u{00EA}"; 0x00CB, "\u{00EB}"; 130 + 0x00CC, "\u{00EC}"; 0x00CD, "\u{00ED}"; 0x00CE, "\u{00EE}"; 131 + 0x00CF, "\u{00EF}"; 0x00D0, "\u{00F0}"; 0x00D1, "\u{00F1}"; 132 + 0x00D2, "\u{00F2}"; 0x00D3, "\u{00F3}"; 0x00D4, "\u{00F4}"; 133 + 0x00D5, "\u{00F5}"; 0x00D6, "\u{00F6}"; 0x00D8, "\u{00F8}"; 134 + 0x00D9, "\u{00F9}"; 0x00DA, "\u{00FA}"; 0x00DB, "\u{00FB}"; 135 + 0x00DC, "\u{00FC}"; 0x00DD, "\u{00FD}"; 0x00DE, "\u{00FE}"; 136 + 0x00DF, "\u{0073}\u{0073}"; 0x0100, "\u{0101}"; 0x0102, "\u{0103}"; 137 + 0x0104, "\u{0105}"; 0x0106, "\u{0107}"; 0x0108, "\u{0109}"; 138 + 0x010A, "\u{010B}"; 0x010C, "\u{010D}"; 0x010E, "\u{010F}"; 139 + 0x0110, "\u{0111}"; 0x0112, "\u{0113}"; 0x0114, "\u{0115}"; 140 + 0x0116, "\u{0117}"; 0x0118, "\u{0119}"; 0x011A, "\u{011B}"; 141 + 0x011C, "\u{011D}"; 0x011E, "\u{011F}"; 0x0120, "\u{0121}"; 142 + 0x0122, "\u{0123}"; 0x0124, "\u{0125}"; 0x0126, "\u{0127}"; 143 + 0x0128, "\u{0129}"; 0x012A, "\u{012B}"; 0x012C, "\u{012D}"; 144 + 0x012E, "\u{012F}"; 0x0130, "\u{0069}\u{0307}"; 0x0132, "\u{0133}"; 145 + 0x0134, "\u{0135}"; 0x0136, "\u{0137}"; 0x0139, "\u{013A}"; 146 + 0x013B, "\u{013C}"; 0x013D, "\u{013E}"; 0x013F, "\u{0140}"; 147 + 0x0141, "\u{0142}"; 0x0143, "\u{0144}"; 0x0145, "\u{0146}"; 148 + 0x0147, "\u{0148}"; 0x0149, "\u{02BC}\u{006E}"; 0x014A, "\u{014B}"; 149 + 0x014C, "\u{014D}"; 0x014E, "\u{014F}"; 0x0150, "\u{0151}"; 150 + 0x0152, "\u{0153}"; 0x0154, "\u{0155}"; 0x0156, "\u{0157}"; 151 + 0x0158, "\u{0159}"; 0x015A, "\u{015B}"; 0x015C, "\u{015D}"; 152 + 0x015E, "\u{015F}"; 0x0160, "\u{0161}"; 0x0162, "\u{0163}"; 153 + 0x0164, "\u{0165}"; 0x0166, "\u{0167}"; 0x0168, "\u{0169}"; 154 + 0x016A, "\u{016B}"; 0x016C, "\u{016D}"; 0x016E, "\u{016F}"; 155 + 0x0170, "\u{0171}"; 0x0172, "\u{0173}"; 0x0174, "\u{0175}"; 156 + 0x0176, "\u{0177}"; 0x0178, "\u{00FF}"; 0x0179, "\u{017A}"; 157 + 0x017B, "\u{017C}"; 0x017D, "\u{017E}"; 0x017F, "\u{0073}"; 158 + 0x0181, "\u{0253}"; 0x0182, "\u{0183}"; 0x0184, "\u{0185}"; 159 + 0x0186, "\u{0254}"; 0x0187, "\u{0188}"; 0x0189, "\u{0256}"; 160 + 0x018A, "\u{0257}"; 0x018B, "\u{018C}"; 0x018E, "\u{01DD}"; 161 + 0x018F, "\u{0259}"; 0x0190, "\u{025B}"; 0x0191, "\u{0192}"; 162 + 0x0193, "\u{0260}"; 0x0194, "\u{0263}"; 0x0196, "\u{0269}"; 163 + 0x0197, "\u{0268}"; 0x0198, "\u{0199}"; 0x019C, "\u{026F}"; 164 + 0x019D, "\u{0272}"; 0x019F, "\u{0275}"; 0x01A0, "\u{01A1}"; 165 + 0x01A2, "\u{01A3}"; 0x01A4, "\u{01A5}"; 0x01A6, "\u{0280}"; 166 + 0x01A7, "\u{01A8}"; 0x01A9, "\u{0283}"; 0x01AC, "\u{01AD}"; 167 + 0x01AE, "\u{0288}"; 0x01AF, "\u{01B0}"; 0x01B1, "\u{028A}"; 168 + 0x01B2, "\u{028B}"; 0x01B3, "\u{01B4}"; 0x01B5, "\u{01B6}"; 169 + 0x01B7, "\u{0292}"; 0x01B8, "\u{01B9}"; 0x01BC, "\u{01BD}"; 170 + 0x01C4, "\u{01C6}"; 0x01C5, "\u{01C6}"; 0x01C7, "\u{01C9}"; 171 + 0x01C8, "\u{01C9}"; 0x01CA, "\u{01CC}"; 0x01CB, "\u{01CC}"; 172 + 0x01CD, "\u{01CE}"; 0x01CF, "\u{01D0}"; 0x01D1, "\u{01D2}"; 173 + 0x01D3, "\u{01D4}"; 0x01D5, "\u{01D6}"; 0x01D7, "\u{01D8}"; 174 + 0x01D9, "\u{01DA}"; 0x01DB, "\u{01DC}"; 0x01DE, "\u{01DF}"; 175 + 0x01E0, "\u{01E1}"; 0x01E2, "\u{01E3}"; 0x01E4, "\u{01E5}"; 176 + 0x01E6, "\u{01E7}"; 0x01E8, "\u{01E9}"; 0x01EA, "\u{01EB}"; 177 + 0x01EC, "\u{01ED}"; 0x01EE, "\u{01EF}"; 0x01F0, "\u{006A}\u{030C}"; 178 + 0x01F1, "\u{01F3}"; 0x01F2, "\u{01F3}"; 0x01F4, "\u{01F5}"; 179 + 0x01F6, "\u{0195}"; 0x01F7, "\u{01BF}"; 0x01F8, "\u{01F9}"; 180 + 0x01FA, "\u{01FB}"; 0x01FC, "\u{01FD}"; 0x01FE, "\u{01FF}"; 181 + 0x0200, "\u{0201}"; 0x0202, "\u{0203}"; 0x0204, "\u{0205}"; 182 + 0x0206, "\u{0207}"; 0x0208, "\u{0209}"; 0x020A, "\u{020B}"; 183 + 0x020C, "\u{020D}"; 0x020E, "\u{020F}"; 0x0210, "\u{0211}"; 184 + 0x0212, "\u{0213}"; 0x0214, "\u{0215}"; 0x0216, "\u{0217}"; 185 + 0x0218, "\u{0219}"; 0x021A, "\u{021B}"; 0x021C, "\u{021D}"; 186 + 0x021E, "\u{021F}"; 0x0220, "\u{019E}"; 0x0222, "\u{0223}"; 187 + 0x0224, "\u{0225}"; 0x0226, "\u{0227}"; 0x0228, "\u{0229}"; 188 + 0x022A, "\u{022B}"; 0x022C, "\u{022D}"; 0x022E, "\u{022F}"; 189 + 0x0230, "\u{0231}"; 0x0232, "\u{0233}"; 0x023A, "\u{2C65}"; 190 + 0x023B, "\u{023C}"; 0x023D, "\u{019A}"; 0x023E, "\u{2C66}"; 191 + 0x0241, "\u{0242}"; 0x0243, "\u{0180}"; 0x0244, "\u{0289}"; 192 + 0x0245, "\u{028C}"; 0x0246, "\u{0247}"; 0x0248, "\u{0249}"; 193 + 0x024A, "\u{024B}"; 0x024C, "\u{024D}"; 0x024E, "\u{024F}"; 194 + 0x0345, "\u{03B9}"; 0x0370, "\u{0371}"; 0x0372, "\u{0373}"; 195 + 0x0376, "\u{0377}"; 0x037F, "\u{03F3}"; 0x0386, "\u{03AC}"; 196 + 0x0388, "\u{03AD}"; 0x0389, "\u{03AE}"; 0x038A, "\u{03AF}"; 197 + 0x038C, "\u{03CC}"; 0x038E, "\u{03CD}"; 0x038F, "\u{03CE}"; 198 + 0x0390, "\u{03B9}\u{0308}\u{0301}"; 0x0391, "\u{03B1}"; 199 + 0x0392, "\u{03B2}"; 0x0393, "\u{03B3}"; 0x0394, "\u{03B4}"; 200 + 0x0395, "\u{03B5}"; 0x0396, "\u{03B6}"; 0x0397, "\u{03B7}"; 201 + 0x0398, "\u{03B8}"; 0x0399, "\u{03B9}"; 0x039A, "\u{03BA}"; 202 + 0x039B, "\u{03BB}"; 0x039C, "\u{03BC}"; 0x039D, "\u{03BD}"; 203 + 0x039E, "\u{03BE}"; 0x039F, "\u{03BF}"; 0x03A0, "\u{03C0}"; 204 + 0x03A1, "\u{03C1}"; 0x03A3, "\u{03C3}"; 0x03A4, "\u{03C4}"; 205 + 0x03A5, "\u{03C5}"; 0x03A6, "\u{03C6}"; 0x03A7, "\u{03C7}"; 206 + 0x03A8, "\u{03C8}"; 0x03A9, "\u{03C9}"; 0x03AA, "\u{03CA}"; 207 + 0x03AB, "\u{03CB}"; 0x03B0, "\u{03C5}\u{0308}\u{0301}"; 208 + 0x03C2, "\u{03C3}"; 0x03CF, "\u{03D7}"; 0x03D0, "\u{03B2}"; 209 + 0x03D1, "\u{03B8}"; 0x03D5, "\u{03C6}"; 0x03D6, "\u{03C0}"; 210 + 0x03D8, "\u{03D9}"; 0x03DA, "\u{03DB}"; 0x03DC, "\u{03DD}"; 211 + 0x03DE, "\u{03DF}"; 0x03E0, "\u{03E1}"; 0x03E2, "\u{03E3}"; 212 + 0x03E4, "\u{03E5}"; 0x03E6, "\u{03E7}"; 0x03E8, "\u{03E9}"; 213 + 0x03EA, "\u{03EB}"; 0x03EC, "\u{03ED}"; 0x03EE, "\u{03EF}"; 214 + 0x03F0, "\u{03BA}"; 0x03F1, "\u{03C1}"; 0x03F4, "\u{03B8}"; 215 + 0x03F5, "\u{03B5}"; 0x03F7, "\u{03F8}"; 0x03F9, "\u{03F2}"; 216 + 0x03FA, "\u{03FB}"; 0x03FD, "\u{037B}"; 0x03FE, "\u{037C}"; 217 + 0x03FF, "\u{037D}"; 0x0400, "\u{0450}"; 0x0401, "\u{0451}"; 218 + 0x0402, "\u{0452}"; 0x0403, "\u{0453}"; 0x0404, "\u{0454}"; 219 + 0x0405, "\u{0455}"; 0x0406, "\u{0456}"; 0x0407, "\u{0457}"; 220 + 0x0408, "\u{0458}"; 0x0409, "\u{0459}"; 0x040A, "\u{045A}"; 221 + 0x040B, "\u{045B}"; 0x040C, "\u{045C}"; 0x040D, "\u{045D}"; 222 + 0x040E, "\u{045E}"; 0x040F, "\u{045F}"; 0x0410, "\u{0430}"; 223 + 0x0411, "\u{0431}"; 0x0412, "\u{0432}"; 0x0413, "\u{0433}"; 224 + 0x0414, "\u{0434}"; 0x0415, "\u{0435}"; 0x0416, "\u{0436}"; 225 + 0x0417, "\u{0437}"; 0x0418, "\u{0438}"; 0x0419, "\u{0439}"; 226 + 0x041A, "\u{043A}"; 0x041B, "\u{043B}"; 0x041C, "\u{043C}"; 227 + 0x041D, "\u{043D}"; 0x041E, "\u{043E}"; 0x041F, "\u{043F}"; 228 + 0x0420, "\u{0440}"; 0x0421, "\u{0441}"; 0x0422, "\u{0442}"; 229 + 0x0423, "\u{0443}"; 0x0424, "\u{0444}"; 0x0425, "\u{0445}"; 230 + 0x0426, "\u{0446}"; 0x0427, "\u{0447}"; 0x0428, "\u{0448}"; 231 + 0x0429, "\u{0449}"; 0x042A, "\u{044A}"; 0x042B, "\u{044B}"; 232 + 0x042C, "\u{044C}"; 0x042D, "\u{044D}"; 0x042E, "\u{044E}"; 233 + 0x042F, "\u{044F}"; 0x0460, "\u{0461}"; 0x0462, "\u{0463}"; 234 + 0x0464, "\u{0465}"; 0x0466, "\u{0467}"; 0x0468, "\u{0469}"; 235 + 0x046A, "\u{046B}"; 0x046C, "\u{046D}"; 0x046E, "\u{046F}"; 236 + 0x0470, "\u{0471}"; 0x0472, "\u{0473}"; 0x0474, "\u{0475}"; 237 + 0x0476, "\u{0477}"; 0x0478, "\u{0479}"; 0x047A, "\u{047B}"; 238 + 0x047C, "\u{047D}"; 0x047E, "\u{047F}"; 0x0480, "\u{0481}"; 239 + 0x048A, "\u{048B}"; 0x048C, "\u{048D}"; 0x048E, "\u{048F}"; 240 + 0x0490, "\u{0491}"; 0x0492, "\u{0493}"; 0x0494, "\u{0495}"; 241 + 0x0496, "\u{0497}"; 0x0498, "\u{0499}"; 0x049A, "\u{049B}"; 242 + 0x049C, "\u{049D}"; 0x049E, "\u{049F}"; 0x04A0, "\u{04A1}"; 243 + 0x04A2, "\u{04A3}"; 0x04A4, "\u{04A5}"; 0x04A6, "\u{04A7}"; 244 + 0x04A8, "\u{04A9}"; 0x04AA, "\u{04AB}"; 0x04AC, "\u{04AD}"; 245 + 0x04AE, "\u{04AF}"; 0x04B0, "\u{04B1}"; 0x04B2, "\u{04B3}"; 246 + 0x04B4, "\u{04B5}"; 0x04B6, "\u{04B7}"; 0x04B8, "\u{04B9}"; 247 + 0x04BA, "\u{04BB}"; 0x04BC, "\u{04BD}"; 0x04BE, "\u{04BF}"; 248 + 0x04C0, "\u{04CF}"; 0x04C1, "\u{04C2}"; 0x04C3, "\u{04C4}"; 249 + 0x04C5, "\u{04C6}"; 0x04C7, "\u{04C8}"; 0x04C9, "\u{04CA}"; 250 + 0x04CB, "\u{04CC}"; 0x04CD, "\u{04CE}"; 0x04D0, "\u{04D1}"; 251 + 0x04D2, "\u{04D3}"; 0x04D4, "\u{04D5}"; 0x04D6, "\u{04D7}"; 252 + 0x04D8, "\u{04D9}"; 0x04DA, "\u{04DB}"; 0x04DC, "\u{04DD}"; 253 + 0x04DE, "\u{04DF}"; 0x04E0, "\u{04E1}"; 0x04E2, "\u{04E3}"; 254 + 0x04E4, "\u{04E5}"; 0x04E6, "\u{04E7}"; 0x04E8, "\u{04E9}"; 255 + 0x04EA, "\u{04EB}"; 0x04EC, "\u{04ED}"; 0x04EE, "\u{04EF}"; 256 + 0x04F0, "\u{04F1}"; 0x04F2, "\u{04F3}"; 0x04F4, "\u{04F5}"; 257 + 0x04F6, "\u{04F7}"; 0x04F8, "\u{04F9}"; 0x04FA, "\u{04FB}"; 258 + 0x04FC, "\u{04FD}"; 0x04FE, "\u{04FF}"; 0x0500, "\u{0501}"; 259 + 0x0502, "\u{0503}"; 0x0504, "\u{0505}"; 0x0506, "\u{0507}"; 260 + 0x0508, "\u{0509}"; 0x050A, "\u{050B}"; 0x050C, "\u{050D}"; 261 + 0x050E, "\u{050F}"; 0x0510, "\u{0511}"; 0x0512, "\u{0513}"; 262 + 0x0514, "\u{0515}"; 0x0516, "\u{0517}"; 0x0518, "\u{0519}"; 263 + 0x051A, "\u{051B}"; 0x051C, "\u{051D}"; 0x051E, "\u{051F}"; 264 + 0x0520, "\u{0521}"; 0x0522, "\u{0523}"; 0x0524, "\u{0525}"; 265 + 0x0526, "\u{0527}"; 0x0528, "\u{0529}"; 0x052A, "\u{052B}"; 266 + 0x052C, "\u{052D}"; 0x052E, "\u{052F}"; 0x0531, "\u{0561}"; 267 + 0x0532, "\u{0562}"; 0x0533, "\u{0563}"; 0x0534, "\u{0564}"; 268 + 0x0535, "\u{0565}"; 0x0536, "\u{0566}"; 0x0537, "\u{0567}"; 269 + 0x0538, "\u{0568}"; 0x0539, "\u{0569}"; 0x053A, "\u{056A}"; 270 + 0x053B, "\u{056B}"; 0x053C, "\u{056C}"; 0x053D, "\u{056D}"; 271 + 0x053E, "\u{056E}"; 0x053F, "\u{056F}"; 0x0540, "\u{0570}"; 272 + 0x0541, "\u{0571}"; 0x0542, "\u{0572}"; 0x0543, "\u{0573}"; 273 + 0x0544, "\u{0574}"; 0x0545, "\u{0575}"; 0x0546, "\u{0576}"; 274 + 0x0547, "\u{0577}"; 0x0548, "\u{0578}"; 0x0549, "\u{0579}"; 275 + 0x054A, "\u{057A}"; 0x054B, "\u{057B}"; 0x054C, "\u{057C}"; 276 + 0x054D, "\u{057D}"; 0x054E, "\u{057E}"; 0x054F, "\u{057F}"; 277 + 0x0550, "\u{0580}"; 0x0551, "\u{0581}"; 0x0552, "\u{0582}"; 278 + 0x0553, "\u{0583}"; 0x0554, "\u{0584}"; 0x0555, "\u{0585}"; 279 + 0x0556, "\u{0586}"; 0x0587, "\u{0565}\u{0582}"; 0x10A0, "\u{2D00}"; 280 + 0x10A1, "\u{2D01}"; 0x10A2, "\u{2D02}"; 0x10A3, "\u{2D03}"; 281 + 0x10A4, "\u{2D04}"; 0x10A5, "\u{2D05}"; 0x10A6, "\u{2D06}"; 282 + 0x10A7, "\u{2D07}"; 0x10A8, "\u{2D08}"; 0x10A9, "\u{2D09}"; 283 + 0x10AA, "\u{2D0A}"; 0x10AB, "\u{2D0B}"; 0x10AC, "\u{2D0C}"; 284 + 0x10AD, "\u{2D0D}"; 0x10AE, "\u{2D0E}"; 0x10AF, "\u{2D0F}"; 285 + 0x10B0, "\u{2D10}"; 0x10B1, "\u{2D11}"; 0x10B2, "\u{2D12}"; 286 + 0x10B3, "\u{2D13}"; 0x10B4, "\u{2D14}"; 0x10B5, "\u{2D15}"; 287 + 0x10B6, "\u{2D16}"; 0x10B7, "\u{2D17}"; 0x10B8, "\u{2D18}"; 288 + 0x10B9, "\u{2D19}"; 0x10BA, "\u{2D1A}"; 0x10BB, "\u{2D1B}"; 289 + 0x10BC, "\u{2D1C}"; 0x10BD, "\u{2D1D}"; 0x10BE, "\u{2D1E}"; 290 + 0x10BF, "\u{2D1F}"; 0x10C0, "\u{2D20}"; 0x10C1, "\u{2D21}"; 291 + 0x10C2, "\u{2D22}"; 0x10C3, "\u{2D23}"; 0x10C4, "\u{2D24}"; 292 + 0x10C5, "\u{2D25}"; 0x10C7, "\u{2D27}"; 0x10CD, "\u{2D2D}"; 293 + 0x13F8, "\u{13F0}"; 0x13F9, "\u{13F1}"; 0x13FA, "\u{13F2}"; 294 + 0x13FB, "\u{13F3}"; 0x13FC, "\u{13F4}"; 0x13FD, "\u{13F5}"; 295 + 0x1C80, "\u{0432}"; 0x1C81, "\u{0434}"; 0x1C82, "\u{043E}"; 296 + 0x1C83, "\u{0441}"; 0x1C84, "\u{0442}"; 0x1C85, "\u{0442}"; 297 + 0x1C86, "\u{044A}"; 0x1C87, "\u{0463}"; 0x1C88, "\u{A64B}"; 298 + 0x1C89, "\u{1C8A}"; 0x1C90, "\u{10D0}"; 0x1C91, "\u{10D1}"; 299 + 0x1C92, "\u{10D2}"; 0x1C93, "\u{10D3}"; 0x1C94, "\u{10D4}"; 300 + 0x1C95, "\u{10D5}"; 0x1C96, "\u{10D6}"; 0x1C97, "\u{10D7}"; 301 + 0x1C98, "\u{10D8}"; 0x1C99, "\u{10D9}"; 0x1C9A, "\u{10DA}"; 302 + 0x1C9B, "\u{10DB}"; 0x1C9C, "\u{10DC}"; 0x1C9D, "\u{10DD}"; 303 + 0x1C9E, "\u{10DE}"; 0x1C9F, "\u{10DF}"; 0x1CA0, "\u{10E0}"; 304 + 0x1CA1, "\u{10E1}"; 0x1CA2, "\u{10E2}"; 0x1CA3, "\u{10E3}"; 305 + 0x1CA4, "\u{10E4}"; 0x1CA5, "\u{10E5}"; 0x1CA6, "\u{10E6}"; 306 + 0x1CA7, "\u{10E7}"; 0x1CA8, "\u{10E8}"; 0x1CA9, "\u{10E9}"; 307 + 0x1CAA, "\u{10EA}"; 0x1CAB, "\u{10EB}"; 0x1CAC, "\u{10EC}"; 308 + 0x1CAD, "\u{10ED}"; 0x1CAE, "\u{10EE}"; 0x1CAF, "\u{10EF}"; 309 + 0x1CB0, "\u{10F0}"; 0x1CB1, "\u{10F1}"; 0x1CB2, "\u{10F2}"; 310 + 0x1CB3, "\u{10F3}"; 0x1CB4, "\u{10F4}"; 0x1CB5, "\u{10F5}"; 311 + 0x1CB6, "\u{10F6}"; 0x1CB7, "\u{10F7}"; 0x1CB8, "\u{10F8}"; 312 + 0x1CB9, "\u{10F9}"; 0x1CBA, "\u{10FA}"; 0x1CBD, "\u{10FD}"; 313 + 0x1CBE, "\u{10FE}"; 0x1CBF, "\u{10FF}"; 0x1E00, "\u{1E01}"; 314 + 0x1E02, "\u{1E03}"; 0x1E04, "\u{1E05}"; 0x1E06, "\u{1E07}"; 315 + 0x1E08, "\u{1E09}"; 0x1E0A, "\u{1E0B}"; 0x1E0C, "\u{1E0D}"; 316 + 0x1E0E, "\u{1E0F}"; 0x1E10, "\u{1E11}"; 0x1E12, "\u{1E13}"; 317 + 0x1E14, "\u{1E15}"; 0x1E16, "\u{1E17}"; 0x1E18, "\u{1E19}"; 318 + 0x1E1A, "\u{1E1B}"; 0x1E1C, "\u{1E1D}"; 0x1E1E, "\u{1E1F}"; 319 + 0x1E20, "\u{1E21}"; 0x1E22, "\u{1E23}"; 0x1E24, "\u{1E25}"; 320 + 0x1E26, "\u{1E27}"; 0x1E28, "\u{1E29}"; 0x1E2A, "\u{1E2B}"; 321 + 0x1E2C, "\u{1E2D}"; 0x1E2E, "\u{1E2F}"; 0x1E30, "\u{1E31}"; 322 + 0x1E32, "\u{1E33}"; 0x1E34, "\u{1E35}"; 0x1E36, "\u{1E37}"; 323 + 0x1E38, "\u{1E39}"; 0x1E3A, "\u{1E3B}"; 0x1E3C, "\u{1E3D}"; 324 + 0x1E3E, "\u{1E3F}"; 0x1E40, "\u{1E41}"; 0x1E42, "\u{1E43}"; 325 + 0x1E44, "\u{1E45}"; 0x1E46, "\u{1E47}"; 0x1E48, "\u{1E49}"; 326 + 0x1E4A, "\u{1E4B}"; 0x1E4C, "\u{1E4D}"; 0x1E4E, "\u{1E4F}"; 327 + 0x1E50, "\u{1E51}"; 0x1E52, "\u{1E53}"; 0x1E54, "\u{1E55}"; 328 + 0x1E56, "\u{1E57}"; 0x1E58, "\u{1E59}"; 0x1E5A, "\u{1E5B}"; 329 + 0x1E5C, "\u{1E5D}"; 0x1E5E, "\u{1E5F}"; 0x1E60, "\u{1E61}"; 330 + 0x1E62, "\u{1E63}"; 0x1E64, "\u{1E65}"; 0x1E66, "\u{1E67}"; 331 + 0x1E68, "\u{1E69}"; 0x1E6A, "\u{1E6B}"; 0x1E6C, "\u{1E6D}"; 332 + 0x1E6E, "\u{1E6F}"; 0x1E70, "\u{1E71}"; 0x1E72, "\u{1E73}"; 333 + 0x1E74, "\u{1E75}"; 0x1E76, "\u{1E77}"; 0x1E78, "\u{1E79}"; 334 + 0x1E7A, "\u{1E7B}"; 0x1E7C, "\u{1E7D}"; 0x1E7E, "\u{1E7F}"; 335 + 0x1E80, "\u{1E81}"; 0x1E82, "\u{1E83}"; 0x1E84, "\u{1E85}"; 336 + 0x1E86, "\u{1E87}"; 0x1E88, "\u{1E89}"; 0x1E8A, "\u{1E8B}"; 337 + 0x1E8C, "\u{1E8D}"; 0x1E8E, "\u{1E8F}"; 0x1E90, "\u{1E91}"; 338 + 0x1E92, "\u{1E93}"; 0x1E94, "\u{1E95}"; 0x1E96, "\u{0068}\u{0331}"; 339 + 0x1E97, "\u{0074}\u{0308}"; 0x1E98, "\u{0077}\u{030A}"; 340 + 0x1E99, "\u{0079}\u{030A}"; 0x1E9A, "\u{0061}\u{02BE}"; 341 + 0x1E9B, "\u{1E61}"; 0x1E9E, "\u{0073}\u{0073}"; 0x1EA0, "\u{1EA1}"; 342 + 0x1EA2, "\u{1EA3}"; 0x1EA4, "\u{1EA5}"; 0x1EA6, "\u{1EA7}"; 343 + 0x1EA8, "\u{1EA9}"; 0x1EAA, "\u{1EAB}"; 0x1EAC, "\u{1EAD}"; 344 + 0x1EAE, "\u{1EAF}"; 0x1EB0, "\u{1EB1}"; 0x1EB2, "\u{1EB3}"; 345 + 0x1EB4, "\u{1EB5}"; 0x1EB6, "\u{1EB7}"; 0x1EB8, "\u{1EB9}"; 346 + 0x1EBA, "\u{1EBB}"; 0x1EBC, "\u{1EBD}"; 0x1EBE, "\u{1EBF}"; 347 + 0x1EC0, "\u{1EC1}"; 0x1EC2, "\u{1EC3}"; 0x1EC4, "\u{1EC5}"; 348 + 0x1EC6, "\u{1EC7}"; 0x1EC8, "\u{1EC9}"; 0x1ECA, "\u{1ECB}"; 349 + 0x1ECC, "\u{1ECD}"; 0x1ECE, "\u{1ECF}"; 0x1ED0, "\u{1ED1}"; 350 + 0x1ED2, "\u{1ED3}"; 0x1ED4, "\u{1ED5}"; 0x1ED6, "\u{1ED7}"; 351 + 0x1ED8, "\u{1ED9}"; 0x1EDA, "\u{1EDB}"; 0x1EDC, "\u{1EDD}"; 352 + 0x1EDE, "\u{1EDF}"; 0x1EE0, "\u{1EE1}"; 0x1EE2, "\u{1EE3}"; 353 + 0x1EE4, "\u{1EE5}"; 0x1EE6, "\u{1EE7}"; 0x1EE8, "\u{1EE9}"; 354 + 0x1EEA, "\u{1EEB}"; 0x1EEC, "\u{1EED}"; 0x1EEE, "\u{1EEF}"; 355 + 0x1EF0, "\u{1EF1}"; 0x1EF2, "\u{1EF3}"; 0x1EF4, "\u{1EF5}"; 356 + 0x1EF6, "\u{1EF7}"; 0x1EF8, "\u{1EF9}"; 0x1EFA, "\u{1EFB}"; 357 + 0x1EFC, "\u{1EFD}"; 0x1EFE, "\u{1EFF}"; 0x1F08, "\u{1F00}"; 358 + 0x1F09, "\u{1F01}"; 0x1F0A, "\u{1F02}"; 0x1F0B, "\u{1F03}"; 359 + 0x1F0C, "\u{1F04}"; 0x1F0D, "\u{1F05}"; 0x1F0E, "\u{1F06}"; 360 + 0x1F0F, "\u{1F07}"; 0x1F18, "\u{1F10}"; 0x1F19, "\u{1F11}"; 361 + 0x1F1A, "\u{1F12}"; 0x1F1B, "\u{1F13}"; 0x1F1C, "\u{1F14}"; 362 + 0x1F1D, "\u{1F15}"; 0x1F28, "\u{1F20}"; 0x1F29, "\u{1F21}"; 363 + 0x1F2A, "\u{1F22}"; 0x1F2B, "\u{1F23}"; 0x1F2C, "\u{1F24}"; 364 + 0x1F2D, "\u{1F25}"; 0x1F2E, "\u{1F26}"; 0x1F2F, "\u{1F27}"; 365 + 0x1F38, "\u{1F30}"; 0x1F39, "\u{1F31}"; 0x1F3A, "\u{1F32}"; 366 + 0x1F3B, "\u{1F33}"; 0x1F3C, "\u{1F34}"; 0x1F3D, "\u{1F35}"; 367 + 0x1F3E, "\u{1F36}"; 0x1F3F, "\u{1F37}"; 0x1F48, "\u{1F40}"; 368 + 0x1F49, "\u{1F41}"; 0x1F4A, "\u{1F42}"; 0x1F4B, "\u{1F43}"; 369 + 0x1F4C, "\u{1F44}"; 0x1F4D, "\u{1F45}"; 0x1F50, "\u{03C5}\u{0313}"; 370 + 0x1F52, "\u{03C5}\u{0313}\u{0300}"; 0x1F54, "\u{03C5}\u{0313}\u{0301}"; 371 + 0x1F56, "\u{03C5}\u{0313}\u{0342}"; 0x1F59, "\u{1F51}"; 372 + 0x1F5B, "\u{1F53}"; 0x1F5D, "\u{1F55}"; 0x1F5F, "\u{1F57}"; 373 + 0x1F68, "\u{1F60}"; 0x1F69, "\u{1F61}"; 0x1F6A, "\u{1F62}"; 374 + 0x1F6B, "\u{1F63}"; 0x1F6C, "\u{1F64}"; 0x1F6D, "\u{1F65}"; 375 + 0x1F6E, "\u{1F66}"; 0x1F6F, "\u{1F67}"; 0x1F80, "\u{1F00}\u{03B9}"; 376 + 0x1F81, "\u{1F01}\u{03B9}"; 0x1F82, "\u{1F02}\u{03B9}"; 377 + 0x1F83, "\u{1F03}\u{03B9}"; 0x1F84, "\u{1F04}\u{03B9}"; 378 + 0x1F85, "\u{1F05}\u{03B9}"; 0x1F86, "\u{1F06}\u{03B9}"; 379 + 0x1F87, "\u{1F07}\u{03B9}"; 0x1F88, "\u{1F00}\u{03B9}"; 380 + 0x1F89, "\u{1F01}\u{03B9}"; 0x1F8A, "\u{1F02}\u{03B9}"; 381 + 0x1F8B, "\u{1F03}\u{03B9}"; 0x1F8C, "\u{1F04}\u{03B9}"; 382 + 0x1F8D, "\u{1F05}\u{03B9}"; 0x1F8E, "\u{1F06}\u{03B9}"; 383 + 0x1F8F, "\u{1F07}\u{03B9}"; 0x1F90, "\u{1F20}\u{03B9}"; 384 + 0x1F91, "\u{1F21}\u{03B9}"; 0x1F92, "\u{1F22}\u{03B9}"; 385 + 0x1F93, "\u{1F23}\u{03B9}"; 0x1F94, "\u{1F24}\u{03B9}"; 386 + 0x1F95, "\u{1F25}\u{03B9}"; 0x1F96, "\u{1F26}\u{03B9}"; 387 + 0x1F97, "\u{1F27}\u{03B9}"; 0x1F98, "\u{1F20}\u{03B9}"; 388 + 0x1F99, "\u{1F21}\u{03B9}"; 0x1F9A, "\u{1F22}\u{03B9}"; 389 + 0x1F9B, "\u{1F23}\u{03B9}"; 0x1F9C, "\u{1F24}\u{03B9}"; 390 + 0x1F9D, "\u{1F25}\u{03B9}"; 0x1F9E, "\u{1F26}\u{03B9}"; 391 + 0x1F9F, "\u{1F27}\u{03B9}"; 0x1FA0, "\u{1F60}\u{03B9}"; 392 + 0x1FA1, "\u{1F61}\u{03B9}"; 0x1FA2, "\u{1F62}\u{03B9}"; 393 + 0x1FA3, "\u{1F63}\u{03B9}"; 0x1FA4, "\u{1F64}\u{03B9}"; 394 + 0x1FA5, "\u{1F65}\u{03B9}"; 0x1FA6, "\u{1F66}\u{03B9}"; 395 + 0x1FA7, "\u{1F67}\u{03B9}"; 0x1FA8, "\u{1F60}\u{03B9}"; 396 + 0x1FA9, "\u{1F61}\u{03B9}"; 0x1FAA, "\u{1F62}\u{03B9}"; 397 + 0x1FAB, "\u{1F63}\u{03B9}"; 0x1FAC, "\u{1F64}\u{03B9}"; 398 + 0x1FAD, "\u{1F65}\u{03B9}"; 0x1FAE, "\u{1F66}\u{03B9}"; 399 + 0x1FAF, "\u{1F67}\u{03B9}"; 0x1FB2, "\u{1F70}\u{03B9}"; 400 + 0x1FB3, "\u{03B1}\u{03B9}"; 0x1FB4, "\u{03AC}\u{03B9}"; 401 + 0x1FB6, "\u{03B1}\u{0342}"; 0x1FB7, "\u{03B1}\u{0342}\u{03B9}"; 402 + 0x1FB8, "\u{1FB0}"; 0x1FB9, "\u{1FB1}"; 0x1FBA, "\u{1F70}"; 403 + 0x1FBB, "\u{1F71}"; 0x1FBC, "\u{03B1}\u{03B9}"; 0x1FBE, "\u{03B9}"; 404 + 0x1FC2, "\u{1F74}\u{03B9}"; 0x1FC3, "\u{03B7}\u{03B9}"; 405 + 0x1FC4, "\u{03AE}\u{03B9}"; 0x1FC6, "\u{03B7}\u{0342}"; 406 + 0x1FC7, "\u{03B7}\u{0342}\u{03B9}"; 0x1FC8, "\u{1F72}"; 407 + 0x1FC9, "\u{1F73}"; 0x1FCA, "\u{1F74}"; 0x1FCB, "\u{1F75}"; 408 + 0x1FCC, "\u{03B7}\u{03B9}"; 0x1FD2, "\u{03B9}\u{0308}\u{0300}"; 409 + 0x1FD3, "\u{03B9}\u{0308}\u{0301}"; 0x1FD6, "\u{03B9}\u{0342}"; 410 + 0x1FD7, "\u{03B9}\u{0308}\u{0342}"; 0x1FD8, "\u{1FD0}"; 411 + 0x1FD9, "\u{1FD1}"; 0x1FDA, "\u{1F76}"; 0x1FDB, "\u{1F77}"; 412 + 0x1FE2, "\u{03C5}\u{0308}\u{0300}"; 0x1FE3, "\u{03C5}\u{0308}\u{0301}"; 413 + 0x1FE4, "\u{03C1}\u{0313}"; 0x1FE6, "\u{03C5}\u{0342}"; 414 + 0x1FE7, "\u{03C5}\u{0308}\u{0342}"; 0x1FE8, "\u{1FE0}"; 415 + 0x1FE9, "\u{1FE1}"; 0x1FEA, "\u{1F7A}"; 0x1FEB, "\u{1F7B}"; 416 + 0x1FEC, "\u{1FE5}"; 0x1FF2, "\u{1F7C}\u{03B9}"; 417 + 0x1FF3, "\u{03C9}\u{03B9}"; 0x1FF4, "\u{03CE}\u{03B9}"; 418 + 0x1FF6, "\u{03C9}\u{0342}"; 0x1FF7, "\u{03C9}\u{0342}\u{03B9}"; 419 + 0x1FF8, "\u{1F78}"; 0x1FF9, "\u{1F79}"; 0x1FFA, "\u{1F7C}"; 420 + 0x1FFB, "\u{1F7D}"; 0x1FFC, "\u{03C9}\u{03B9}"; 0x2126, "\u{03C9}"; 421 + 0x212A, "\u{006B}"; 0x212B, "\u{00E5}"; 0x2132, "\u{214E}"; 422 + 0x2160, "\u{2170}"; 0x2161, "\u{2171}"; 0x2162, "\u{2172}"; 423 + 0x2163, "\u{2173}"; 0x2164, "\u{2174}"; 0x2165, "\u{2175}"; 424 + 0x2166, "\u{2176}"; 0x2167, "\u{2177}"; 0x2168, "\u{2178}"; 425 + 0x2169, "\u{2179}"; 0x216A, "\u{217A}"; 0x216B, "\u{217B}"; 426 + 0x216C, "\u{217C}"; 0x216D, "\u{217D}"; 0x216E, "\u{217E}"; 427 + 0x216F, "\u{217F}"; 0x2183, "\u{2184}"; 0x24B6, "\u{24D0}"; 428 + 0x24B7, "\u{24D1}"; 0x24B8, "\u{24D2}"; 0x24B9, "\u{24D3}"; 429 + 0x24BA, "\u{24D4}"; 0x24BB, "\u{24D5}"; 0x24BC, "\u{24D6}"; 430 + 0x24BD, "\u{24D7}"; 0x24BE, "\u{24D8}"; 0x24BF, "\u{24D9}"; 431 + 0x24C0, "\u{24DA}"; 0x24C1, "\u{24DB}"; 0x24C2, "\u{24DC}"; 432 + 0x24C3, "\u{24DD}"; 0x24C4, "\u{24DE}"; 0x24C5, "\u{24DF}"; 433 + 0x24C6, "\u{24E0}"; 0x24C7, "\u{24E1}"; 0x24C8, "\u{24E2}"; 434 + 0x24C9, "\u{24E3}"; 0x24CA, "\u{24E4}"; 0x24CB, "\u{24E5}"; 435 + 0x24CC, "\u{24E6}"; 0x24CD, "\u{24E7}"; 0x24CE, "\u{24E8}"; 436 + 0x24CF, "\u{24E9}"; 0x2C00, "\u{2C30}"; 0x2C01, "\u{2C31}"; 437 + 0x2C02, "\u{2C32}"; 0x2C03, "\u{2C33}"; 0x2C04, "\u{2C34}"; 438 + 0x2C05, "\u{2C35}"; 0x2C06, "\u{2C36}"; 0x2C07, "\u{2C37}"; 439 + 0x2C08, "\u{2C38}"; 0x2C09, "\u{2C39}"; 0x2C0A, "\u{2C3A}"; 440 + 0x2C0B, "\u{2C3B}"; 0x2C0C, "\u{2C3C}"; 0x2C0D, "\u{2C3D}"; 441 + 0x2C0E, "\u{2C3E}"; 0x2C0F, "\u{2C3F}"; 0x2C10, "\u{2C40}"; 442 + 0x2C11, "\u{2C41}"; 0x2C12, "\u{2C42}"; 0x2C13, "\u{2C43}"; 443 + 0x2C14, "\u{2C44}"; 0x2C15, "\u{2C45}"; 0x2C16, "\u{2C46}"; 444 + 0x2C17, "\u{2C47}"; 0x2C18, "\u{2C48}"; 0x2C19, "\u{2C49}"; 445 + 0x2C1A, "\u{2C4A}"; 0x2C1B, "\u{2C4B}"; 0x2C1C, "\u{2C4C}"; 446 + 0x2C1D, "\u{2C4D}"; 0x2C1E, "\u{2C4E}"; 0x2C1F, "\u{2C4F}"; 447 + 0x2C20, "\u{2C50}"; 0x2C21, "\u{2C51}"; 0x2C22, "\u{2C52}"; 448 + 0x2C23, "\u{2C53}"; 0x2C24, "\u{2C54}"; 0x2C25, "\u{2C55}"; 449 + 0x2C26, "\u{2C56}"; 0x2C27, "\u{2C57}"; 0x2C28, "\u{2C58}"; 450 + 0x2C29, "\u{2C59}"; 0x2C2A, "\u{2C5A}"; 0x2C2B, "\u{2C5B}"; 451 + 0x2C2C, "\u{2C5C}"; 0x2C2D, "\u{2C5D}"; 0x2C2E, "\u{2C5E}"; 452 + 0x2C2F, "\u{2C5F}"; 0x2C60, "\u{2C61}"; 0x2C62, "\u{026B}"; 453 + 0x2C63, "\u{1D7D}"; 0x2C64, "\u{027D}"; 0x2C67, "\u{2C68}"; 454 + 0x2C69, "\u{2C6A}"; 0x2C6B, "\u{2C6C}"; 0x2C6D, "\u{0251}"; 455 + 0x2C6E, "\u{0271}"; 0x2C6F, "\u{0250}"; 0x2C70, "\u{0252}"; 456 + 0x2C72, "\u{2C73}"; 0x2C75, "\u{2C76}"; 0x2C7E, "\u{023F}"; 457 + 0x2C7F, "\u{0240}"; 0x2C80, "\u{2C81}"; 0x2C82, "\u{2C83}"; 458 + 0x2C84, "\u{2C85}"; 0x2C86, "\u{2C87}"; 0x2C88, "\u{2C89}"; 459 + 0x2C8A, "\u{2C8B}"; 0x2C8C, "\u{2C8D}"; 0x2C8E, "\u{2C8F}"; 460 + 0x2C90, "\u{2C91}"; 0x2C92, "\u{2C93}"; 0x2C94, "\u{2C95}"; 461 + 0x2C96, "\u{2C97}"; 0x2C98, "\u{2C99}"; 0x2C9A, "\u{2C9B}"; 462 + 0x2C9C, "\u{2C9D}"; 0x2C9E, "\u{2C9F}"; 0x2CA0, "\u{2CA1}"; 463 + 0x2CA2, "\u{2CA3}"; 0x2CA4, "\u{2CA5}"; 0x2CA6, "\u{2CA7}"; 464 + 0x2CA8, "\u{2CA9}"; 0x2CAA, "\u{2CAB}"; 0x2CAC, "\u{2CAD}"; 465 + 0x2CAE, "\u{2CAF}"; 0x2CB0, "\u{2CB1}"; 0x2CB2, "\u{2CB3}"; 466 + 0x2CB4, "\u{2CB5}"; 0x2CB6, "\u{2CB7}"; 0x2CB8, "\u{2CB9}"; 467 + 0x2CBA, "\u{2CBB}"; 0x2CBC, "\u{2CBD}"; 0x2CBE, "\u{2CBF}"; 468 + 0x2CC0, "\u{2CC1}"; 0x2CC2, "\u{2CC3}"; 0x2CC4, "\u{2CC5}"; 469 + 0x2CC6, "\u{2CC7}"; 0x2CC8, "\u{2CC9}"; 0x2CCA, "\u{2CCB}"; 470 + 0x2CCC, "\u{2CCD}"; 0x2CCE, "\u{2CCF}"; 0x2CD0, "\u{2CD1}"; 471 + 0x2CD2, "\u{2CD3}"; 0x2CD4, "\u{2CD5}"; 0x2CD6, "\u{2CD7}"; 472 + 0x2CD8, "\u{2CD9}"; 0x2CDA, "\u{2CDB}"; 0x2CDC, "\u{2CDD}"; 473 + 0x2CDE, "\u{2CDF}"; 0x2CE0, "\u{2CE1}"; 0x2CE2, "\u{2CE3}"; 474 + 0x2CEB, "\u{2CEC}"; 0x2CED, "\u{2CEE}"; 0x2CF2, "\u{2CF3}"; 475 + 0xA640, "\u{A641}"; 0xA642, "\u{A643}"; 0xA644, "\u{A645}"; 476 + 0xA646, "\u{A647}"; 0xA648, "\u{A649}"; 0xA64A, "\u{A64B}"; 477 + 0xA64C, "\u{A64D}"; 0xA64E, "\u{A64F}"; 0xA650, "\u{A651}"; 478 + 0xA652, "\u{A653}"; 0xA654, "\u{A655}"; 0xA656, "\u{A657}"; 479 + 0xA658, "\u{A659}"; 0xA65A, "\u{A65B}"; 0xA65C, "\u{A65D}"; 480 + 0xA65E, "\u{A65F}"; 0xA660, "\u{A661}"; 0xA662, "\u{A663}"; 481 + 0xA664, "\u{A665}"; 0xA666, "\u{A667}"; 0xA668, "\u{A669}"; 482 + 0xA66A, "\u{A66B}"; 0xA66C, "\u{A66D}"; 0xA680, "\u{A681}"; 483 + 0xA682, "\u{A683}"; 0xA684, "\u{A685}"; 0xA686, "\u{A687}"; 484 + 0xA688, "\u{A689}"; 0xA68A, "\u{A68B}"; 0xA68C, "\u{A68D}"; 485 + 0xA68E, "\u{A68F}"; 0xA690, "\u{A691}"; 0xA692, "\u{A693}"; 486 + 0xA694, "\u{A695}"; 0xA696, "\u{A697}"; 0xA698, "\u{A699}"; 487 + 0xA69A, "\u{A69B}"; 0xA722, "\u{A723}"; 0xA724, "\u{A725}"; 488 + 0xA726, "\u{A727}"; 0xA728, "\u{A729}"; 0xA72A, "\u{A72B}"; 489 + 0xA72C, "\u{A72D}"; 0xA72E, "\u{A72F}"; 0xA732, "\u{A733}"; 490 + 0xA734, "\u{A735}"; 0xA736, "\u{A737}"; 0xA738, "\u{A739}"; 491 + 0xA73A, "\u{A73B}"; 0xA73C, "\u{A73D}"; 0xA73E, "\u{A73F}"; 492 + 0xA740, "\u{A741}"; 0xA742, "\u{A743}"; 0xA744, "\u{A745}"; 493 + 0xA746, "\u{A747}"; 0xA748, "\u{A749}"; 0xA74A, "\u{A74B}"; 494 + 0xA74C, "\u{A74D}"; 0xA74E, "\u{A74F}"; 0xA750, "\u{A751}"; 495 + 0xA752, "\u{A753}"; 0xA754, "\u{A755}"; 0xA756, "\u{A757}"; 496 + 0xA758, "\u{A759}"; 0xA75A, "\u{A75B}"; 0xA75C, "\u{A75D}"; 497 + 0xA75E, "\u{A75F}"; 0xA760, "\u{A761}"; 0xA762, "\u{A763}"; 498 + 0xA764, "\u{A765}"; 0xA766, "\u{A767}"; 0xA768, "\u{A769}"; 499 + 0xA76A, "\u{A76B}"; 0xA76C, "\u{A76D}"; 0xA76E, "\u{A76F}"; 500 + 0xA779, "\u{A77A}"; 0xA77B, "\u{A77C}"; 0xA77D, "\u{1D79}"; 501 + 0xA77E, "\u{A77F}"; 0xA780, "\u{A781}"; 0xA782, "\u{A783}"; 502 + 0xA784, "\u{A785}"; 0xA786, "\u{A787}"; 0xA78B, "\u{A78C}"; 503 + 0xA78D, "\u{0265}"; 0xA790, "\u{A791}"; 0xA792, "\u{A793}"; 504 + 0xA796, "\u{A797}"; 0xA798, "\u{A799}"; 0xA79A, "\u{A79B}"; 505 + 0xA79C, "\u{A79D}"; 0xA79E, "\u{A79F}"; 0xA7A0, "\u{A7A1}"; 506 + 0xA7A2, "\u{A7A3}"; 0xA7A4, "\u{A7A5}"; 0xA7A6, "\u{A7A7}"; 507 + 0xA7A8, "\u{A7A9}"; 0xA7AA, "\u{0266}"; 0xA7AB, "\u{025C}"; 508 + 0xA7AC, "\u{0261}"; 0xA7AD, "\u{026C}"; 0xA7AE, "\u{026A}"; 509 + 0xA7B0, "\u{029E}"; 0xA7B1, "\u{0287}"; 0xA7B2, "\u{029D}"; 510 + 0xA7B3, "\u{AB53}"; 0xA7B4, "\u{A7B5}"; 0xA7B6, "\u{A7B7}"; 511 + 0xA7B8, "\u{A7B9}"; 0xA7BA, "\u{A7BB}"; 0xA7BC, "\u{A7BD}"; 512 + 0xA7BE, "\u{A7BF}"; 0xA7C0, "\u{A7C1}"; 0xA7C2, "\u{A7C3}"; 513 + 0xA7C4, "\u{A794}"; 0xA7C5, "\u{0282}"; 0xA7C6, "\u{1D8E}"; 514 + 0xA7C7, "\u{A7C8}"; 0xA7C9, "\u{A7CA}"; 0xA7CB, "\u{0264}"; 515 + 0xA7CC, "\u{A7CD}"; 0xA7D0, "\u{A7D1}"; 0xA7D6, "\u{A7D7}"; 516 + 0xA7D8, "\u{A7D9}"; 0xA7DA, "\u{A7DB}"; 0xA7DC, "\u{019B}"; 517 + 0xA7F5, "\u{A7F6}"; 0xAB70, "\u{13A0}"; 0xAB71, "\u{13A1}"; 518 + 0xAB72, "\u{13A2}"; 0xAB73, "\u{13A3}"; 0xAB74, "\u{13A4}"; 519 + 0xAB75, "\u{13A5}"; 0xAB76, "\u{13A6}"; 0xAB77, "\u{13A7}"; 520 + 0xAB78, "\u{13A8}"; 0xAB79, "\u{13A9}"; 0xAB7A, "\u{13AA}"; 521 + 0xAB7B, "\u{13AB}"; 0xAB7C, "\u{13AC}"; 0xAB7D, "\u{13AD}"; 522 + 0xAB7E, "\u{13AE}"; 0xAB7F, "\u{13AF}"; 0xAB80, "\u{13B0}"; 523 + 0xAB81, "\u{13B1}"; 0xAB82, "\u{13B2}"; 0xAB83, "\u{13B3}"; 524 + 0xAB84, "\u{13B4}"; 0xAB85, "\u{13B5}"; 0xAB86, "\u{13B6}"; 525 + 0xAB87, "\u{13B7}"; 0xAB88, "\u{13B8}"; 0xAB89, "\u{13B9}"; 526 + 0xAB8A, "\u{13BA}"; 0xAB8B, "\u{13BB}"; 0xAB8C, "\u{13BC}"; 527 + 0xAB8D, "\u{13BD}"; 0xAB8E, "\u{13BE}"; 0xAB8F, "\u{13BF}"; 528 + 0xAB90, "\u{13C0}"; 0xAB91, "\u{13C1}"; 0xAB92, "\u{13C2}"; 529 + 0xAB93, "\u{13C3}"; 0xAB94, "\u{13C4}"; 0xAB95, "\u{13C5}"; 530 + 0xAB96, "\u{13C6}"; 0xAB97, "\u{13C7}"; 0xAB98, "\u{13C8}"; 531 + 0xAB99, "\u{13C9}"; 0xAB9A, "\u{13CA}"; 0xAB9B, "\u{13CB}"; 532 + 0xAB9C, "\u{13CC}"; 0xAB9D, "\u{13CD}"; 0xAB9E, "\u{13CE}"; 533 + 0xAB9F, "\u{13CF}"; 0xABA0, "\u{13D0}"; 0xABA1, "\u{13D1}"; 534 + 0xABA2, "\u{13D2}"; 0xABA3, "\u{13D3}"; 0xABA4, "\u{13D4}"; 535 + 0xABA5, "\u{13D5}"; 0xABA6, "\u{13D6}"; 0xABA7, "\u{13D7}"; 536 + 0xABA8, "\u{13D8}"; 0xABA9, "\u{13D9}"; 0xABAA, "\u{13DA}"; 537 + 0xABAB, "\u{13DB}"; 0xABAC, "\u{13DC}"; 0xABAD, "\u{13DD}"; 538 + 0xABAE, "\u{13DE}"; 0xABAF, "\u{13DF}"; 0xABB0, "\u{13E0}"; 539 + 0xABB1, "\u{13E1}"; 0xABB2, "\u{13E2}"; 0xABB3, "\u{13E3}"; 540 + 0xABB4, "\u{13E4}"; 0xABB5, "\u{13E5}"; 0xABB6, "\u{13E6}"; 541 + 0xABB7, "\u{13E7}"; 0xABB8, "\u{13E8}"; 0xABB9, "\u{13E9}"; 542 + 0xABBA, "\u{13EA}"; 0xABBB, "\u{13EB}"; 0xABBC, "\u{13EC}"; 543 + 0xABBD, "\u{13ED}"; 0xABBE, "\u{13EE}"; 0xABBF, "\u{13EF}"; 544 + 0xFB00, "\u{0066}\u{0066}"; 0xFB01, "\u{0066}\u{0069}"; 545 + 0xFB02, "\u{0066}\u{006C}"; 0xFB03, "\u{0066}\u{0066}\u{0069}"; 546 + 0xFB04, "\u{0066}\u{0066}\u{006C}"; 0xFB05, "\u{0073}\u{0074}"; 547 + 0xFB06, "\u{0073}\u{0074}"; 0xFB13, "\u{0574}\u{0576}"; 548 + 0xFB14, "\u{0574}\u{0565}"; 0xFB15, "\u{0574}\u{056B}"; 549 + 0xFB16, "\u{057E}\u{0576}"; 0xFB17, "\u{0574}\u{056D}"; 550 + 0xFF21, "\u{FF41}"; 0xFF22, "\u{FF42}"; 0xFF23, "\u{FF43}"; 551 + 0xFF24, "\u{FF44}"; 0xFF25, "\u{FF45}"; 0xFF26, "\u{FF46}"; 552 + 0xFF27, "\u{FF47}"; 0xFF28, "\u{FF48}"; 0xFF29, "\u{FF49}"; 553 + 0xFF2A, "\u{FF4A}"; 0xFF2B, "\u{FF4B}"; 0xFF2C, "\u{FF4C}"; 554 + 0xFF2D, "\u{FF4D}"; 0xFF2E, "\u{FF4E}"; 0xFF2F, "\u{FF4F}"; 555 + 0xFF30, "\u{FF50}"; 0xFF31, "\u{FF51}"; 0xFF32, "\u{FF52}"; 556 + 0xFF33, "\u{FF53}"; 0xFF34, "\u{FF54}"; 0xFF35, "\u{FF55}"; 557 + 0xFF36, "\u{FF56}"; 0xFF37, "\u{FF57}"; 0xFF38, "\u{FF58}"; 558 + 0xFF39, "\u{FF59}"; 0xFF3A, "\u{FF5A}"; 0x10400, "\u{10428}"; 559 + 0x10401, "\u{10429}"; 0x10402, "\u{1042A}"; 0x10403, "\u{1042B}"; 560 + 0x10404, "\u{1042C}"; 0x10405, "\u{1042D}"; 0x10406, "\u{1042E}"; 561 + 0x10407, "\u{1042F}"; 0x10408, "\u{10430}"; 0x10409, "\u{10431}"; 562 + 0x1040A, "\u{10432}"; 0x1040B, "\u{10433}"; 0x1040C, "\u{10434}"; 563 + 0x1040D, "\u{10435}"; 0x1040E, "\u{10436}"; 0x1040F, "\u{10437}"; 564 + 0x10410, "\u{10438}"; 0x10411, "\u{10439}"; 0x10412, "\u{1043A}"; 565 + 0x10413, "\u{1043B}"; 0x10414, "\u{1043C}"; 0x10415, "\u{1043D}"; 566 + 0x10416, "\u{1043E}"; 0x10417, "\u{1043F}"; 0x10418, "\u{10440}"; 567 + 0x10419, "\u{10441}"; 0x1041A, "\u{10442}"; 0x1041B, "\u{10443}"; 568 + 0x1041C, "\u{10444}"; 0x1041D, "\u{10445}"; 0x1041E, "\u{10446}"; 569 + 0x1041F, "\u{10447}"; 0x10420, "\u{10448}"; 0x10421, "\u{10449}"; 570 + 0x10422, "\u{1044A}"; 0x10423, "\u{1044B}"; 0x10424, "\u{1044C}"; 571 + 0x10425, "\u{1044D}"; 0x10426, "\u{1044E}"; 0x10427, "\u{1044F}"; 572 + 0x104B0, "\u{104D8}"; 0x104B1, "\u{104D9}"; 0x104B2, "\u{104DA}"; 573 + 0x104B3, "\u{104DB}"; 0x104B4, "\u{104DC}"; 0x104B5, "\u{104DD}"; 574 + 0x104B6, "\u{104DE}"; 0x104B7, "\u{104DF}"; 0x104B8, "\u{104E0}"; 575 + 0x104B9, "\u{104E1}"; 0x104BA, "\u{104E2}"; 0x104BB, "\u{104E3}"; 576 + 0x104BC, "\u{104E4}"; 0x104BD, "\u{104E5}"; 0x104BE, "\u{104E6}"; 577 + 0x104BF, "\u{104E7}"; 0x104C0, "\u{104E8}"; 0x104C1, "\u{104E9}"; 578 + 0x104C2, "\u{104EA}"; 0x104C3, "\u{104EB}"; 0x104C4, "\u{104EC}"; 579 + 0x104C5, "\u{104ED}"; 0x104C6, "\u{104EE}"; 0x104C7, "\u{104EF}"; 580 + 0x104C8, "\u{104F0}"; 0x104C9, "\u{104F1}"; 0x104CA, "\u{104F2}"; 581 + 0x104CB, "\u{104F3}"; 0x104CC, "\u{104F4}"; 0x104CD, "\u{104F5}"; 582 + 0x104CE, "\u{104F6}"; 0x104CF, "\u{104F7}"; 0x104D0, "\u{104F8}"; 583 + 0x104D1, "\u{104F9}"; 0x104D2, "\u{104FA}"; 0x104D3, "\u{104FB}"; 584 + 0x10570, "\u{10597}"; 0x10571, "\u{10598}"; 0x10572, "\u{10599}"; 585 + 0x10573, "\u{1059A}"; 0x10574, "\u{1059B}"; 0x10575, "\u{1059C}"; 586 + 0x10576, "\u{1059D}"; 0x10577, "\u{1059E}"; 0x10578, "\u{1059F}"; 587 + 0x10579, "\u{105A0}"; 0x1057A, "\u{105A1}"; 0x1057C, "\u{105A3}"; 588 + 0x1057D, "\u{105A4}"; 0x1057E, "\u{105A5}"; 0x1057F, "\u{105A6}"; 589 + 0x10580, "\u{105A7}"; 0x10581, "\u{105A8}"; 0x10582, "\u{105A9}"; 590 + 0x10583, "\u{105AA}"; 0x10584, "\u{105AB}"; 0x10585, "\u{105AC}"; 591 + 0x10586, "\u{105AD}"; 0x10587, "\u{105AE}"; 0x10588, "\u{105AF}"; 592 + 0x10589, "\u{105B0}"; 0x1058A, "\u{105B1}"; 0x1058C, "\u{105B3}"; 593 + 0x1058D, "\u{105B4}"; 0x1058E, "\u{105B5}"; 0x1058F, "\u{105B6}"; 594 + 0x10590, "\u{105B7}"; 0x10591, "\u{105B8}"; 0x10592, "\u{105B9}"; 595 + 0x10594, "\u{105BB}"; 0x10595, "\u{105BC}"; 0x10C80, "\u{10CC0}"; 596 + 0x10C81, "\u{10CC1}"; 0x10C82, "\u{10CC2}"; 0x10C83, "\u{10CC3}"; 597 + 0x10C84, "\u{10CC4}"; 0x10C85, "\u{10CC5}"; 0x10C86, "\u{10CC6}"; 598 + 0x10C87, "\u{10CC7}"; 0x10C88, "\u{10CC8}"; 0x10C89, "\u{10CC9}"; 599 + 0x10C8A, "\u{10CCA}"; 0x10C8B, "\u{10CCB}"; 0x10C8C, "\u{10CCC}"; 600 + 0x10C8D, "\u{10CCD}"; 0x10C8E, "\u{10CCE}"; 0x10C8F, "\u{10CCF}"; 601 + 0x10C90, "\u{10CD0}"; 0x10C91, "\u{10CD1}"; 0x10C92, "\u{10CD2}"; 602 + 0x10C93, "\u{10CD3}"; 0x10C94, "\u{10CD4}"; 0x10C95, "\u{10CD5}"; 603 + 0x10C96, "\u{10CD6}"; 0x10C97, "\u{10CD7}"; 0x10C98, "\u{10CD8}"; 604 + 0x10C99, "\u{10CD9}"; 0x10C9A, "\u{10CDA}"; 0x10C9B, "\u{10CDB}"; 605 + 0x10C9C, "\u{10CDC}"; 0x10C9D, "\u{10CDD}"; 0x10C9E, "\u{10CDE}"; 606 + 0x10C9F, "\u{10CDF}"; 0x10CA0, "\u{10CE0}"; 0x10CA1, "\u{10CE1}"; 607 + 0x10CA2, "\u{10CE2}"; 0x10CA3, "\u{10CE3}"; 0x10CA4, "\u{10CE4}"; 608 + 0x10CA5, "\u{10CE5}"; 0x10CA6, "\u{10CE6}"; 0x10CA7, "\u{10CE7}"; 609 + 0x10CA8, "\u{10CE8}"; 0x10CA9, "\u{10CE9}"; 0x10CAA, "\u{10CEA}"; 610 + 0x10CAB, "\u{10CEB}"; 0x10CAC, "\u{10CEC}"; 0x10CAD, "\u{10CED}"; 611 + 0x10CAE, "\u{10CEE}"; 0x10CAF, "\u{10CEF}"; 0x10CB0, "\u{10CF0}"; 612 + 0x10CB1, "\u{10CF1}"; 0x10CB2, "\u{10CF2}"; 0x10D50, "\u{10D70}"; 613 + 0x10D51, "\u{10D71}"; 0x10D52, "\u{10D72}"; 0x10D53, "\u{10D73}"; 614 + 0x10D54, "\u{10D74}"; 0x10D55, "\u{10D75}"; 0x10D56, "\u{10D76}"; 615 + 0x10D57, "\u{10D77}"; 0x10D58, "\u{10D78}"; 0x10D59, "\u{10D79}"; 616 + 0x10D5A, "\u{10D7A}"; 0x10D5B, "\u{10D7B}"; 0x10D5C, "\u{10D7C}"; 617 + 0x10D5D, "\u{10D7D}"; 0x10D5E, "\u{10D7E}"; 0x10D5F, "\u{10D7F}"; 618 + 0x10D60, "\u{10D80}"; 0x10D61, "\u{10D81}"; 0x10D62, "\u{10D82}"; 619 + 0x10D63, "\u{10D83}"; 0x10D64, "\u{10D84}"; 0x10D65, "\u{10D85}"; 620 + 0x118A0, "\u{118C0}"; 0x118A1, "\u{118C1}"; 0x118A2, "\u{118C2}"; 621 + 0x118A3, "\u{118C3}"; 0x118A4, "\u{118C4}"; 0x118A5, "\u{118C5}"; 622 + 0x118A6, "\u{118C6}"; 0x118A7, "\u{118C7}"; 0x118A8, "\u{118C8}"; 623 + 0x118A9, "\u{118C9}"; 0x118AA, "\u{118CA}"; 0x118AB, "\u{118CB}"; 624 + 0x118AC, "\u{118CC}"; 0x118AD, "\u{118CD}"; 0x118AE, "\u{118CE}"; 625 + 0x118AF, "\u{118CF}"; 0x118B0, "\u{118D0}"; 0x118B1, "\u{118D1}"; 626 + 0x118B2, "\u{118D2}"; 0x118B3, "\u{118D3}"; 0x118B4, "\u{118D4}"; 627 + 0x118B5, "\u{118D5}"; 0x118B6, "\u{118D6}"; 0x118B7, "\u{118D7}"; 628 + 0x118B8, "\u{118D8}"; 0x118B9, "\u{118D9}"; 0x118BA, "\u{118DA}"; 629 + 0x118BB, "\u{118DB}"; 0x118BC, "\u{118DC}"; 0x118BD, "\u{118DD}"; 630 + 0x118BE, "\u{118DE}"; 0x118BF, "\u{118DF}"; 0x16E40, "\u{16E60}"; 631 + 0x16E41, "\u{16E61}"; 0x16E42, "\u{16E62}"; 0x16E43, "\u{16E63}"; 632 + 0x16E44, "\u{16E64}"; 0x16E45, "\u{16E65}"; 0x16E46, "\u{16E66}"; 633 + 0x16E47, "\u{16E67}"; 0x16E48, "\u{16E68}"; 0x16E49, "\u{16E69}"; 634 + 0x16E4A, "\u{16E6A}"; 0x16E4B, "\u{16E6B}"; 0x16E4C, "\u{16E6C}"; 635 + 0x16E4D, "\u{16E6D}"; 0x16E4E, "\u{16E6E}"; 0x16E4F, "\u{16E6F}"; 636 + 0x16E50, "\u{16E70}"; 0x16E51, "\u{16E71}"; 0x16E52, "\u{16E72}"; 637 + 0x16E53, "\u{16E73}"; 0x16E54, "\u{16E74}"; 0x16E55, "\u{16E75}"; 638 + 0x16E56, "\u{16E76}"; 0x16E57, "\u{16E77}"; 0x16E58, "\u{16E78}"; 639 + 0x16E59, "\u{16E79}"; 0x16E5A, "\u{16E7A}"; 0x16E5B, "\u{16E7B}"; 640 + 0x16E5C, "\u{16E7C}"; 0x16E5D, "\u{16E7D}"; 0x16E5E, "\u{16E7E}"; 641 + 0x16E5F, "\u{16E7F}"; 0x1E900, "\u{1E922}"; 0x1E901, "\u{1E923}"; 642 + 0x1E902, "\u{1E924}"; 0x1E903, "\u{1E925}"; 0x1E904, "\u{1E926}"; 643 + 0x1E905, "\u{1E927}"; 0x1E906, "\u{1E928}"; 0x1E907, "\u{1E929}"; 644 + 0x1E908, "\u{1E92A}"; 0x1E909, "\u{1E92B}"; 0x1E90A, "\u{1E92C}"; 645 + 0x1E90B, "\u{1E92D}"; 0x1E90C, "\u{1E92E}"; 0x1E90D, "\u{1E92F}"; 646 + 0x1E90E, "\u{1E930}"; 0x1E90F, "\u{1E931}"; 0x1E910, "\u{1E932}"; 647 + 0x1E911, "\u{1E933}"; 0x1E912, "\u{1E934}"; 0x1E913, "\u{1E935}"; 648 + 0x1E914, "\u{1E936}"; 0x1E915, "\u{1E937}"; 0x1E916, "\u{1E938}"; 649 + 0x1E917, "\u{1E939}"; 0x1E918, "\u{1E93A}"; 0x1E919, "\u{1E93B}"; 650 + 0x1E91A, "\u{1E93C}"; 0x1E91B, "\u{1E93D}"; 0x1E91C, "\u{1E93E}"; 651 + 0x1E91D, "\u{1E93F}"; 0x1E91E, "\u{1E940}"; 0x1E91F, "\u{1E941}"; 652 + 0x1E920, "\u{1E942}"; 0x1E921, "\u{1E943}"|]
+1 -1
src/markdown2/dune
··· 1 1 (library 2 2 (name odoc_markdown) 3 3 (public_name odoc.markdown) 4 - (libraries odoc_model odoc_document cmarkit)) 4 + (libraries odoc_model odoc_document))
+3 -2
src/markdown2/generator.ml
··· 6 6 module Url = Odoc_document.Url 7 7 module Link = HLink 8 8 9 + (* TODO: Remove Md module *) 9 10 module Md = struct 10 - include Cmarkit 11 - let meta = Cmarkit.Meta.none 11 + include Renderer 12 + let meta = Renderer.Meta.none 12 13 end 13 14 14 15 let source fn (t : Types.Source.t) =
+2 -2
src/markdown2/generator.mli
··· 9 9 config:Config.t -> 10 10 resolve:Link.resolve -> 11 11 Odoc_document.Types.Item.t list -> 12 - Cmarkit.Block.t list 12 + Renderer.Block.t list 13 13 14 14 val inline : 15 15 config:Config.t -> 16 16 xref_base_uri:string -> 17 17 Odoc_document.Types.Inline.t -> 18 - Cmarkit.Inline.t list 18 + Renderer.Inline.t list
+6 -6
src/markdown2/markdown_page.ml
··· 19 19 let make ~config ~url doc children = 20 20 let filename = Link.Path.as_filename ~config url in 21 21 let content ppf = 22 - let renderer = Cmarkit_commonmark.renderer () in 23 - Format.fprintf ppf "%s" (Cmarkit_renderer.doc_to_string renderer doc) 22 + let renderer = Renderer.renderer () in 23 + Format.fprintf ppf "%s" (Renderer.doc_to_string renderer doc) 24 24 in 25 25 { Odoc_document.Renderer.filename; content; children; path = url } 26 26 27 27 let make_src ~config ~url _title block_list = 28 28 let filename = Link.Path.as_filename ~config url in 29 29 let content (ppf : Format.formatter) = 30 - let renderer = Cmarkit_commonmark.renderer () in 31 - let root_block = Cmarkit.Block.Blocks (block_list, Cmarkit.Meta.none) in 32 - let doc = Cmarkit.Doc.make root_block in 33 - Format.fprintf ppf "%s" (Cmarkit_renderer.doc_to_string renderer doc) 30 + let renderer = Renderer.renderer () in 31 + let root_block = Renderer.Block.Blocks (block_list, Renderer.Meta.none) in 32 + let doc = Renderer.Doc.make root_block in 33 + Format.fprintf ppf "%s" (Renderer.doc_to_string renderer doc) 34 34 in 35 35 { Odoc_document.Renderer.filename; content; children = []; path = url }
+2 -2
src/markdown2/markdown_page.mli
··· 21 21 val make : 22 22 config:Config.t -> 23 23 url:Odoc_document.Url.Path.t -> 24 - Cmarkit.Doc.t -> 24 + Renderer.Doc.t -> 25 25 Odoc_document.Renderer.page list -> 26 26 Odoc_document.Renderer.page 27 27 ··· 29 29 config:Config.t -> 30 30 url:Odoc_document.Url.Path.t -> 31 31 string -> 32 - Cmarkit.Block.t list -> 32 + Renderer.Block.t list -> 33 33 Odoc_document.Renderer.page
+1797
src/markdown2/renderer.ml
··· 1 + module Cmarkit_data = struct 2 + module Uset = struct 3 + include Set.Make (Uchar) 4 + let of_array = 5 + let add acc u = add (Uchar.unsafe_of_int u) acc in 6 + Array.fold_left add empty 7 + end 8 + 9 + module Umap = struct 10 + include Map.Make (Uchar) 11 + let of_array = 12 + let add acc (u, f) = add (Uchar.unsafe_of_int u) f acc in 13 + Array.fold_left add empty 14 + end 15 + 16 + let whitespace_uset = Uset.of_array Data_uchar.whitespace 17 + let punctuation_uset = Uset.of_array Data_uchar.punctuation 18 + let case_fold_umap = Umap.of_array Data_uchar.case_fold 19 + 20 + let unicode_version = Data_uchar.unicode_version 21 + let is_unicode_whitespace u = Uset.mem u whitespace_uset 22 + let is_unicode_punctuation u = Uset.mem u punctuation_uset 23 + let unicode_case_fold u = Umap.find_opt u case_fold_umap 24 + 25 + (* HTML entity data. *) 26 + 27 + module String_map = Map.Make (String) 28 + end 29 + 30 + (* TODO: Remove Meta module *) 31 + module Meta = struct 32 + type t = unit 33 + let none = () 34 + end 35 + 36 + (* TODO: Remove Meta.t from node *) 37 + type 'a node = 'a * Meta.t 38 + 39 + module Ascii = struct 40 + let is_control = function '\x00' .. '\x1F' | '\x7F' -> true | _ -> false 41 + let is_letter = function 'a' .. 'z' | 'A' .. 'Z' -> true | _ -> false 42 + let is_upper = function 'A' .. 'Z' -> true | _ -> false 43 + let is_lower = function 'a' .. 'z' -> true | _ -> false 44 + let is_digit = function '0' .. '9' -> true | _ -> false 45 + let is_hex_digit = function 46 + | '0' .. '9' | 'A' .. 'F' | 'a' .. 'f' -> true 47 + | _ -> false 48 + 49 + let hex_digit_to_int = function 50 + | '0' .. '9' as c -> Char.code c - 0x30 51 + | 'A' .. 'F' as c -> Char.code c - 0x37 52 + | 'a' .. 'f' as c -> Char.code c - 0x57 53 + | _ -> assert false 54 + 55 + let is_alphanum = function 56 + | 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' -> true 57 + | _ -> false 58 + 59 + let is_white = function 60 + | '\x20' | '\x09' | '\x0A' | '\x0B' | '\x0C' | '\x0D' -> true 61 + | _ -> false 62 + 63 + let is_punct = function 64 + (* https://spec.commonmark.org/current/#ascii-punctuation-character *) 65 + | '!' | '\"' | '#' | '$' | '%' | '&' | '\'' | '(' | ')' | '*' | '+' | ',' 66 + | '-' | '.' | '/' | ':' | ';' | '<' | '=' | '>' | '?' | '@' | '[' | '\\' 67 + | ']' | '^' | '_' | '`' | '{' | '|' | '}' | '~' -> 68 + true 69 + | _ -> false 70 + 71 + let is_blank = function ' ' | '\t' -> true | _ -> false 72 + 73 + let caseless_starts_with ~prefix s = 74 + let get = String.get in 75 + let len_a = String.length prefix in 76 + let len_s = String.length s in 77 + if len_a > len_s then false 78 + else 79 + let max_idx_a = len_a - 1 in 80 + let rec loop s i max = 81 + if i > max then true 82 + else 83 + let c = 84 + match get s i with 85 + | 'A' .. 'Z' as c -> Char.(unsafe_chr (code c + 32)) 86 + | c -> c 87 + in 88 + if get prefix i <> c then false else loop s (i + 1) max 89 + in 90 + loop s 0 max_idx_a 91 + 92 + let match' ~sub s ~start = 93 + (* assert (start + String.length sub - 1 < String.length s) *) 94 + try 95 + for i = 0 to String.length sub - 1 do 96 + if s.[start + i] <> sub.[i] then raise_notrace Exit 97 + done; 98 + true 99 + with Exit -> false 100 + 101 + let caseless_match ~sub s ~start = 102 + (* assert (start + String.length sub - 1 < String.length s) *) 103 + try 104 + for i = 0 to String.length sub - 1 do 105 + let c = 106 + match s.[start + i] with 107 + | 'A' .. 'Z' as c -> Char.(unsafe_chr (code c + 32)) 108 + | c -> c 109 + in 110 + if c <> sub.[i] then raise_notrace Exit 111 + done; 112 + true 113 + with Exit -> false 114 + 115 + let lowercase_sub s first len = 116 + let b = Bytes.create len in 117 + for i = 0 to len - 1 do 118 + let c = 119 + match s.[first + i] with 120 + | 'A' .. 'Z' as c -> Char.(unsafe_chr (code c + 32)) 121 + | c -> c 122 + in 123 + Bytes.set b i c 124 + done; 125 + Bytes.unsafe_to_string b 126 + end 127 + 128 + module Match = struct 129 + let rec first_non_blank s ~last ~start = 130 + if start > last then last + 1 131 + else 132 + match s.[start] with 133 + | ' ' | '\t' -> first_non_blank s ~last ~start:(start + 1) 134 + | _ -> start 135 + 136 + let autolink_email s ~last ~start = 137 + (* https://spec.commonmark.org/current/#email-address 138 + Via the ABNF "<" email ">" with email defined by: 139 + https://html.spec.whatwg.org/multipage/input.html#valid-e-mail-address *) 140 + let is_atext_plus_dot = function 141 + | 'a' .. 'z' 142 + | 'A' .. 'Z' 143 + | '0' .. '9' 144 + | '!' | '#' | '$' | '%' | '&' | '\'' | '*' | '+' | '-' | '/' | '=' | '?' 145 + | '^' | '_' | '`' | '{' | '|' | '}' | '~' | '.' -> 146 + true 147 + | _ -> false 148 + in 149 + let is_let_dig = Ascii.is_alphanum in 150 + let is_let_dig_hyp c = Ascii.is_alphanum c || c = '-' in 151 + let rec label_seq s last k = 152 + let rec loop s last c k = 153 + if k > last then None 154 + else if is_let_dig_hyp s.[k] && c <= 63 then loop s last (c + 1) (k + 1) 155 + else if c > 63 || not (is_let_dig s.[k - 1]) then None 156 + else 157 + match s.[k] with 158 + | '>' -> Some k 159 + | '.' -> label_seq s last (k + 1) 160 + | _ -> None 161 + in 162 + if k > last || not (is_let_dig s.[k]) then None else loop s last 1 (k + 1) 163 + in 164 + let rec atext_seq s last k = 165 + if k > last then None 166 + else if is_atext_plus_dot s.[k] then atext_seq s last (k + 1) 167 + else if s.[k] = '@' && is_atext_plus_dot s.[k - 1] then 168 + label_seq s last (k + 1) 169 + else None 170 + in 171 + if start > last || s.[start] <> '<' then None 172 + else atext_seq s last (start + 1) 173 + end 174 + 175 + module Layout = struct 176 + type blanks = string 177 + type nonrec string = string 178 + type nonrec char = char 179 + type count = int 180 + type indent = int 181 + let string ?(meta = Meta.none) s = (s, meta) 182 + let empty = string "" 183 + end 184 + 185 + module Block_line = struct 186 + let _list_of_string flush s = 187 + (* cuts [s] on newlines *) 188 + let rec loop s acc max start k = 189 + if k > max then List.rev (flush s start max acc) 190 + else if not (s.[k] = '\n' || s.[k] = '\r') then 191 + loop s acc max start (k + 1) 192 + else 193 + let acc = flush s start (k - 1) acc in 194 + let next = k + 1 in 195 + let start = 196 + if s.[k] = '\r' && next <= max && s.[next] = '\n' then next + 1 197 + else next 198 + in 199 + loop s acc max start start 200 + in 201 + loop s [] (String.length s - 1) 0 0 202 + 203 + let flush ?(meta = Meta.none) s start last acc = 204 + let sub = String.sub s start (last - start + 1) in 205 + (sub, meta) :: acc 206 + 207 + let flush_tight ?(meta = Meta.none) s start last acc = 208 + (* If [s] has newlines, blanks after newlines are layout *) 209 + if start > last then ("", ("", meta)) :: acc 210 + else 211 + match acc with 212 + | [] (* On the first line the blanks are legit *) -> 213 + ("", (String.sub s start (last - start + 1), meta)) :: acc 214 + | acc -> 215 + let nb = Match.first_non_blank s ~last ~start in 216 + ( String.sub s start (nb - 1 - start + 1), 217 + (String.sub s nb (last - nb + 1), meta) ) 218 + :: acc 219 + 220 + (* Block lines *) 221 + 222 + type t = string node 223 + 224 + let to_string = fst 225 + let list_of_string ?meta s = _list_of_string (flush ?meta) s 226 + 227 + (* Tight lines *) 228 + 229 + type tight = Layout.blanks * t 230 + 231 + let tight_to_string l = fst (snd l) 232 + let tight_list_of_string ?meta s = _list_of_string (flush_tight ?meta) s 233 + 234 + (* Blank lines *) 235 + 236 + type blank = Layout.blanks node 237 + end 238 + 239 + module Label = struct 240 + type key = string 241 + type t = { meta : Meta.t; key : key; text : Block_line.tight list } 242 + let make ?(meta = Meta.none) ~key text = { key; text; meta } 243 + let with_meta meta l = { l with meta } 244 + let meta t = t.meta 245 + let key t = t.key 246 + let text t = t.text 247 + let text_to_string t = 248 + String.concat " " (List.map Block_line.tight_to_string t.text) 249 + 250 + let compare l0 l1 = String.compare l0.key l1.key 251 + 252 + (* Definitions *) 253 + 254 + module Map = Map.Make (String) 255 + type def = .. 256 + type defs = def Map.t 257 + 258 + (* Resolvers *) 259 + 260 + type context = 261 + [ `Def of t option * t | `Ref of [ `Link | `Image ] * t * t option ] 262 + 263 + type resolver = context -> t option 264 + let default_resolver = function 265 + | `Def (None, k) -> Some k 266 + | `Def (Some _, _k) -> None 267 + | `Ref (_, _, k) -> k 268 + end 269 + 270 + module Link_definition = struct 271 + type layout = { 272 + indent : Layout.indent; 273 + angled_dest : bool; 274 + before_dest : Block_line.blank list; 275 + after_dest : Block_line.blank list; 276 + title_open_delim : Layout.char; 277 + after_title : Block_line.blank list; 278 + } 279 + 280 + let layout_for_dest dest = 281 + let needs_angles c = Ascii.is_control c || c = ' ' in 282 + let angled_dest = String.exists needs_angles dest in 283 + { 284 + indent = 0; 285 + angled_dest; 286 + before_dest = []; 287 + after_dest = []; 288 + title_open_delim = '\"'; 289 + after_title = []; 290 + } 291 + 292 + let default_layout = 293 + { 294 + indent = 0; 295 + angled_dest = false; 296 + before_dest = []; 297 + after_dest = []; 298 + title_open_delim = '\"'; 299 + after_title = []; 300 + } 301 + 302 + type t = { 303 + layout : layout; 304 + label : Label.t option; 305 + defined_label : Label.t option; 306 + dest : string node option; 307 + title : Block_line.tight list option; 308 + } 309 + 310 + let make ?defined_label ?label ?dest ?title () = 311 + let layout = 312 + match dest with 313 + | None -> default_layout 314 + | Some (d, _) -> layout_for_dest d 315 + in 316 + let defined_label = 317 + match defined_label with None -> label | Some d -> d 318 + in 319 + { layout; label; defined_label; dest; title } 320 + 321 + let layout ld = ld.layout 322 + let label ld = ld.label 323 + let defined_label ld = ld.defined_label 324 + let dest ld = ld.dest 325 + let title ld = ld.title 326 + 327 + type Label.def += Def of t node 328 + end 329 + 330 + module Inline = struct 331 + type t = .. 332 + 333 + module Autolink = struct 334 + type t = { is_email : bool; link : string node } 335 + let is_email a = a.is_email 336 + let link a = a.link 337 + let make link = 338 + let is_email = 339 + let l = String.concat "" [ "<"; fst link; ">" ] in 340 + match Match.autolink_email l ~last:(String.length l - 1) ~start:0 with 341 + | None -> false 342 + | Some _ -> true 343 + in 344 + { is_email; link } 345 + end 346 + 347 + module Break = struct 348 + type type' = [ `Hard | `Soft ] 349 + type t = { 350 + layout_before : Layout.blanks node; 351 + type' : type'; 352 + layout_after : Layout.blanks node; 353 + } 354 + 355 + let make ?(layout_before = Layout.empty) ?(layout_after = Layout.empty) 356 + type' = 357 + { layout_before; type'; layout_after } 358 + 359 + let type' b = b.type' 360 + let layout_before b = b.layout_before 361 + let layout_after b = b.layout_after 362 + end 363 + 364 + module Code_span = struct 365 + type t = { 366 + backtick_count : Layout.count; 367 + code_layout : Block_line.tight list; 368 + } 369 + 370 + let make ~backtick_count code_layout = { backtick_count; code_layout } 371 + 372 + let min_backtick_count ~min counts = 373 + let rec loop min = function 374 + | c :: cs -> if min <> c then min else loop (c + 1) cs 375 + | [] -> min 376 + in 377 + loop min (List.sort Int.compare counts) 378 + 379 + let of_string ?(meta = Meta.none) = function 380 + | "" -> { backtick_count = 1; code_layout = [ ("", ("", meta)) ] } 381 + | s -> 382 + (* This finds out the needed backtick count, whether spaces are needed, 383 + and treats blanks after newline as layout *) 384 + let max = String.length s - 1 in 385 + let need_sp = s.[0] = '`' || s.[max] = '`' in 386 + let s = if need_sp then String.concat "" [ " "; s; " " ] else s in 387 + let backtick_counts, code_layout = 388 + let rec loop bt_counts acc max btc start k = 389 + match k > max with 390 + | true -> 391 + (* assert (btc = 0) because of [need_sp] *) 392 + ( bt_counts, 393 + if acc = [] then [ ("", (s, meta)) ] 394 + else List.rev (Block_line.flush_tight ~meta s start max acc) 395 + ) 396 + | false -> 397 + if s.[k] = '`' then 398 + loop bt_counts acc max (btc + 1) start (k + 1) 399 + else 400 + let bt_counts = 401 + if btc > 0 then btc :: bt_counts else bt_counts 402 + in 403 + if not (s.[k] = '\n' || s.[k] = '\r') then 404 + loop bt_counts acc max 0 start (k + 1) 405 + else 406 + let acc = 407 + Block_line.flush_tight ~meta s start (k - 1) acc 408 + in 409 + let start = 410 + if k + 1 <= max && s.[k] = '\r' && s.[k + 1] = '\n' then 411 + k + 2 412 + else k + 1 413 + in 414 + loop bt_counts acc max 0 start start 415 + in 416 + loop [] [] max 0 0 0 417 + in 418 + let backtick_count = min_backtick_count ~min:1 backtick_counts in 419 + { backtick_count; code_layout } 420 + 421 + let backtick_count cs = cs.backtick_count 422 + let code_layout cs = cs.code_layout 423 + let code cs = 424 + (* Extract code, see https://spec.commonmark.org/0.30/#code-spans *) 425 + let sp c = Char.equal c ' ' in 426 + let s = List.map Block_line.tight_to_string cs.code_layout in 427 + let s = String.concat " " s in 428 + if s = "" then "" 429 + else if 430 + s.[0] = ' ' 431 + && s.[String.length s - 1] = ' ' 432 + && not (String.for_all sp s) 433 + then String.sub s 1 (String.length s - 2) 434 + else s 435 + end 436 + 437 + module Emphasis = struct 438 + type inline = t 439 + type t = { delim : Layout.char; inline : inline } 440 + let make ?(delim = '*') inline = { delim; inline } 441 + let inline e = e.inline 442 + let delim e = e.delim 443 + end 444 + 445 + module Link = struct 446 + type inline = t 447 + 448 + type reference_layout = [ `Collapsed | `Full | `Shortcut ] 449 + type reference = 450 + [ `Inline of Link_definition.t node 451 + | `Ref of reference_layout * Label.t * Label.t ] 452 + 453 + type t = { text : inline; reference : reference } 454 + 455 + let make text reference = { text; reference } 456 + let text l = l.text 457 + let reference l = l.reference 458 + let referenced_label l = 459 + match l.reference with `Inline _ -> None | `Ref (_, _, k) -> Some k 460 + 461 + let reference_definition defs l = 462 + match l.reference with 463 + | `Inline ld -> Some (Link_definition.Def ld) 464 + | `Ref (_, _, def) -> Label.Map.find_opt (Label.key def) defs 465 + 466 + let is_unsafe l = 467 + let allowed_data_url l = 468 + let allowed = 469 + [ "image/gif"; "image/png"; "image/jpeg"; "image/webp" ] 470 + in 471 + (* Extract mediatype from data:[<mediatype>][;base64],<data> *) 472 + match String.index_from_opt l 4 ',' with 473 + | None -> false 474 + | Some j -> 475 + let k = 476 + match String.index_from_opt l 4 ';' with None -> j | Some k -> k 477 + in 478 + let t = String.sub l 5 (min j k - 5) in 479 + List.mem t allowed 480 + in 481 + Ascii.caseless_starts_with ~prefix:"javascript:" l 482 + || Ascii.caseless_starts_with ~prefix:"vbscript:" l 483 + || Ascii.caseless_starts_with ~prefix:"file:" l 484 + || Ascii.caseless_starts_with ~prefix:"data:" l 485 + && not (allowed_data_url l) 486 + end 487 + 488 + module Raw_html = struct 489 + type t = Block_line.tight list 490 + end 491 + 492 + module Text = struct 493 + type t = string 494 + end 495 + 496 + type t += 497 + | Autolink of Autolink.t node 498 + | Break of Break.t node 499 + | Code_span of Code_span.t node 500 + | Emphasis of Emphasis.t node 501 + | Image of Link.t node 502 + | Inlines of t list node 503 + | Link of Link.t node 504 + | Raw_html of Raw_html.t node 505 + | Strong_emphasis of Emphasis.t node 506 + | Text of Text.t node 507 + 508 + let empty = Inlines ([], Meta.none) 509 + 510 + let err_unknown = "Unknown Cmarkit.Inline.t type extension" 511 + 512 + (* Extensions *) 513 + 514 + module Strikethrough = struct 515 + type nonrec t = t 516 + let make = Fun.id 517 + let inline = Fun.id 518 + end 519 + 520 + module Math_span = struct 521 + type t = { display : bool; tex_layout : Block_line.tight list } 522 + let make ~display tex_layout = { display; tex_layout } 523 + let display ms = ms.display 524 + let tex_layout ms = ms.tex_layout 525 + let tex ms = 526 + let s = List.map Block_line.tight_to_string ms.tex_layout in 527 + String.concat " " s 528 + end 529 + 530 + type t += 531 + | Ext_strikethrough of Strikethrough.t node 532 + | Ext_math_span of Math_span.t node 533 + 534 + (* Functions on inlines *) 535 + 536 + let is_empty = function Text ("", _) | Inlines ([], _) -> true | _ -> false 537 + 538 + let ext_none _ = invalid_arg err_unknown 539 + let meta ?(ext = ext_none) = function 540 + | Autolink (_, m) 541 + | Break (_, m) 542 + | Code_span (_, m) 543 + | Emphasis (_, m) 544 + | Image (_, m) 545 + | Inlines (_, m) 546 + | Link (_, m) 547 + | Raw_html (_, m) 548 + | Strong_emphasis (_, m) 549 + | Text (_, m) -> 550 + m 551 + | Ext_strikethrough (_, m) -> m 552 + | Ext_math_span (_, m) -> m 553 + | i -> ext i 554 + 555 + let rec normalize ?(ext = ext_none) = function 556 + | ( Autolink _ | Break _ | Code_span _ | Raw_html _ | Text _ 557 + | Inlines ([], _) 558 + | Ext_math_span _ ) as i -> 559 + i 560 + | Image (l, m) -> Image ({ l with text = normalize ~ext l.text }, m) 561 + | Link (l, m) -> Link ({ l with text = normalize ~ext l.text }, m) 562 + | Inlines ([ i ], _) -> i 563 + | Emphasis (e, m) -> 564 + Emphasis ({ e with inline = normalize ~ext e.inline }, m) 565 + | Strong_emphasis (e, m) -> 566 + Strong_emphasis ({ e with inline = normalize ~ext e.inline }, m) 567 + | Inlines (i :: is, m) -> ( 568 + let rec loop acc = function 569 + | Inlines (is', _) :: is -> 570 + loop acc (List.rev_append (List.rev is') is) 571 + | (Text (t', _) as i') :: is -> ( 572 + match acc with 573 + | Text (t, _) :: acc -> 574 + let i = Text (t ^ t', ()) in 575 + loop (i :: acc) is 576 + | _ -> loop (normalize ~ext i' :: acc) is) 577 + | i :: is -> loop (normalize ~ext i :: acc) is 578 + | [] -> List.rev acc 579 + in 580 + let is = loop [ normalize ~ext i ] is in 581 + match is with [ i ] -> i | _ -> Inlines (is, m)) 582 + | Ext_strikethrough (i, m) -> Ext_strikethrough (normalize ~ext i, m) 583 + | i -> ext i 584 + 585 + let ext_none = ext_none 586 + let to_plain_text ?(ext = ext_none) ~break_on_soft i = 587 + let push s acc = (s :: List.hd acc) :: List.tl acc in 588 + let newline acc = [] :: List.rev (List.hd acc) :: List.tl acc in 589 + let rec loop ~break_on_soft acc = function 590 + | Autolink (a, _) :: is -> 591 + let acc = push (String.concat "" [ "<"; fst a.link; ">" ]) acc in 592 + loop ~break_on_soft acc is 593 + | Break ({ type' = `Hard; _ }, _) :: is -> 594 + loop ~break_on_soft (newline acc) is 595 + | Break ({ type' = `Soft; _ }, _) :: is -> 596 + let acc = if break_on_soft then newline acc else push " " acc in 597 + loop ~break_on_soft acc is 598 + | Code_span (cs, _) :: is -> 599 + loop ~break_on_soft (push (Code_span.code cs) acc) is 600 + | Emphasis ({ inline; _ }, _) :: is 601 + | Strong_emphasis ({ inline; _ }, _) :: is -> 602 + loop ~break_on_soft acc (inline :: is) 603 + | Inlines (is', _) :: is -> 604 + loop ~break_on_soft acc (List.rev_append (List.rev is') is) 605 + | Link (l, _) :: is | Image (l, _) :: is -> 606 + loop ~break_on_soft acc (l.text :: is) 607 + | Raw_html _ :: is -> loop ~break_on_soft acc is 608 + | Text (t, _) :: is -> loop ~break_on_soft (push t acc) is 609 + | Ext_strikethrough (i, _) :: is -> loop ~break_on_soft acc (i :: is) 610 + | Ext_math_span (m, _) :: is -> 611 + loop ~break_on_soft (push (Math_span.tex m) acc) is 612 + | i :: is -> loop ~break_on_soft acc (ext ~break_on_soft i :: is) 613 + | [] -> List.rev (List.rev (List.hd acc) :: List.tl acc) 614 + in 615 + loop ~break_on_soft ([] :: []) [ i ] 616 + 617 + let id ?buf ?ext i = 618 + let text = to_plain_text ?ext ~break_on_soft:false i in 619 + let s = String.concat "\n" (List.map (String.concat "") text) in 620 + let b = 621 + match buf with 622 + | Some b -> 623 + Buffer.reset b; 624 + b 625 + | None -> Buffer.create 256 626 + in 627 + let[@inline] collapse_blanks b ~prev_byte = 628 + (* Collapses non initial white *) 629 + if Ascii.is_blank prev_byte && Buffer.length b <> 0 then 630 + Buffer.add_char b '-' 631 + in 632 + let rec loop b s max ~prev_byte k = 633 + if k > max then Buffer.contents b 634 + else 635 + match s.[k] with 636 + | (' ' | '\t') as prev_byte -> loop b s max ~prev_byte (k + 1) 637 + | ('_' | '-') as c -> 638 + collapse_blanks b ~prev_byte; 639 + Buffer.add_char b c; 640 + loop b s max ~prev_byte:c (k + 1) 641 + | _ -> 642 + let () = collapse_blanks b ~prev_byte in 643 + let d = String.get_utf_8_uchar s k in 644 + let u = Uchar.utf_decode_uchar d in 645 + let u = match Uchar.to_int u with 0x0000 -> Uchar.rep | _ -> u in 646 + let k' = k + Uchar.utf_decode_length d in 647 + if Cmarkit_data.is_unicode_punctuation u then 648 + loop b s max ~prev_byte:'\x00' k' 649 + else 650 + let () = 651 + match Cmarkit_data.unicode_case_fold u with 652 + | None -> Buffer.add_utf_8_uchar b u 653 + | Some fold -> Buffer.add_string b fold 654 + in 655 + let prev_byte = s.[k] in 656 + loop b s max ~prev_byte k' 657 + in 658 + loop b s (String.length s - 1) ~prev_byte:'\x00' 0 659 + end 660 + 661 + module Block = struct 662 + type t = .. 663 + 664 + module Blank_line = struct 665 + type t = Layout.blanks 666 + end 667 + 668 + module Block_quote = struct 669 + type nonrec t = { indent : Layout.indent; block : t } 670 + let make ?(indent = 0) block = { indent; block } 671 + let indent bq = bq.indent 672 + let block bq = bq.block 673 + end 674 + 675 + module Code_block = struct 676 + type fenced_layout = { 677 + indent : Layout.indent; 678 + opening_fence : Layout.string node; 679 + closing_fence : Layout.string node option; 680 + } 681 + 682 + let default_fenced_layout = 683 + { 684 + indent = 0; 685 + opening_fence = Layout.empty; 686 + closing_fence = Some Layout.empty; 687 + } 688 + 689 + type layout = [ `Indented | `Fenced of fenced_layout ] 690 + type t = { 691 + layout : layout; 692 + info_string : string node option; 693 + code : string node list; 694 + } 695 + 696 + let make ?(layout = `Fenced default_fenced_layout) ?info_string code = 697 + let layout = 698 + match (info_string, layout) with 699 + | Some _, `Indented -> `Fenced default_fenced_layout 700 + | _, layout -> layout 701 + in 702 + { layout; info_string; code } 703 + 704 + let layout cb = cb.layout 705 + let info_string cb = cb.info_string 706 + let code cb = cb.code 707 + 708 + let make_fence cb = 709 + let rec loop char counts = function 710 + | [] -> counts 711 + | (c, _) :: cs -> 712 + let max = String.length c - 1 in 713 + let k = ref 0 in 714 + while !k <= max && c.[!k] = char do 715 + incr k 716 + done; 717 + loop char (if !k <> 0 then !k :: counts else counts) cs 718 + in 719 + let char = 720 + match cb.info_string with 721 + | Some (i, _) when String.exists (Char.equal '`') i -> '~' 722 + | None | Some _ -> '`' 723 + in 724 + let counts = loop char [] cb.code in 725 + ( char, 726 + Inline.Code_span.min_backtick_count (* not char specific *) 727 + ~min:3 counts ) 728 + 729 + let language_of_info_string s = 730 + let rec next_white s max i = 731 + if i > max || Ascii.is_white s.[i] then i else next_white s max (i + 1) 732 + in 733 + if s = "" then None 734 + else 735 + let max = String.length s - 1 in 736 + let white = next_white s max 0 in 737 + let rem_first = Match.first_non_blank s ~last:max ~start:white in 738 + let lang = String.sub s 0 white in 739 + if lang = "" then None 740 + else Some (lang, String.sub s rem_first (max - rem_first + 1)) 741 + 742 + let is_math_block = function 743 + | None -> false 744 + | Some (i, _) -> ( 745 + match language_of_info_string i with 746 + | Some ("math", _) -> true 747 + | Some _ | None -> false) 748 + end 749 + 750 + module Heading = struct 751 + type atx_layout = { 752 + indent : Layout.indent; 753 + after_opening : Layout.blanks; 754 + closing : Layout.string; 755 + } 756 + 757 + let default_atx_layout = { indent = 0; after_opening = ""; closing = "" } 758 + 759 + type setext_layout = { 760 + leading_indent : Layout.indent; 761 + trailing_blanks : Layout.blanks; 762 + underline_indent : Layout.indent; 763 + underline_count : Layout.count node; 764 + underline_blanks : Layout.blanks; 765 + } 766 + 767 + type layout = [ `Atx of atx_layout | `Setext of setext_layout ] 768 + type id = [ `Auto of string | `Id of string ] 769 + type t = { layout : layout; level : int; inline : Inline.t; id : id option } 770 + 771 + let make ?id ?(layout = `Atx default_atx_layout) ~level inline = 772 + let max = match layout with `Atx _ -> 6 | `Setext _ -> 2 in 773 + let level = Int.max 1 (Int.min level max) in 774 + { layout; level; inline; id } 775 + 776 + let layout h = h.layout 777 + let level h = h.level 778 + let inline h = h.inline 779 + let id h = h.id 780 + end 781 + 782 + module Html_block = struct 783 + type t = string node list 784 + end 785 + 786 + module List_item = struct 787 + type block = t 788 + type t = { 789 + before_marker : Layout.indent; 790 + marker : Layout.string node; 791 + after_marker : Layout.indent; 792 + block : block; 793 + ext_task_marker : Uchar.t node option; 794 + } 795 + 796 + let make ?(before_marker = 0) ?(marker = Layout.empty) ?(after_marker = 1) 797 + ?ext_task_marker block = 798 + { before_marker; marker; after_marker; block; ext_task_marker } 799 + 800 + let block i = i.block 801 + let before_marker i = i.before_marker 802 + let marker i = i.marker 803 + let after_marker i = i.after_marker 804 + let ext_task_marker i = i.ext_task_marker 805 + let task_status_of_task_marker u = 806 + match Uchar.to_int u with 807 + | 0x0020 -> `Unchecked 808 + | 0x0078 (* x *) 809 + | 0x0058 (* X *) 810 + | 0x2713 (* ✓ *) 811 + | 0x2714 (* ✔ *) 812 + | 0x10102 (* 𐄂 *) 813 + | 0x1F5F8 (* 🗸*) -> 814 + `Checked 815 + | 0x007E (* ~ *) -> `Cancelled 816 + | _ -> `Other u 817 + end 818 + 819 + module List' = struct 820 + type type' = [ `Unordered of Layout.char | `Ordered of int * Layout.char ] 821 + type t = { type' : type'; tight : bool; items : List_item.t node list } 822 + 823 + let make ?(tight = true) type' items = { type'; tight; items } 824 + 825 + let type' l = l.type' 826 + let tight l = l.tight 827 + let items l = l.items 828 + end 829 + 830 + module Paragraph = struct 831 + type t = { 832 + leading_indent : Layout.indent; 833 + inline : Inline.t; 834 + trailing_blanks : Layout.blanks; 835 + } 836 + 837 + let make ?(leading_indent = 0) ?(trailing_blanks = "") inline = 838 + { leading_indent; inline; trailing_blanks } 839 + 840 + let inline p = p.inline 841 + let leading_indent p = p.leading_indent 842 + let trailing_blanks p = p.trailing_blanks 843 + end 844 + 845 + module Thematic_break = struct 846 + type t = { indent : Layout.indent; layout : Layout.string } 847 + let make ?(indent = 0) ?(layout = "---") () = { indent; layout } 848 + let indent t = t.indent 849 + let layout t = t.layout 850 + end 851 + 852 + type t += 853 + | Blank_line of Layout.blanks node 854 + | Block_quote of Block_quote.t node 855 + | Blocks of t list node 856 + | Code_block of Code_block.t node 857 + | Heading of Heading.t node 858 + | Html_block of Html_block.t node 859 + | Link_reference_definition of Link_definition.t node 860 + | List of List'.t node 861 + | Paragraph of Paragraph.t node 862 + | Thematic_break of Thematic_break.t node 863 + 864 + let empty = Blocks ([], Meta.none) 865 + 866 + (* Extensions *) 867 + 868 + module Table = struct 869 + type align = [ `Left | `Center | `Right ] 870 + type sep = align option * Layout.count 871 + type cell_layout = Layout.blanks * Layout.blanks 872 + type row = 873 + [ `Header of (Inline.t * cell_layout) list 874 + | `Sep of sep node list 875 + | `Data of (Inline.t * cell_layout) list ] 876 + 877 + type t = { 878 + indent : Layout.indent; 879 + col_count : int; 880 + rows : (row node * Layout.blanks) list; 881 + } 882 + 883 + let col_count rows = 884 + let rec loop c = function 885 + | (((`Header cols | `Data cols), _), _) :: rs -> 886 + loop (Int.max (List.length cols) c) rs 887 + | ((`Sep cols, _), _) :: rs -> loop (Int.max (List.length cols) c) rs 888 + | [] -> c 889 + in 890 + loop 0 rows 891 + 892 + let make ?(indent = 0) rows = { indent; col_count = col_count rows; rows } 893 + let indent t = t.indent 894 + let col_count t = t.col_count 895 + let rows t = t.rows 896 + 897 + let parse_sep_row cs = 898 + let rec loop acc = function 899 + | [] -> Some (List.rev acc) 900 + | (Inline.Text (s, meta), ("", "")) :: cs -> ( 901 + if s = "" then None 902 + else 903 + let max = String.length s - 1 in 904 + let first_colon = s.[0] = ':' and last_colon = s.[max] = ':' in 905 + let first = if first_colon then 1 else 0 in 906 + let last = if last_colon then max - 1 else max in 907 + match 908 + for i = first to last do 909 + if s.[i] <> '-' then raise Exit 910 + done 911 + with 912 + | exception Exit -> None 913 + | () -> 914 + let count = last - first + 1 in 915 + let sep = 916 + match (first_colon, last_colon) with 917 + | false, false -> None 918 + | true, true -> Some `Center 919 + | true, false -> Some `Left 920 + | false, true -> Some `Right 921 + in 922 + loop (((sep, count), meta) :: acc) cs) 923 + | _ -> None 924 + in 925 + loop [] cs 926 + end 927 + 928 + module Footnote = struct 929 + type nonrec t = { 930 + indent : Layout.indent; 931 + label : Label.t; 932 + defined_label : Label.t option; 933 + block : t; 934 + } 935 + 936 + let make ?(indent = 0) ?defined_label:d label block = 937 + let defined_label = match d with None -> Some label | Some d -> d in 938 + { indent; label; defined_label; block } 939 + 940 + let indent fn = fn.indent 941 + let label fn = fn.label 942 + let defined_label fn = fn.defined_label 943 + let block fn = fn.block 944 + 945 + type Label.def += Def of t node 946 + let stub label defined_label = 947 + Def ({ indent = 0; label; defined_label; block = empty }, Meta.none) 948 + end 949 + 950 + type t += 951 + | Ext_math_block of Code_block.t node 952 + | Ext_table of Table.t node 953 + | Ext_footnote_definition of Footnote.t node 954 + 955 + (* Functions on blocks *) 956 + 957 + let err_unknown = "Unknown Cmarkit.Block.t type extension" 958 + 959 + let ext_none _ = invalid_arg err_unknown 960 + let meta ?(ext = ext_none) = function 961 + | Blank_line (_, m) 962 + | Block_quote (_, m) 963 + | Blocks (_, m) 964 + | Code_block (_, m) 965 + | Heading (_, m) 966 + | Html_block (_, m) 967 + | Link_reference_definition (_, m) 968 + | List (_, m) 969 + | Paragraph (_, m) 970 + | Thematic_break (_, m) 971 + | Ext_math_block (_, m) 972 + | Ext_table (_, m) 973 + | Ext_footnote_definition (_, m) -> 974 + m 975 + | b -> ext b 976 + 977 + let rec normalize ?(ext = ext_none) = function 978 + | ( Blank_line _ | Code_block _ | Heading _ | Html_block _ 979 + | Link_reference_definition _ | Paragraph _ | Thematic_break _ 980 + | Blocks ([], _) 981 + | Ext_math_block _ | Ext_table _ ) as b -> 982 + b 983 + | Block_quote (b, m) -> 984 + let b = { b with block = normalize ~ext b.block } in 985 + Block_quote (b, m) 986 + | List (l, m) -> 987 + let item (i, meta) = 988 + let block = List_item.block i in 989 + ({ i with List_item.block = normalize ~ext block }, meta) 990 + in 991 + List ({ l with items = List.map item l.items }, m) 992 + | Blocks (b :: bs, m) -> ( 993 + let rec loop acc = function 994 + | Blocks (bs', _) :: bs -> 995 + loop acc (List.rev_append (List.rev bs') bs) 996 + | b :: bs -> loop (normalize ~ext b :: acc) bs 997 + | [] -> List.rev acc 998 + in 999 + let bs = loop [ normalize ~ext b ] bs in 1000 + match bs with [ b ] -> b | _ -> Blocks (bs, m)) 1001 + | Ext_footnote_definition (fn, m) -> 1002 + let fn = { fn with block = normalize ~ext fn.block } in 1003 + Ext_footnote_definition (fn, m) 1004 + | b -> ext b 1005 + 1006 + let rec defs ?(ext = fun _b _defs -> invalid_arg err_unknown) 1007 + ?(init = Label.Map.empty) = function 1008 + | Blank_line _ | Code_block _ | Heading _ | Html_block _ | Paragraph _ 1009 + | Thematic_break _ | Ext_math_block _ | Ext_table _ -> 1010 + init 1011 + | Block_quote (b, _) -> defs ~ext ~init (Block_quote.block b) 1012 + | Blocks (bs, _) -> List.fold_left (fun init b -> defs ~ext ~init b) init bs 1013 + | List (l, _) -> 1014 + let add init (i, _) = defs ~ext ~init (List_item.block i) in 1015 + List.fold_left add init l.items 1016 + | Link_reference_definition ld -> ( 1017 + match Link_definition.defined_label (fst ld) with 1018 + | None -> init 1019 + | Some def -> 1020 + Label.Map.add (Label.key def) (Link_definition.Def ld) init) 1021 + | Ext_footnote_definition fn -> 1022 + let init = 1023 + match Footnote.defined_label (fst fn) with 1024 + | None -> init 1025 + | Some def -> Label.Map.add (Label.key def) (Footnote.Def fn) init 1026 + in 1027 + defs ~ext ~init (Footnote.block (fst fn)) 1028 + | b -> ext init b 1029 + end 1030 + 1031 + module Doc = struct 1032 + type t = { nl : Layout.string; block : Block.t; defs : Label.defs } 1033 + let make ?(nl = "\n") ?(defs = Label.Map.empty) block = { nl; block; defs } 1034 + let empty = make (Block.Blocks ([], Meta.none)) 1035 + let nl d = d.nl 1036 + let block d = d.block 1037 + let defs d = d.defs 1038 + let unicode_version = Data_uchar.unicode_version 1039 + let commonmark_version = "0.30" 1040 + end 1041 + 1042 + (* Heterogeneous dictionaries *) 1043 + 1044 + module Dict = struct 1045 + (* Type identifiers, can be deleted once we require 5.1 *) 1046 + module Type = struct 1047 + type (_, _) eq = Equal : ('a, 'a) eq 1048 + module Id = struct 1049 + type _ id = .. 1050 + module type ID = sig 1051 + type t 1052 + type _ id += Id : t id 1053 + end 1054 + type 'a t = (module ID with type t = 'a) 1055 + 1056 + let make (type a) () : a t = 1057 + (module struct 1058 + type t = a 1059 + type _ id += Id : t id 1060 + end) 1061 + 1062 + let provably_equal (type a b) ((module A) : a t) ((module B) : b t) : 1063 + (a, b) eq option = 1064 + match A.Id with B.Id -> Some Equal | _ -> None 1065 + 1066 + let uid (type a) ((module A) : a t) = 1067 + Obj.Extension_constructor.id (Obj.Extension_constructor.of_val A.Id) 1068 + end 1069 + end 1070 + 1071 + module M = Map.Make (Int) 1072 + type 'a key = 'a Type.Id.t 1073 + type binding = B : 'a key * 'a -> binding 1074 + type t = binding M.t 1075 + 1076 + let key = Type.Id.make 1077 + let empty = M.empty 1078 + let mem k m = M.mem (Type.Id.uid k) m 1079 + let add k v m = M.add (Type.Id.uid k) (B (k, v)) m 1080 + let tag k m = add k () m 1081 + let remove k m = M.remove (Type.Id.uid k) m 1082 + let find : type a. a key -> t -> a option = 1083 + fun k m -> 1084 + match M.find_opt (Type.Id.uid k) m with 1085 + | None -> None 1086 + | Some (B (k', v)) -> ( 1087 + match Type.Id.provably_equal k k' with 1088 + | None -> assert false 1089 + | Some Type.Equal -> Some v) 1090 + end 1091 + 1092 + type t = { 1093 + init_context : context -> Doc.t -> unit; 1094 + inline : inline; 1095 + block : block; 1096 + doc : doc; 1097 + } 1098 + 1099 + and context = { 1100 + renderer : t; 1101 + mutable state : Dict.t; 1102 + b : Buffer.t; 1103 + mutable document : Doc.t; 1104 + } 1105 + 1106 + and inline = context -> Inline.t -> bool 1107 + and block = context -> Block.t -> bool 1108 + and doc = context -> Doc.t -> bool 1109 + 1110 + let nop _ _ = () 1111 + let none _ _ = false 1112 + 1113 + let make ?(init_context = nop) ?(inline = none) ?(block = none) ?(doc = none) () 1114 + = 1115 + { init_context; inline; block; doc } 1116 + 1117 + let compose g f = 1118 + let init_context c d = 1119 + g.init_context c d; 1120 + f.init_context c d 1121 + in 1122 + let block c b = f.block c b || g.block c b in 1123 + let inline c i = f.inline c i || g.inline c i in 1124 + let doc c d = f.doc c d || g.doc c d in 1125 + { init_context; inline; block; doc } 1126 + 1127 + let _init_context r = r.init_context 1128 + let _inline r = r.inline 1129 + let _block r = r.block 1130 + let _doc r = r.doc 1131 + 1132 + module Context = struct 1133 + type t = context 1134 + let make renderer b = 1135 + { renderer; b; state = Dict.empty; document = Doc.empty } 1136 + 1137 + let buffer c = c.b 1138 + let renderer c = c.renderer 1139 + let get_document (c : context) = c.document 1140 + let get_defs (c : context) = Doc.defs c.document 1141 + 1142 + module State = struct 1143 + type 'a t = 'a Dict.key 1144 + let make = Dict.key 1145 + let find c st = Dict.find st c.state 1146 + let get c st = Option.get (Dict.find st c.state) 1147 + let set c st = function 1148 + | None -> c.state <- Dict.remove st c.state 1149 + | Some s -> c.state <- Dict.add st s c.state 1150 + end 1151 + 1152 + let init c d = c.renderer.init_context c d 1153 + 1154 + let invalid_inline _ = invalid_arg "Unknown Inline.t case" 1155 + let invalid_block _ = invalid_arg "Unknown Block.t case" 1156 + let unhandled_doc _ = invalid_arg "Unhandled Doc.t" 1157 + 1158 + let byte r c = Buffer.add_char r.b c 1159 + let utf_8_uchar r u = Buffer.add_utf_8_uchar r.b u 1160 + let string c s = Buffer.add_string c.b s 1161 + let inline c i = ignore (c.renderer.inline c i || invalid_inline i) 1162 + let block c b = ignore (c.renderer.block c b || invalid_block b) 1163 + let doc (c : context) d = 1164 + c.document <- d; 1165 + init c d; 1166 + ignore (c.renderer.doc c d || unhandled_doc d); 1167 + c.document <- Doc.empty 1168 + end 1169 + 1170 + let doc_to_string r d = 1171 + let b = Buffer.create 1024 in 1172 + let c = Context.make r b in 1173 + Context.doc c d; 1174 + Buffer.contents b 1175 + 1176 + let buffer_add_doc r b d = Context.doc (Context.make r b) d 1177 + 1178 + type indent = 1179 + [ `I of int 1180 + | `L of int * string * int * Uchar.t option 1181 + | `Q of int 1182 + | `Fn of int * Label.t ] 1183 + 1184 + type state = { 1185 + nl : string; (* newline to output. *) 1186 + mutable sot : bool; (* start of text *) 1187 + mutable indents : indent list; (* indentation stack. *) 1188 + } 1189 + 1190 + let state : state Context.State.t = Context.State.make () 1191 + let get_state c = Context.State.get c state 1192 + let init_context c d = 1193 + Context.State.set c state (Some { nl = Doc.nl d; sot = true; indents = [] }) 1194 + 1195 + module Char_set = Set.Make (Char) 1196 + 1197 + let esc_angles = Char_set.of_list [ '<'; '>' ] 1198 + let esc_parens = Char_set.of_list [ '('; ')' ] 1199 + let esc_quote = Char_set.singleton '\'' 1200 + let esc_dquote = Char_set.singleton '\"' 1201 + let esc_link_label = Char_set.of_list [ '['; ']'; '\\' ] 1202 + 1203 + let buffer_add_dec_esc b c = 1204 + Buffer.add_string b "&#"; 1205 + Buffer.add_string b (Int.to_string (Char.code c)); 1206 + Buffer.add_char b ';' 1207 + 1208 + let buffer_add_bslash_esc b c = 1209 + Buffer.add_char b '\\'; 1210 + Buffer.add_char b c 1211 + 1212 + let buffer_add_escaped_string ?(esc_ctrl = true) b cs s = 1213 + let flush b max start i = 1214 + if start <= max then Buffer.add_substring b s start (i - start) 1215 + in 1216 + let rec loop b s max start i = 1217 + if i > max then flush b max start i 1218 + else 1219 + let next = i + 1 in 1220 + let c = String.get s i in 1221 + if Char_set.mem c cs then ( 1222 + flush b max start i; 1223 + buffer_add_bslash_esc b c; 1224 + loop b s max next next) 1225 + else if esc_ctrl && Ascii.is_control c then ( 1226 + flush b max start i; 1227 + buffer_add_dec_esc b c; 1228 + loop b s max next next) 1229 + else loop b s max start next 1230 + in 1231 + loop b s (String.length s - 1) 0 0 1232 + 1233 + let escaped_string ?esc_ctrl c cs s = 1234 + buffer_add_escaped_string ?esc_ctrl (Context.buffer c) cs s 1235 + 1236 + let buffer_add_escaped_text b s = 1237 + let esc_first b s = 1238 + match s.[0] with 1239 + | ('-' | '+' | '_' | '=') as c -> 1240 + Buffer.add_char b '\\'; 1241 + Buffer.add_char b c; 1242 + true 1243 + | _ -> false 1244 + in 1245 + let esc_amp s max next = 1246 + next <= max && (Ascii.is_letter s.[next] || s.[next] = '#') 1247 + in 1248 + let esc_tilde s max prev next = 1249 + (not (Char.equal prev '~')) && next <= max && s.[next] = '~' 1250 + in 1251 + let esc_item_marker s i = 1252 + if i = 0 || i > 9 (* marker has from 1-9 digits *) then false 1253 + else 1254 + let k = ref (i - 1) in 1255 + while !k >= 0 && Ascii.is_digit s.[!k] do 1256 + decr k 1257 + done; 1258 + !k < 0 1259 + in 1260 + let flush b max start i = 1261 + if start <= max then Buffer.add_substring b s start (i - start) 1262 + in 1263 + let rec loop b s max start prev i = 1264 + if i > max then flush b max start i 1265 + else 1266 + let next = i + 1 in 1267 + let c = String.get s i in 1268 + if Ascii.is_control c then ( 1269 + flush b max start i; 1270 + buffer_add_dec_esc b c; 1271 + loop b s max next c next) 1272 + else 1273 + match c with 1274 + | ('#' | '`') when not (Char.equal prev c) -> 1275 + flush b max start i; 1276 + buffer_add_bslash_esc b c; 1277 + loop b s max next c next 1278 + | '~' when esc_tilde s max prev next -> 1279 + flush b max start i; 1280 + buffer_add_bslash_esc b c; 1281 + loop b s max next c next 1282 + | '&' when esc_amp s max next -> 1283 + flush b max start i; 1284 + buffer_add_bslash_esc b c; 1285 + loop b s max next c next 1286 + | '!' when i = max -> 1287 + flush b max start i; 1288 + buffer_add_bslash_esc b c; 1289 + loop b s max next c next 1290 + | ('.' | ')') when esc_item_marker s i -> 1291 + flush b max start i; 1292 + buffer_add_bslash_esc b c; 1293 + loop b s max next c next 1294 + | '\\' | '<' | '>' | '[' | ']' | '*' | '_' | '$' | '|' -> 1295 + flush b max start i; 1296 + buffer_add_bslash_esc b c; 1297 + loop b s max next c next 1298 + | _ -> loop b s max start c next 1299 + in 1300 + let max = String.length s - 1 in 1301 + if max < 0 then () 1302 + else if esc_first b s then loop b s max 1 s.[0] 1 1303 + else loop b s max 0 '\x00' 0 1304 + 1305 + let escaped_text c s = buffer_add_escaped_text (Context.buffer c) s 1306 + 1307 + let string_node_option c = function 1308 + | None -> () 1309 + | Some (s, _) -> Context.string c s 1310 + let nchars c n char = 1311 + for _i = 1 to n do 1312 + Context.byte c char 1313 + done 1314 + 1315 + let newline c = 1316 + (* Block generally introduce newlines, except the first one. *) 1317 + let st = get_state c in 1318 + if st.sot then st.sot <- false else Context.string c st.nl 1319 + 1320 + let push_indent c n = 1321 + let st = get_state c in 1322 + st.indents <- n :: st.indents 1323 + let pop_indent c = 1324 + let st = get_state c in 1325 + match st.indents with [] -> () | ns -> st.indents <- List.tl ns 1326 + 1327 + let rec indent c = 1328 + let rec loop c acc = function 1329 + | [] -> acc 1330 + | (`I n as i) :: is -> 1331 + nchars c n ' '; 1332 + loop c (i :: acc) is 1333 + | (`Q n as i) :: is -> 1334 + nchars c n ' '; 1335 + Context.byte c '>'; 1336 + Context.byte c ' '; 1337 + loop c (i :: acc) is 1338 + | `L (before, m, after, task) :: is -> 1339 + nchars c before ' '; 1340 + Context.string c m; 1341 + nchars c after ' '; 1342 + let after = 1343 + match task with 1344 + | None -> after 1345 + | Some u -> 1346 + Context.byte c '['; 1347 + Context.utf_8_uchar c u; 1348 + Context.string c "] "; 1349 + after + 4 1350 + in 1351 + (* On the next call we'll just indent for the list item *) 1352 + loop c (`I (before + String.length m + after) :: acc) is 1353 + | `Fn (before, label) :: is -> 1354 + nchars c before ' '; 1355 + Context.byte c '['; 1356 + link_label_lines c (Label.text label); 1357 + Context.string c "]:"; 1358 + (* On the next call we'll just indent to ^ for the footnote *) 1359 + loop c (`I (before + 1) :: acc) is 1360 + in 1361 + let st = get_state c in 1362 + st.indents <- loop c [] (List.rev st.indents) 1363 + 1364 + and link_label_lines c lines = escaped_tight_block_lines c esc_link_label lines 1365 + 1366 + and escaped_tight_block_lines c cs = function 1367 + | [] -> () 1368 + | l :: ls -> 1369 + let tight c (blanks, (l, _)) = 1370 + Context.string c blanks; 1371 + escaped_string c cs l 1372 + in 1373 + let line c l = 1374 + newline c; 1375 + indent c; 1376 + tight c l 1377 + in 1378 + tight c l; 1379 + List.iter (line c) ls 1380 + 1381 + let block_lines c = function 1382 + | [] -> () 1383 + | (l, _) :: ls -> 1384 + let line c (l, _) = 1385 + newline c; 1386 + indent c; 1387 + Context.string c l 1388 + in 1389 + Context.string c l; 1390 + List.iter (line c) ls 1391 + 1392 + let tight_block_lines c = function 1393 + | [] -> () 1394 + | l :: ls -> 1395 + let tight c (blanks, (l, _)) = 1396 + Context.string c blanks; 1397 + Context.string c l 1398 + in 1399 + let line c l = 1400 + newline c; 1401 + indent c; 1402 + tight c l 1403 + in 1404 + tight c l; 1405 + List.iter (line c) ls 1406 + 1407 + let autolink c a = 1408 + Context.byte c '<'; 1409 + Context.string c (fst (Inline.Autolink.link a)); 1410 + Context.byte c '>' 1411 + 1412 + let break c b = 1413 + let layout_before = fst (Inline.Break.layout_before b) in 1414 + let layout_after = fst (Inline.Break.layout_after b) in 1415 + let before, after = 1416 + match Inline.Break.type' b with 1417 + | `Soft -> (layout_before, layout_after) 1418 + | `Hard -> 1419 + ((if layout_before = "" then " " else layout_before), layout_after) 1420 + in 1421 + Context.string c before; 1422 + newline c; 1423 + indent c; 1424 + Context.string c after 1425 + 1426 + let code_span c cs = 1427 + nchars c (Inline.Code_span.backtick_count cs) '`'; 1428 + tight_block_lines c (Inline.Code_span.code_layout cs); 1429 + nchars c (Inline.Code_span.backtick_count cs) '`' 1430 + 1431 + let emphasis c e = 1432 + let delim = Inline.Emphasis.delim e and i = Inline.Emphasis.inline e in 1433 + let delim = if not (delim = '*' || delim = '_') then '*' else delim in 1434 + Context.byte c delim; 1435 + Context.inline c i; 1436 + Context.byte c delim 1437 + 1438 + let strong_emphasis c e = 1439 + let delim = Inline.Emphasis.delim e and i = Inline.Emphasis.inline e in 1440 + let delim = if not (delim = '*' || delim = '_') then '*' else delim in 1441 + Context.byte c delim; 1442 + Context.byte c delim; 1443 + Context.inline c i; 1444 + Context.byte c delim; 1445 + Context.byte c delim 1446 + 1447 + let link_title c open_delim title = 1448 + match title with 1449 + | None -> () 1450 + | Some lines -> 1451 + let open', close, escapes = 1452 + match open_delim with 1453 + | '\"' as delim -> (delim, delim, esc_dquote) 1454 + | '\'' as delim -> (delim, delim, esc_quote) 1455 + | '(' -> ('(', ')', esc_parens) 1456 + | _ -> ('\"', '\"', esc_dquote) 1457 + in 1458 + Context.byte c open'; 1459 + escaped_tight_block_lines c escapes lines; 1460 + Context.byte c close 1461 + 1462 + let link_definition c ld = 1463 + let layout = Link_definition.layout ld in 1464 + block_lines c layout.before_dest; 1465 + (match Link_definition.dest ld with 1466 + | None -> () 1467 + | Some (dest, _) -> 1468 + if layout.angled_dest then ( 1469 + Context.byte c '<'; 1470 + escaped_string c esc_angles dest; 1471 + Context.byte c '>') 1472 + else escaped_string c esc_parens dest); 1473 + if 1474 + layout.after_dest = [] 1475 + && Option.is_some (Link_definition.dest ld) 1476 + && Option.is_some (Link_definition.title ld) 1477 + then Context.byte c ' ' (* at least a space is needed *); 1478 + block_lines c layout.after_dest; 1479 + link_title c layout.title_open_delim (Link_definition.title ld); 1480 + block_lines c layout.after_title 1481 + 1482 + let link c l = 1483 + match Inline.Link.reference l with 1484 + | `Inline (ld, _) -> 1485 + Context.byte c '['; 1486 + Context.inline c (Inline.Link.text l); 1487 + Context.byte c ']'; 1488 + Context.byte c '('; 1489 + link_definition c ld; 1490 + Context.byte c ')' 1491 + | `Ref (`Shortcut, label, _) -> 1492 + Context.byte c '['; 1493 + link_label_lines c (Label.text label); 1494 + Context.byte c ']' 1495 + | `Ref (`Collapsed, label, _) -> 1496 + Context.byte c '['; 1497 + link_label_lines c (Label.text label); 1498 + Context.byte c ']'; 1499 + Context.string c "[]" 1500 + | `Ref (`Full, label, _) -> 1501 + Context.byte c '['; 1502 + Context.inline c (Inline.Link.text l); 1503 + Context.byte c ']'; 1504 + Context.byte c '['; 1505 + link_label_lines c (Label.text label); 1506 + Context.byte c ']' 1507 + 1508 + let inlines c is = List.iter (Context.inline c) is 1509 + let image c l = 1510 + Context.byte c '!'; 1511 + link c l 1512 + let raw_html c h = tight_block_lines c h 1513 + let text c t = escaped_text c t 1514 + 1515 + let strikethrough c s = 1516 + let i = Inline.Strikethrough.inline s in 1517 + Context.string c "~~"; 1518 + Context.inline c i; 1519 + Context.string c "~~" 1520 + 1521 + let math_span c ms = 1522 + let sep = if Inline.Math_span.display ms then "$$" else "$" in 1523 + Context.string c sep; 1524 + tight_block_lines c (Inline.Math_span.tex_layout ms); 1525 + Context.string c sep 1526 + 1527 + let inline c = function 1528 + | Inline.Autolink (a, _) -> 1529 + autolink c a; 1530 + true 1531 + | Inline.Break (b, _) -> 1532 + break c b; 1533 + true 1534 + | Inline.Code_span (cs, _) -> 1535 + code_span c cs; 1536 + true 1537 + | Inline.Emphasis (e, _) -> 1538 + emphasis c e; 1539 + true 1540 + | Inline.Image (i, _) -> 1541 + image c i; 1542 + true 1543 + | Inline.Inlines (is, _) -> 1544 + inlines c is; 1545 + true 1546 + | Inline.Link (l, _) -> 1547 + link c l; 1548 + true 1549 + | Inline.Raw_html (html, _) -> 1550 + raw_html c html; 1551 + true 1552 + | Inline.Strong_emphasis (e, _) -> 1553 + strong_emphasis c e; 1554 + true 1555 + | Inline.Text (t, _) -> 1556 + text c t; 1557 + true 1558 + | Inline.Ext_strikethrough (s, _) -> 1559 + strikethrough c s; 1560 + true 1561 + | Inline.Ext_math_span (m, _) -> 1562 + math_span c m; 1563 + true 1564 + | _ -> 1565 + Context.string c "<!-- Unknown Cmarkit inline -->"; 1566 + true 1567 + 1568 + let blank_line c l = 1569 + newline c; 1570 + indent c; 1571 + Context.string c l 1572 + 1573 + let block_quote c bq = 1574 + push_indent c (`Q (Block.Block_quote.indent bq)); 1575 + Context.block c (Block.Block_quote.block bq); 1576 + pop_indent c 1577 + 1578 + let code_block c cb = 1579 + match Block.Code_block.layout cb with 1580 + | `Indented -> 1581 + newline c; 1582 + push_indent c (`I 4); 1583 + indent c; 1584 + block_lines c (Block.Code_block.code cb); 1585 + pop_indent c 1586 + | `Fenced f -> 1587 + let opening, closing = 1588 + match fst f.opening_fence with 1589 + | "" -> 1590 + let char, len = Block.Code_block.make_fence cb in 1591 + let f = String.make len char in 1592 + (f, Some f) 1593 + | opening -> (opening, Option.map fst f.closing_fence) 1594 + in 1595 + let info_string = Block.Code_block.info_string cb in 1596 + let code = Block.Code_block.code cb in 1597 + newline c; 1598 + push_indent c (`I f.indent); 1599 + indent c; 1600 + Context.string c opening; 1601 + string_node_option c info_string; 1602 + if code <> [] then ( 1603 + newline c; 1604 + indent c; 1605 + block_lines c code); 1606 + (match closing with 1607 + | None -> () 1608 + | Some close -> 1609 + newline c; 1610 + indent c; 1611 + Context.string c close); 1612 + pop_indent c 1613 + 1614 + let heading c h = 1615 + newline c; 1616 + indent c; 1617 + match Block.Heading.layout h with 1618 + | `Atx { indent; after_opening; closing } -> 1619 + let inline = Block.Heading.inline h in 1620 + nchars c indent ' '; 1621 + nchars c (Block.Heading.level h) '#'; 1622 + if after_opening = "" && not (Inline.is_empty inline) then 1623 + Context.byte c ' ' 1624 + else Context.string c after_opening; 1625 + Context.inline c inline; 1626 + Context.string c closing 1627 + | `Setext l -> 1628 + let u = 1629 + match Block.Heading.level h with 1 -> '=' | 2 -> '-' | _ -> '-' 1630 + in 1631 + nchars c l.leading_indent ' '; 1632 + Context.inline c (Block.Heading.inline h); 1633 + Context.string c l.trailing_blanks; 1634 + newline c; 1635 + indent c; 1636 + nchars c l.underline_indent ' '; 1637 + nchars c (fst l.underline_count) u; 1638 + Context.string c l.underline_blanks 1639 + 1640 + let html_block c h = 1641 + newline c; 1642 + indent c; 1643 + block_lines c h 1644 + 1645 + let link_reference_definition c ld = 1646 + newline c; 1647 + indent c; 1648 + nchars c (Link_definition.layout ld).indent ' '; 1649 + Context.byte c '['; 1650 + (match Link_definition.label ld with 1651 + | None -> () 1652 + | Some label -> escaped_tight_block_lines c esc_link_label (Label.text label)); 1653 + Context.string c "]:"; 1654 + link_definition c ld 1655 + 1656 + let unordered_item c marker (i, _) = 1657 + let before = Block.List_item.before_marker i in 1658 + let after = Block.List_item.after_marker i in 1659 + let task = Option.map fst (Block.List_item.ext_task_marker i) in 1660 + push_indent c (`L (before, marker, after, task)); 1661 + Context.block c (Block.List_item.block i); 1662 + pop_indent c 1663 + 1664 + let ordered_item c sep num (i, _) = 1665 + let before = Block.List_item.before_marker i in 1666 + let marker = fst (Block.List_item.marker i) in 1667 + let marker = if marker = "" then Int.to_string num ^ sep else marker in 1668 + let after = Block.List_item.after_marker i in 1669 + let task = Option.map fst (Block.List_item.ext_task_marker i) in 1670 + push_indent c (`L (before, marker, after, task)); 1671 + Context.block c (Block.List_item.block i); 1672 + pop_indent c; 1673 + num + 1 1674 + 1675 + let list c l = 1676 + match Block.List'.type' l with 1677 + | `Unordered marker -> 1678 + let marker = match marker with '*' | '-' | '+' -> marker | _ -> '*' in 1679 + let marker = String.make 1 marker in 1680 + List.iter (unordered_item c marker) (Block.List'.items l) 1681 + | `Ordered (start, sep) -> 1682 + let sep = if sep <> '.' && sep <> ')' then '.' else sep in 1683 + let sep = String.make 1 sep in 1684 + ignore (List.fold_left (ordered_item c sep) start (Block.List'.items l)) 1685 + 1686 + let paragraph c p = 1687 + newline c; 1688 + indent c; 1689 + nchars c (Block.Paragraph.leading_indent p) ' '; 1690 + Context.inline c (Block.Paragraph.inline p); 1691 + Context.string c (Block.Paragraph.trailing_blanks p) 1692 + 1693 + let thematic_break c t = 1694 + let ind = Block.Thematic_break.indent t in 1695 + let break = Block.Thematic_break.layout t in 1696 + let break = if break = "" then "---" else break in 1697 + newline c; 1698 + indent c; 1699 + nchars c ind ' '; 1700 + Context.string c break 1701 + 1702 + let table c t = 1703 + let col c (i, (before, after)) = 1704 + Context.byte c '|'; 1705 + Context.string c before; 1706 + Context.inline c i; 1707 + Context.string c after 1708 + in 1709 + let sep c ((align, len), _) = 1710 + Context.byte c '|'; 1711 + match align with 1712 + | None -> nchars c len '-' 1713 + | Some `Left -> 1714 + Context.byte c ':'; 1715 + nchars c len '-' 1716 + | Some `Center -> 1717 + Context.byte c ':'; 1718 + nchars c len '-'; 1719 + Context.byte c ':' 1720 + | Some `Right -> 1721 + nchars c len '-'; 1722 + Context.byte c ':' 1723 + in 1724 + let row c = function 1725 + | (`Header cols, _), blanks | (`Data cols, _), blanks -> 1726 + newline c; 1727 + indent c; 1728 + if cols = [] then Context.byte c '|' else List.iter (col c) cols; 1729 + Context.byte c '|'; 1730 + Context.string c blanks 1731 + | (`Sep seps, _), blanks -> 1732 + newline c; 1733 + indent c; 1734 + if seps = [] then Context.byte c '|' else List.iter (sep c) seps; 1735 + Context.byte c '|'; 1736 + Context.string c blanks 1737 + in 1738 + push_indent c (`I (Block.Table.indent t)); 1739 + List.iter (row c) (Block.Table.rows t); 1740 + pop_indent c 1741 + 1742 + let footnote c fn = 1743 + push_indent c (`Fn (Block.Footnote.indent fn, Block.Footnote.label fn)); 1744 + Context.block c (Block.Footnote.block fn); 1745 + pop_indent c 1746 + 1747 + let block c = function 1748 + | Block.Blank_line (l, _) -> 1749 + blank_line c l; 1750 + true 1751 + | Block.Block_quote (b, _) -> 1752 + block_quote c b; 1753 + true 1754 + | Block.Blocks (bs, _) -> 1755 + List.iter (Context.block c) bs; 1756 + true 1757 + | Block.Code_block (cb, _) -> 1758 + code_block c cb; 1759 + true 1760 + | Block.Heading (h, _) -> 1761 + heading c h; 1762 + true 1763 + | Block.Html_block (h, _) -> 1764 + html_block c h; 1765 + true 1766 + | Block.Link_reference_definition (ld, _) -> 1767 + link_reference_definition c ld; 1768 + true 1769 + | Block.List (l, _) -> 1770 + list c l; 1771 + true 1772 + | Block.Paragraph (p, _) -> 1773 + paragraph c p; 1774 + true 1775 + | Block.Thematic_break (t, _) -> 1776 + thematic_break c t; 1777 + true 1778 + | Block.Ext_math_block (cb, _) -> 1779 + code_block c cb; 1780 + true 1781 + | Block.Ext_table (t, _) -> 1782 + table c t; 1783 + true 1784 + | Block.Ext_footnote_definition (t, _) -> 1785 + footnote c t; 1786 + true 1787 + | _ -> 1788 + newline c; 1789 + indent c; 1790 + Context.string c "<!-- Unknown Cmarkit block -->"; 1791 + true 1792 + 1793 + let doc c d = 1794 + Context.block c (Doc.block d); 1795 + true 1796 + 1797 + let renderer () = make ~init_context ~inline ~block ~doc ()
+2 -1
src/odoc/bin/main.ml
··· 1316 1316 (* QUESTION: Where is this being used? *) 1317 1317 let filepath config url = Odoc_markdown.Generator.filepath ~config url 1318 1318 1319 - let extra_args = Term.const { Odoc_markdown.Config.root_url = None } 1319 + let extra_args = 1320 + Term.const { Odoc_markdown.Config.root_url = None; allow_html = true } 1320 1321 let renderer = { Odoc_document.Renderer.name = "markdown"; render; filepath } 1321 1322 end) 1322 1323