Update md4c to 0.5.2
Followup to c29a235833410fde4cb4d502f89129bccd7403f0 [ChangeLog][Third-Party Code] md4c was updated to 0.5.2. Task-number: QTBUG-121442 Change-Id: I097d9aa5f54c59c301a91fb824adf949daae3af2 Reviewed-by: Kai Köhne <kai.koehne@qt.io> (cherry picked from commit 16bcdba8e7adae79729c6347e711bd0a976dbbe7) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> (cherry picked from commit ff8928d3cbaa8366a861317f11cb49449dc49eda) (cherry picked from commit 14671775ed868630e31104da89b423765092e7f6)
This commit is contained in:
parent
bda58a780c
commit
d1348ac94f
510
src/3rdparty/md4c/md4c.c
vendored
510
src/3rdparty/md4c/md4c.c
vendored
@ -2,7 +2,7 @@
|
||||
* MD4C: Markdown parser for C
|
||||
* (http://github.com/mity/md4c)
|
||||
*
|
||||
* Copyright (c) 2016-2024 Martin Mitas
|
||||
* Copyright (c) 2016-2024 Martin Mitáš
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
@ -496,10 +496,10 @@ md_text_with_null_replacement(MD_CTX* ctx, MD_TEXTTYPE type, const CHAR* str, SZ
|
||||
/* If the offset falls into a gap between line, we return the following
|
||||
* line. */
|
||||
static const MD_LINE*
|
||||
md_lookup_line(OFF off, const MD_LINE* lines, int n_lines)
|
||||
md_lookup_line(OFF off, const MD_LINE* lines, MD_SIZE n_lines, MD_SIZE* p_line_index)
|
||||
{
|
||||
int lo, hi;
|
||||
int pivot;
|
||||
MD_SIZE lo, hi;
|
||||
MD_SIZE pivot;
|
||||
const MD_LINE* line;
|
||||
|
||||
lo = 0;
|
||||
@ -509,12 +509,17 @@ md_lookup_line(OFF off, const MD_LINE* lines, int n_lines)
|
||||
line = &lines[pivot];
|
||||
|
||||
if(off < line->beg) {
|
||||
hi = pivot - 1;
|
||||
if(hi < 0 || lines[hi].end <= off)
|
||||
if(hi == 0 || lines[hi-1].end < off) {
|
||||
if(p_line_index != NULL)
|
||||
*p_line_index = pivot;
|
||||
return line;
|
||||
}
|
||||
hi = pivot - 1;
|
||||
} else if(off > line->end) {
|
||||
lo = pivot + 1;
|
||||
} else {
|
||||
if(p_line_index != NULL)
|
||||
*p_line_index = pivot;
|
||||
return line;
|
||||
}
|
||||
}
|
||||
@ -594,41 +599,67 @@ struct MD_UNICODE_FOLD_INFO_tag {
|
||||
{
|
||||
#define R(cp_min, cp_max) ((cp_min) | 0x40000000), ((cp_max) | 0x80000000)
|
||||
#define S(cp) (cp)
|
||||
/* Unicode "Pc", "Pd", "Pe", "Pf", "Pi", "Po", "Ps" categories.
|
||||
/* Unicode general "P" and "S" categories.
|
||||
* (generated by scripts/build_punct_map.py) */
|
||||
static const unsigned PUNCT_MAP[] = {
|
||||
R(0x0021,0x0023), R(0x0025,0x002a), R(0x002c,0x002f), R(0x003a,0x003b), R(0x003f,0x0040),
|
||||
R(0x005b,0x005d), S(0x005f), S(0x007b), S(0x007d), S(0x00a1), S(0x00a7), S(0x00ab), R(0x00b6,0x00b7),
|
||||
S(0x00bb), S(0x00bf), S(0x037e), S(0x0387), R(0x055a,0x055f), R(0x0589,0x058a), S(0x05be), S(0x05c0),
|
||||
S(0x05c3), S(0x05c6), R(0x05f3,0x05f4), R(0x0609,0x060a), R(0x060c,0x060d), S(0x061b), R(0x061d,0x061f),
|
||||
R(0x066a,0x066d), S(0x06d4), R(0x0700,0x070d), R(0x07f7,0x07f9), R(0x0830,0x083e), S(0x085e),
|
||||
R(0x0964,0x0965), S(0x0970), S(0x09fd), S(0x0a76), S(0x0af0), S(0x0c77), S(0x0c84), S(0x0df4), S(0x0e4f),
|
||||
R(0x0e5a,0x0e5b), R(0x0f04,0x0f12), S(0x0f14), R(0x0f3a,0x0f3d), S(0x0f85), R(0x0fd0,0x0fd4),
|
||||
R(0x0fd9,0x0fda), R(0x104a,0x104f), S(0x10fb), R(0x1360,0x1368), S(0x1400), S(0x166e), R(0x169b,0x169c),
|
||||
R(0x16eb,0x16ed), R(0x1735,0x1736), R(0x17d4,0x17d6), R(0x17d8,0x17da), R(0x1800,0x180a),
|
||||
R(0x1944,0x1945), R(0x1a1e,0x1a1f), R(0x1aa0,0x1aa6), R(0x1aa8,0x1aad), R(0x1b5a,0x1b60),
|
||||
R(0x1b7d,0x1b7e), R(0x1bfc,0x1bff), R(0x1c3b,0x1c3f), R(0x1c7e,0x1c7f), R(0x1cc0,0x1cc7), S(0x1cd3),
|
||||
R(0x2010,0x2027), R(0x2030,0x2043), R(0x2045,0x2051), R(0x2053,0x205e), R(0x207d,0x207e),
|
||||
R(0x208d,0x208e), R(0x2308,0x230b), R(0x2329,0x232a), R(0x2768,0x2775), R(0x27c5,0x27c6),
|
||||
R(0x27e6,0x27ef), R(0x2983,0x2998), R(0x29d8,0x29db), R(0x29fc,0x29fd), R(0x2cf9,0x2cfc),
|
||||
R(0x2cfe,0x2cff), S(0x2d70), R(0x2e00,0x2e2e), R(0x2e30,0x2e4f), R(0x2e52,0x2e5d), R(0x3001,0x3003),
|
||||
R(0x3008,0x3011), R(0x3014,0x301f), S(0x3030), S(0x303d), S(0x30a0), S(0x30fb), R(0xa4fe,0xa4ff),
|
||||
R(0xa60d,0xa60f), S(0xa673), S(0xa67e), R(0xa6f2,0xa6f7), R(0xa874,0xa877), R(0xa8ce,0xa8cf),
|
||||
R(0xa8f8,0xa8fa), S(0xa8fc), R(0xa92e,0xa92f), S(0xa95f), R(0xa9c1,0xa9cd), R(0xa9de,0xa9df),
|
||||
R(0xaa5c,0xaa5f), R(0xaade,0xaadf), R(0xaaf0,0xaaf1), S(0xabeb), R(0xfd3e,0xfd3f), R(0xfe10,0xfe19),
|
||||
R(0xfe30,0xfe52), R(0xfe54,0xfe61), S(0xfe63), S(0xfe68), R(0xfe6a,0xfe6b), R(0xff01,0xff03),
|
||||
R(0xff05,0xff0a), R(0xff0c,0xff0f), R(0xff1a,0xff1b), R(0xff1f,0xff20), R(0xff3b,0xff3d), S(0xff3f),
|
||||
S(0xff5b), S(0xff5d), R(0xff5f,0xff65), R(0x10100,0x10102), S(0x1039f), S(0x103d0), S(0x1056f),
|
||||
S(0x10857), S(0x1091f), S(0x1093f), R(0x10a50,0x10a58), S(0x10a7f), R(0x10af0,0x10af6),
|
||||
R(0x10b39,0x10b3f), R(0x10b99,0x10b9c), S(0x10ead), R(0x10f55,0x10f59), R(0x10f86,0x10f89),
|
||||
R(0x11047,0x1104d), R(0x110bb,0x110bc), R(0x110be,0x110c1), R(0x11140,0x11143), R(0x11174,0x11175),
|
||||
R(0x111c5,0x111c8), S(0x111cd), S(0x111db), R(0x111dd,0x111df), R(0x11238,0x1123d), S(0x112a9),
|
||||
R(0x1144b,0x1144f), R(0x1145a,0x1145b), S(0x1145d), S(0x114c6), R(0x115c1,0x115d7), R(0x11641,0x11643),
|
||||
R(0x11660,0x1166c), S(0x116b9), R(0x1173c,0x1173e), S(0x1183b), R(0x11944,0x11946), S(0x119e2),
|
||||
R(0x11a3f,0x11a46), R(0x11a9a,0x11a9c), R(0x11a9e,0x11aa2), R(0x11b00,0x11b09), R(0x11c41,0x11c45),
|
||||
R(0x11c70,0x11c71), R(0x11ef7,0x11ef8), R(0x11f43,0x11f4f), S(0x11fff), R(0x12470,0x12474),
|
||||
R(0x12ff1,0x12ff2), R(0x16a6e,0x16a6f), S(0x16af5), R(0x16b37,0x16b3b), S(0x16b44), R(0x16e97,0x16e9a),
|
||||
S(0x16fe2), S(0x1bc9f), R(0x1da87,0x1da8b), R(0x1e95e,0x1e95f)
|
||||
R(0x0021,0x002f), R(0x003a,0x0040), R(0x005b,0x0060), R(0x007b,0x007e), R(0x00a1,0x00a9),
|
||||
R(0x00ab,0x00ac), R(0x00ae,0x00b1), S(0x00b4), R(0x00b6,0x00b8), S(0x00bb), S(0x00bf), S(0x00d7),
|
||||
S(0x00f7), R(0x02c2,0x02c5), R(0x02d2,0x02df), R(0x02e5,0x02eb), S(0x02ed), R(0x02ef,0x02ff), S(0x0375),
|
||||
S(0x037e), R(0x0384,0x0385), S(0x0387), S(0x03f6), S(0x0482), R(0x055a,0x055f), R(0x0589,0x058a),
|
||||
R(0x058d,0x058f), S(0x05be), S(0x05c0), S(0x05c3), S(0x05c6), R(0x05f3,0x05f4), R(0x0606,0x060f),
|
||||
S(0x061b), R(0x061d,0x061f), R(0x066a,0x066d), S(0x06d4), S(0x06de), S(0x06e9), R(0x06fd,0x06fe),
|
||||
R(0x0700,0x070d), R(0x07f6,0x07f9), R(0x07fe,0x07ff), R(0x0830,0x083e), S(0x085e), S(0x0888),
|
||||
R(0x0964,0x0965), S(0x0970), R(0x09f2,0x09f3), R(0x09fa,0x09fb), S(0x09fd), S(0x0a76), R(0x0af0,0x0af1),
|
||||
S(0x0b70), R(0x0bf3,0x0bfa), S(0x0c77), S(0x0c7f), S(0x0c84), S(0x0d4f), S(0x0d79), S(0x0df4), S(0x0e3f),
|
||||
S(0x0e4f), R(0x0e5a,0x0e5b), R(0x0f01,0x0f17), R(0x0f1a,0x0f1f), S(0x0f34), S(0x0f36), S(0x0f38),
|
||||
R(0x0f3a,0x0f3d), S(0x0f85), R(0x0fbe,0x0fc5), R(0x0fc7,0x0fcc), R(0x0fce,0x0fda), R(0x104a,0x104f),
|
||||
R(0x109e,0x109f), S(0x10fb), R(0x1360,0x1368), R(0x1390,0x1399), S(0x1400), R(0x166d,0x166e),
|
||||
R(0x169b,0x169c), R(0x16eb,0x16ed), R(0x1735,0x1736), R(0x17d4,0x17d6), R(0x17d8,0x17db),
|
||||
R(0x1800,0x180a), S(0x1940), R(0x1944,0x1945), R(0x19de,0x19ff), R(0x1a1e,0x1a1f), R(0x1aa0,0x1aa6),
|
||||
R(0x1aa8,0x1aad), R(0x1b5a,0x1b6a), R(0x1b74,0x1b7e), R(0x1bfc,0x1bff), R(0x1c3b,0x1c3f),
|
||||
R(0x1c7e,0x1c7f), R(0x1cc0,0x1cc7), S(0x1cd3), S(0x1fbd), R(0x1fbf,0x1fc1), R(0x1fcd,0x1fcf),
|
||||
R(0x1fdd,0x1fdf), R(0x1fed,0x1fef), R(0x1ffd,0x1ffe), R(0x2010,0x2027), R(0x2030,0x205e),
|
||||
R(0x207a,0x207e), R(0x208a,0x208e), R(0x20a0,0x20c0), R(0x2100,0x2101), R(0x2103,0x2106),
|
||||
R(0x2108,0x2109), S(0x2114), R(0x2116,0x2118), R(0x211e,0x2123), S(0x2125), S(0x2127), S(0x2129),
|
||||
S(0x212e), R(0x213a,0x213b), R(0x2140,0x2144), R(0x214a,0x214d), S(0x214f), R(0x218a,0x218b),
|
||||
R(0x2190,0x2426), R(0x2440,0x244a), R(0x249c,0x24e9), R(0x2500,0x2775), R(0x2794,0x2b73),
|
||||
R(0x2b76,0x2b95), R(0x2b97,0x2bff), R(0x2ce5,0x2cea), R(0x2cf9,0x2cfc), R(0x2cfe,0x2cff), S(0x2d70),
|
||||
R(0x2e00,0x2e2e), R(0x2e30,0x2e5d), R(0x2e80,0x2e99), R(0x2e9b,0x2ef3), R(0x2f00,0x2fd5),
|
||||
R(0x2ff0,0x2fff), R(0x3001,0x3004), R(0x3008,0x3020), S(0x3030), R(0x3036,0x3037), R(0x303d,0x303f),
|
||||
R(0x309b,0x309c), S(0x30a0), S(0x30fb), R(0x3190,0x3191), R(0x3196,0x319f), R(0x31c0,0x31e3), S(0x31ef),
|
||||
R(0x3200,0x321e), R(0x322a,0x3247), S(0x3250), R(0x3260,0x327f), R(0x328a,0x32b0), R(0x32c0,0x33ff),
|
||||
R(0x4dc0,0x4dff), R(0xa490,0xa4c6), R(0xa4fe,0xa4ff), R(0xa60d,0xa60f), S(0xa673), S(0xa67e),
|
||||
R(0xa6f2,0xa6f7), R(0xa700,0xa716), R(0xa720,0xa721), R(0xa789,0xa78a), R(0xa828,0xa82b),
|
||||
R(0xa836,0xa839), R(0xa874,0xa877), R(0xa8ce,0xa8cf), R(0xa8f8,0xa8fa), S(0xa8fc), R(0xa92e,0xa92f),
|
||||
S(0xa95f), R(0xa9c1,0xa9cd), R(0xa9de,0xa9df), R(0xaa5c,0xaa5f), R(0xaa77,0xaa79), R(0xaade,0xaadf),
|
||||
R(0xaaf0,0xaaf1), S(0xab5b), R(0xab6a,0xab6b), S(0xabeb), S(0xfb29), R(0xfbb2,0xfbc2), R(0xfd3e,0xfd4f),
|
||||
S(0xfdcf), R(0xfdfc,0xfdff), R(0xfe10,0xfe19), R(0xfe30,0xfe52), R(0xfe54,0xfe66), R(0xfe68,0xfe6b),
|
||||
R(0xff01,0xff0f), R(0xff1a,0xff20), R(0xff3b,0xff40), R(0xff5b,0xff65), R(0xffe0,0xffe6),
|
||||
R(0xffe8,0xffee), R(0xfffc,0xfffd), R(0x10100,0x10102), R(0x10137,0x1013f), R(0x10179,0x10189),
|
||||
R(0x1018c,0x1018e), R(0x10190,0x1019c), S(0x101a0), R(0x101d0,0x101fc), S(0x1039f), S(0x103d0),
|
||||
S(0x1056f), S(0x10857), R(0x10877,0x10878), S(0x1091f), S(0x1093f), R(0x10a50,0x10a58), S(0x10a7f),
|
||||
S(0x10ac8), R(0x10af0,0x10af6), R(0x10b39,0x10b3f), R(0x10b99,0x10b9c), S(0x10ead), R(0x10f55,0x10f59),
|
||||
R(0x10f86,0x10f89), R(0x11047,0x1104d), R(0x110bb,0x110bc), R(0x110be,0x110c1), R(0x11140,0x11143),
|
||||
R(0x11174,0x11175), R(0x111c5,0x111c8), S(0x111cd), S(0x111db), R(0x111dd,0x111df), R(0x11238,0x1123d),
|
||||
S(0x112a9), R(0x1144b,0x1144f), R(0x1145a,0x1145b), S(0x1145d), S(0x114c6), R(0x115c1,0x115d7),
|
||||
R(0x11641,0x11643), R(0x11660,0x1166c), S(0x116b9), R(0x1173c,0x1173f), S(0x1183b), R(0x11944,0x11946),
|
||||
S(0x119e2), R(0x11a3f,0x11a46), R(0x11a9a,0x11a9c), R(0x11a9e,0x11aa2), R(0x11b00,0x11b09),
|
||||
R(0x11c41,0x11c45), R(0x11c70,0x11c71), R(0x11ef7,0x11ef8), R(0x11f43,0x11f4f), R(0x11fd5,0x11ff1),
|
||||
S(0x11fff), R(0x12470,0x12474), R(0x12ff1,0x12ff2), R(0x16a6e,0x16a6f), S(0x16af5), R(0x16b37,0x16b3f),
|
||||
R(0x16b44,0x16b45), R(0x16e97,0x16e9a), S(0x16fe2), S(0x1bc9c), S(0x1bc9f), R(0x1cf50,0x1cfc3),
|
||||
R(0x1d000,0x1d0f5), R(0x1d100,0x1d126), R(0x1d129,0x1d164), R(0x1d16a,0x1d16c), R(0x1d183,0x1d184),
|
||||
R(0x1d18c,0x1d1a9), R(0x1d1ae,0x1d1ea), R(0x1d200,0x1d241), S(0x1d245), R(0x1d300,0x1d356), S(0x1d6c1),
|
||||
S(0x1d6db), S(0x1d6fb), S(0x1d715), S(0x1d735), S(0x1d74f), S(0x1d76f), S(0x1d789), S(0x1d7a9),
|
||||
S(0x1d7c3), R(0x1d800,0x1d9ff), R(0x1da37,0x1da3a), R(0x1da6d,0x1da74), R(0x1da76,0x1da83),
|
||||
R(0x1da85,0x1da8b), S(0x1e14f), S(0x1e2ff), R(0x1e95e,0x1e95f), S(0x1ecac), S(0x1ecb0), S(0x1ed2e),
|
||||
R(0x1eef0,0x1eef1), R(0x1f000,0x1f02b), R(0x1f030,0x1f093), R(0x1f0a0,0x1f0ae), R(0x1f0b1,0x1f0bf),
|
||||
R(0x1f0c1,0x1f0cf), R(0x1f0d1,0x1f0f5), R(0x1f10d,0x1f1ad), R(0x1f1e6,0x1f202), R(0x1f210,0x1f23b),
|
||||
R(0x1f240,0x1f248), R(0x1f250,0x1f251), R(0x1f260,0x1f265), R(0x1f300,0x1f6d7), R(0x1f6dc,0x1f6ec),
|
||||
R(0x1f6f0,0x1f6fc), R(0x1f700,0x1f776), R(0x1f77b,0x1f7d9), R(0x1f7e0,0x1f7eb), S(0x1f7f0),
|
||||
R(0x1f800,0x1f80b), R(0x1f810,0x1f847), R(0x1f850,0x1f859), R(0x1f860,0x1f887), R(0x1f890,0x1f8ad),
|
||||
R(0x1f8b0,0x1f8b1), R(0x1f900,0x1fa53), R(0x1fa60,0x1fa6d), R(0x1fa70,0x1fa7c), R(0x1fa80,0x1fa88),
|
||||
R(0x1fa90,0x1fabd), R(0x1fabf,0x1fac5), R(0x1face,0x1fadb), R(0x1fae0,0x1fae8), R(0x1faf0,0x1faf8),
|
||||
R(0x1fb00,0x1fb92), R(0x1fb94,0x1fbca)
|
||||
};
|
||||
#undef R
|
||||
#undef S
|
||||
@ -648,89 +679,89 @@ struct MD_UNICODE_FOLD_INFO_tag {
|
||||
#define S(cp) (cp)
|
||||
/* Unicode "Pc", "Pd", "Pe", "Pf", "Pi", "Po", "Ps" categories.
|
||||
* (generated by scripts/build_folding_map.py) */
|
||||
static const unsigned FOLD_MAP_1[] = {
|
||||
R(0x0041,0x005a), S(0x00b5), R(0x00c0,0x00d6), R(0x00d8,0x00de), R(0x0100,0x012e), R(0x0132,0x0136),
|
||||
R(0x0139,0x0147), R(0x014a,0x0176), S(0x0178), R(0x0179,0x017d), S(0x017f), S(0x0181), S(0x0182),
|
||||
S(0x0184), S(0x0186), S(0x0187), S(0x0189), S(0x018a), S(0x018b), S(0x018e), S(0x018f), S(0x0190),
|
||||
S(0x0191), S(0x0193), S(0x0194), S(0x0196), S(0x0197), S(0x0198), S(0x019c), S(0x019d), S(0x019f),
|
||||
R(0x01a0,0x01a4), S(0x01a6), S(0x01a7), S(0x01a9), S(0x01ac), S(0x01ae), S(0x01af), S(0x01b1), S(0x01b2),
|
||||
S(0x01b3), S(0x01b5), S(0x01b7), S(0x01b8), S(0x01bc), S(0x01c4), S(0x01c5), S(0x01c7), S(0x01c8),
|
||||
S(0x01ca), R(0x01cb,0x01db), R(0x01de,0x01ee), S(0x01f1), S(0x01f2), S(0x01f4), S(0x01f6), S(0x01f7),
|
||||
R(0x01f8,0x021e), S(0x0220), R(0x0222,0x0232), S(0x023a), S(0x023b), S(0x023d), S(0x023e), S(0x0241),
|
||||
S(0x0243), S(0x0244), S(0x0245), R(0x0246,0x024e), S(0x0345), S(0x0370), S(0x0372), S(0x0376), S(0x037f),
|
||||
S(0x0386), R(0x0388,0x038a), S(0x038c), S(0x038e), S(0x038f), R(0x0391,0x03a1), R(0x03a3,0x03ab),
|
||||
S(0x03c2), S(0x03cf), S(0x03d0), S(0x03d1), S(0x03d5), S(0x03d6), R(0x03d8,0x03ee), S(0x03f0), S(0x03f1),
|
||||
S(0x03f4), S(0x03f5), S(0x03f7), S(0x03f9), S(0x03fa), R(0x03fd,0x03ff), R(0x0400,0x040f),
|
||||
R(0x0410,0x042f), R(0x0460,0x0480), R(0x048a,0x04be), S(0x04c0), R(0x04c1,0x04cd), R(0x04d0,0x052e),
|
||||
R(0x0531,0x0556), R(0x10a0,0x10c5), S(0x10c7), S(0x10cd), R(0x13f8,0x13fd), S(0x1c80), S(0x1c81),
|
||||
S(0x1c82), S(0x1c83), S(0x1c84), S(0x1c85), S(0x1c86), S(0x1c87), S(0x1c88), R(0x1c90,0x1cba),
|
||||
R(0x1cbd,0x1cbf), R(0x1e00,0x1e94), S(0x1e9b), R(0x1ea0,0x1efe), R(0x1f08,0x1f0f), R(0x1f18,0x1f1d),
|
||||
R(0x1f28,0x1f2f), R(0x1f38,0x1f3f), R(0x1f48,0x1f4d), S(0x1f59), S(0x1f5b), S(0x1f5d), S(0x1f5f),
|
||||
R(0x1f68,0x1f6f), S(0x1fb8), S(0x1fb9), S(0x1fba), S(0x1fbb), S(0x1fbe), R(0x1fc8,0x1fcb), S(0x1fd8),
|
||||
S(0x1fd9), S(0x1fda), S(0x1fdb), S(0x1fe8), S(0x1fe9), S(0x1fea), S(0x1feb), S(0x1fec), S(0x1ff8),
|
||||
S(0x1ff9), S(0x1ffa), S(0x1ffb), S(0x2126), S(0x212a), S(0x212b), S(0x2132), R(0x2160,0x216f), S(0x2183),
|
||||
R(0x24b6,0x24cf), R(0x2c00,0x2c2f), S(0x2c60), S(0x2c62), S(0x2c63), S(0x2c64), R(0x2c67,0x2c6b),
|
||||
S(0x2c6d), S(0x2c6e), S(0x2c6f), S(0x2c70), S(0x2c72), S(0x2c75), S(0x2c7e), S(0x2c7f), R(0x2c80,0x2ce2),
|
||||
S(0x2ceb), S(0x2ced), S(0x2cf2), R(0xa640,0xa66c), R(0xa680,0xa69a), R(0xa722,0xa72e), R(0xa732,0xa76e),
|
||||
S(0xa779), S(0xa77b), S(0xa77d), R(0xa77e,0xa786), S(0xa78b), S(0xa78d), S(0xa790), S(0xa792),
|
||||
R(0xa796,0xa7a8), S(0xa7aa), S(0xa7ab), S(0xa7ac), S(0xa7ad), S(0xa7ae), S(0xa7b0), S(0xa7b1), S(0xa7b2),
|
||||
S(0xa7b3), R(0xa7b4,0xa7c2), S(0xa7c4), S(0xa7c5), S(0xa7c6), S(0xa7c7), S(0xa7c9), S(0xa7d0), S(0xa7d6),
|
||||
S(0xa7d8), S(0xa7f5), R(0xab70,0xabbf), R(0xff21,0xff3a), R(0x10400,0x10427), R(0x104b0,0x104d3),
|
||||
R(0x10570,0x1057a), R(0x1057c,0x1058a), R(0x1058c,0x10592), S(0x10594), S(0x10595), R(0x10c80,0x10cb2),
|
||||
R(0x118a0,0x118bf), R(0x16e40,0x16e5f), R(0x1e900,0x1e921)
|
||||
};
|
||||
static const unsigned FOLD_MAP_1_DATA[] = {
|
||||
0x0061, 0x007a, 0x03bc, 0x00e0, 0x00f6, 0x00f8, 0x00fe, 0x0101, 0x012f, 0x0133, 0x0137, 0x013a, 0x0148,
|
||||
0x014b, 0x0177, 0x00ff, 0x017a, 0x017e, 0x0073, 0x0253, 0x0183, 0x0185, 0x0254, 0x0188, 0x0256, 0x0257,
|
||||
0x018c, 0x01dd, 0x0259, 0x025b, 0x0192, 0x0260, 0x0263, 0x0269, 0x0268, 0x0199, 0x026f, 0x0272, 0x0275,
|
||||
0x01a1, 0x01a5, 0x0280, 0x01a8, 0x0283, 0x01ad, 0x0288, 0x01b0, 0x028a, 0x028b, 0x01b4, 0x01b6, 0x0292,
|
||||
0x01b9, 0x01bd, 0x01c6, 0x01c6, 0x01c9, 0x01c9, 0x01cc, 0x01cc, 0x01dc, 0x01df, 0x01ef, 0x01f3, 0x01f3,
|
||||
0x01f5, 0x0195, 0x01bf, 0x01f9, 0x021f, 0x019e, 0x0223, 0x0233, 0x2c65, 0x023c, 0x019a, 0x2c66, 0x0242,
|
||||
0x0180, 0x0289, 0x028c, 0x0247, 0x024f, 0x03b9, 0x0371, 0x0373, 0x0377, 0x03f3, 0x03ac, 0x03ad, 0x03af,
|
||||
0x03cc, 0x03cd, 0x03ce, 0x03b1, 0x03c1, 0x03c3, 0x03cb, 0x03c3, 0x03d7, 0x03b2, 0x03b8, 0x03c6, 0x03c0,
|
||||
0x03d9, 0x03ef, 0x03ba, 0x03c1, 0x03b8, 0x03b5, 0x03f8, 0x03f2, 0x03fb, 0x037b, 0x037d, 0x0450, 0x045f,
|
||||
0x0430, 0x044f, 0x0461, 0x0481, 0x048b, 0x04bf, 0x04cf, 0x04c2, 0x04ce, 0x04d1, 0x052f, 0x0561, 0x0586,
|
||||
0x2d00, 0x2d25, 0x2d27, 0x2d2d, 0x13f0, 0x13f5, 0x0432, 0x0434, 0x043e, 0x0441, 0x0442, 0x0442, 0x044a,
|
||||
0x0463, 0xa64b, 0x10d0, 0x10fa, 0x10fd, 0x10ff, 0x1e01, 0x1e95, 0x1e61, 0x1ea1, 0x1eff, 0x1f00, 0x1f07,
|
||||
0x1f10, 0x1f15, 0x1f20, 0x1f27, 0x1f30, 0x1f37, 0x1f40, 0x1f45, 0x1f51, 0x1f53, 0x1f55, 0x1f57, 0x1f60,
|
||||
0x1f67, 0x1fb0, 0x1fb1, 0x1f70, 0x1f71, 0x03b9, 0x1f72, 0x1f75, 0x1fd0, 0x1fd1, 0x1f76, 0x1f77, 0x1fe0,
|
||||
0x1fe1, 0x1f7a, 0x1f7b, 0x1fe5, 0x1f78, 0x1f79, 0x1f7c, 0x1f7d, 0x03c9, 0x006b, 0x00e5, 0x214e, 0x2170,
|
||||
0x217f, 0x2184, 0x24d0, 0x24e9, 0x2c30, 0x2c5f, 0x2c61, 0x026b, 0x1d7d, 0x027d, 0x2c68, 0x2c6c, 0x0251,
|
||||
0x0271, 0x0250, 0x0252, 0x2c73, 0x2c76, 0x023f, 0x0240, 0x2c81, 0x2ce3, 0x2cec, 0x2cee, 0x2cf3, 0xa641,
|
||||
0xa66d, 0xa681, 0xa69b, 0xa723, 0xa72f, 0xa733, 0xa76f, 0xa77a, 0xa77c, 0x1d79, 0xa77f, 0xa787, 0xa78c,
|
||||
0x0265, 0xa791, 0xa793, 0xa797, 0xa7a9, 0x0266, 0x025c, 0x0261, 0x026c, 0x026a, 0x029e, 0x0287, 0x029d,
|
||||
0xab53, 0xa7b5, 0xa7c3, 0xa794, 0x0282, 0x1d8e, 0xa7c8, 0xa7ca, 0xa7d1, 0xa7d7, 0xa7d9, 0xa7f6, 0x13a0,
|
||||
0x13ef, 0xff41, 0xff5a, 0x10428, 0x1044f, 0x104d8, 0x104fb, 0x10597, 0x105a1, 0x105a3, 0x105b1, 0x105b3,
|
||||
0x105b9, 0x105bb, 0x105bc, 0x10cc0, 0x10cf2, 0x118c0, 0x118df, 0x16e60, 0x16e7f, 0x1e922, 0x1e943
|
||||
};
|
||||
static const unsigned FOLD_MAP_2[] = {
|
||||
S(0x00df), S(0x0130), S(0x0149), S(0x01f0), S(0x0587), S(0x1e96), S(0x1e97), S(0x1e98), S(0x1e99),
|
||||
S(0x1e9a), S(0x1e9e), S(0x1f50), R(0x1f80,0x1f87), R(0x1f88,0x1f8f), R(0x1f90,0x1f97), R(0x1f98,0x1f9f),
|
||||
R(0x1fa0,0x1fa7), R(0x1fa8,0x1faf), S(0x1fb2), S(0x1fb3), S(0x1fb4), S(0x1fb6), S(0x1fbc), S(0x1fc2),
|
||||
S(0x1fc3), S(0x1fc4), S(0x1fc6), S(0x1fcc), S(0x1fd6), S(0x1fe4), S(0x1fe6), S(0x1ff2), S(0x1ff3),
|
||||
S(0x1ff4), S(0x1ff6), S(0x1ffc), S(0xfb00), S(0xfb01), S(0xfb02), S(0xfb05), S(0xfb06), S(0xfb13),
|
||||
S(0xfb14), S(0xfb15), S(0xfb16), S(0xfb17)
|
||||
};
|
||||
static const unsigned FOLD_MAP_2_DATA[] = {
|
||||
0x0073,0x0073, 0x0069,0x0307, 0x02bc,0x006e, 0x006a,0x030c, 0x0565,0x0582, 0x0068,0x0331, 0x0074,0x0308,
|
||||
0x0077,0x030a, 0x0079,0x030a, 0x0061,0x02be, 0x0073,0x0073, 0x03c5,0x0313, 0x1f00,0x03b9, 0x1f07,0x03b9,
|
||||
0x1f00,0x03b9, 0x1f07,0x03b9, 0x1f20,0x03b9, 0x1f27,0x03b9, 0x1f20,0x03b9, 0x1f27,0x03b9, 0x1f60,0x03b9,
|
||||
0x1f67,0x03b9, 0x1f60,0x03b9, 0x1f67,0x03b9, 0x1f70,0x03b9, 0x03b1,0x03b9, 0x03ac,0x03b9, 0x03b1,0x0342,
|
||||
0x03b1,0x03b9, 0x1f74,0x03b9, 0x03b7,0x03b9, 0x03ae,0x03b9, 0x03b7,0x0342, 0x03b7,0x03b9, 0x03b9,0x0342,
|
||||
0x03c1,0x0313, 0x03c5,0x0342, 0x1f7c,0x03b9, 0x03c9,0x03b9, 0x03ce,0x03b9, 0x03c9,0x0342, 0x03c9,0x03b9,
|
||||
0x0066,0x0066, 0x0066,0x0069, 0x0066,0x006c, 0x0073,0x0074, 0x0073,0x0074, 0x0574,0x0576, 0x0574,0x0565,
|
||||
0x0574,0x056b, 0x057e,0x0576, 0x0574,0x056d
|
||||
};
|
||||
static const unsigned FOLD_MAP_3[] = {
|
||||
S(0x0390), S(0x03b0), S(0x1f52), S(0x1f54), S(0x1f56), S(0x1fb7), S(0x1fc7), S(0x1fd2), S(0x1fd3),
|
||||
S(0x1fd7), S(0x1fe2), S(0x1fe3), S(0x1fe7), S(0x1ff7), S(0xfb03), S(0xfb04)
|
||||
};
|
||||
static const unsigned FOLD_MAP_3_DATA[] = {
|
||||
0x03b9,0x0308,0x0301, 0x03c5,0x0308,0x0301, 0x03c5,0x0313,0x0300, 0x03c5,0x0313,0x0301,
|
||||
0x03c5,0x0313,0x0342, 0x03b1,0x0342,0x03b9, 0x03b7,0x0342,0x03b9, 0x03b9,0x0308,0x0300,
|
||||
0x03b9,0x0308,0x0301, 0x03b9,0x0308,0x0342, 0x03c5,0x0308,0x0300, 0x03c5,0x0308,0x0301,
|
||||
0x03c5,0x0308,0x0342, 0x03c9,0x0342,0x03b9, 0x0066,0x0066,0x0069, 0x0066,0x0066,0x006c
|
||||
};
|
||||
static const unsigned FOLD_MAP_1[] = {
|
||||
R(0x0041,0x005a), S(0x00b5), R(0x00c0,0x00d6), R(0x00d8,0x00de), R(0x0100,0x012e), R(0x0132,0x0136),
|
||||
R(0x0139,0x0147), R(0x014a,0x0176), S(0x0178), R(0x0179,0x017d), S(0x017f), S(0x0181), S(0x0182),
|
||||
S(0x0184), S(0x0186), S(0x0187), S(0x0189), S(0x018a), S(0x018b), S(0x018e), S(0x018f), S(0x0190),
|
||||
S(0x0191), S(0x0193), S(0x0194), S(0x0196), S(0x0197), S(0x0198), S(0x019c), S(0x019d), S(0x019f),
|
||||
R(0x01a0,0x01a4), S(0x01a6), S(0x01a7), S(0x01a9), S(0x01ac), S(0x01ae), S(0x01af), S(0x01b1), S(0x01b2),
|
||||
S(0x01b3), S(0x01b5), S(0x01b7), S(0x01b8), S(0x01bc), S(0x01c4), S(0x01c5), S(0x01c7), S(0x01c8),
|
||||
S(0x01ca), R(0x01cb,0x01db), R(0x01de,0x01ee), S(0x01f1), S(0x01f2), S(0x01f4), S(0x01f6), S(0x01f7),
|
||||
R(0x01f8,0x021e), S(0x0220), R(0x0222,0x0232), S(0x023a), S(0x023b), S(0x023d), S(0x023e), S(0x0241),
|
||||
S(0x0243), S(0x0244), S(0x0245), R(0x0246,0x024e), S(0x0345), S(0x0370), S(0x0372), S(0x0376), S(0x037f),
|
||||
S(0x0386), R(0x0388,0x038a), S(0x038c), S(0x038e), S(0x038f), R(0x0391,0x03a1), R(0x03a3,0x03ab),
|
||||
S(0x03c2), S(0x03cf), S(0x03d0), S(0x03d1), S(0x03d5), S(0x03d6), R(0x03d8,0x03ee), S(0x03f0), S(0x03f1),
|
||||
S(0x03f4), S(0x03f5), S(0x03f7), S(0x03f9), S(0x03fa), R(0x03fd,0x03ff), R(0x0400,0x040f),
|
||||
R(0x0410,0x042f), R(0x0460,0x0480), R(0x048a,0x04be), S(0x04c0), R(0x04c1,0x04cd), R(0x04d0,0x052e),
|
||||
R(0x0531,0x0556), R(0x10a0,0x10c5), S(0x10c7), S(0x10cd), R(0x13f8,0x13fd), S(0x1c80), S(0x1c81),
|
||||
S(0x1c82), S(0x1c83), S(0x1c84), S(0x1c85), S(0x1c86), S(0x1c87), S(0x1c88), R(0x1c90,0x1cba),
|
||||
R(0x1cbd,0x1cbf), R(0x1e00,0x1e94), S(0x1e9b), R(0x1ea0,0x1efe), R(0x1f08,0x1f0f), R(0x1f18,0x1f1d),
|
||||
R(0x1f28,0x1f2f), R(0x1f38,0x1f3f), R(0x1f48,0x1f4d), S(0x1f59), S(0x1f5b), S(0x1f5d), S(0x1f5f),
|
||||
R(0x1f68,0x1f6f), S(0x1fb8), S(0x1fb9), S(0x1fba), S(0x1fbb), S(0x1fbe), R(0x1fc8,0x1fcb), S(0x1fd8),
|
||||
S(0x1fd9), S(0x1fda), S(0x1fdb), S(0x1fe8), S(0x1fe9), S(0x1fea), S(0x1feb), S(0x1fec), S(0x1ff8),
|
||||
S(0x1ff9), S(0x1ffa), S(0x1ffb), S(0x2126), S(0x212a), S(0x212b), S(0x2132), R(0x2160,0x216f), S(0x2183),
|
||||
R(0x24b6,0x24cf), R(0x2c00,0x2c2f), S(0x2c60), S(0x2c62), S(0x2c63), S(0x2c64), R(0x2c67,0x2c6b),
|
||||
S(0x2c6d), S(0x2c6e), S(0x2c6f), S(0x2c70), S(0x2c72), S(0x2c75), S(0x2c7e), S(0x2c7f), R(0x2c80,0x2ce2),
|
||||
S(0x2ceb), S(0x2ced), S(0x2cf2), R(0xa640,0xa66c), R(0xa680,0xa69a), R(0xa722,0xa72e), R(0xa732,0xa76e),
|
||||
S(0xa779), S(0xa77b), S(0xa77d), R(0xa77e,0xa786), S(0xa78b), S(0xa78d), S(0xa790), S(0xa792),
|
||||
R(0xa796,0xa7a8), S(0xa7aa), S(0xa7ab), S(0xa7ac), S(0xa7ad), S(0xa7ae), S(0xa7b0), S(0xa7b1), S(0xa7b2),
|
||||
S(0xa7b3), R(0xa7b4,0xa7c2), S(0xa7c4), S(0xa7c5), S(0xa7c6), S(0xa7c7), S(0xa7c9), S(0xa7d0), S(0xa7d6),
|
||||
S(0xa7d8), S(0xa7f5), R(0xab70,0xabbf), R(0xff21,0xff3a), R(0x10400,0x10427), R(0x104b0,0x104d3),
|
||||
R(0x10570,0x1057a), R(0x1057c,0x1058a), R(0x1058c,0x10592), S(0x10594), S(0x10595), R(0x10c80,0x10cb2),
|
||||
R(0x118a0,0x118bf), R(0x16e40,0x16e5f), R(0x1e900,0x1e921)
|
||||
};
|
||||
static const unsigned FOLD_MAP_1_DATA[] = {
|
||||
0x0061, 0x007a, 0x03bc, 0x00e0, 0x00f6, 0x00f8, 0x00fe, 0x0101, 0x012f, 0x0133, 0x0137, 0x013a, 0x0148,
|
||||
0x014b, 0x0177, 0x00ff, 0x017a, 0x017e, 0x0073, 0x0253, 0x0183, 0x0185, 0x0254, 0x0188, 0x0256, 0x0257,
|
||||
0x018c, 0x01dd, 0x0259, 0x025b, 0x0192, 0x0260, 0x0263, 0x0269, 0x0268, 0x0199, 0x026f, 0x0272, 0x0275,
|
||||
0x01a1, 0x01a5, 0x0280, 0x01a8, 0x0283, 0x01ad, 0x0288, 0x01b0, 0x028a, 0x028b, 0x01b4, 0x01b6, 0x0292,
|
||||
0x01b9, 0x01bd, 0x01c6, 0x01c6, 0x01c9, 0x01c9, 0x01cc, 0x01cc, 0x01dc, 0x01df, 0x01ef, 0x01f3, 0x01f3,
|
||||
0x01f5, 0x0195, 0x01bf, 0x01f9, 0x021f, 0x019e, 0x0223, 0x0233, 0x2c65, 0x023c, 0x019a, 0x2c66, 0x0242,
|
||||
0x0180, 0x0289, 0x028c, 0x0247, 0x024f, 0x03b9, 0x0371, 0x0373, 0x0377, 0x03f3, 0x03ac, 0x03ad, 0x03af,
|
||||
0x03cc, 0x03cd, 0x03ce, 0x03b1, 0x03c1, 0x03c3, 0x03cb, 0x03c3, 0x03d7, 0x03b2, 0x03b8, 0x03c6, 0x03c0,
|
||||
0x03d9, 0x03ef, 0x03ba, 0x03c1, 0x03b8, 0x03b5, 0x03f8, 0x03f2, 0x03fb, 0x037b, 0x037d, 0x0450, 0x045f,
|
||||
0x0430, 0x044f, 0x0461, 0x0481, 0x048b, 0x04bf, 0x04cf, 0x04c2, 0x04ce, 0x04d1, 0x052f, 0x0561, 0x0586,
|
||||
0x2d00, 0x2d25, 0x2d27, 0x2d2d, 0x13f0, 0x13f5, 0x0432, 0x0434, 0x043e, 0x0441, 0x0442, 0x0442, 0x044a,
|
||||
0x0463, 0xa64b, 0x10d0, 0x10fa, 0x10fd, 0x10ff, 0x1e01, 0x1e95, 0x1e61, 0x1ea1, 0x1eff, 0x1f00, 0x1f07,
|
||||
0x1f10, 0x1f15, 0x1f20, 0x1f27, 0x1f30, 0x1f37, 0x1f40, 0x1f45, 0x1f51, 0x1f53, 0x1f55, 0x1f57, 0x1f60,
|
||||
0x1f67, 0x1fb0, 0x1fb1, 0x1f70, 0x1f71, 0x03b9, 0x1f72, 0x1f75, 0x1fd0, 0x1fd1, 0x1f76, 0x1f77, 0x1fe0,
|
||||
0x1fe1, 0x1f7a, 0x1f7b, 0x1fe5, 0x1f78, 0x1f79, 0x1f7c, 0x1f7d, 0x03c9, 0x006b, 0x00e5, 0x214e, 0x2170,
|
||||
0x217f, 0x2184, 0x24d0, 0x24e9, 0x2c30, 0x2c5f, 0x2c61, 0x026b, 0x1d7d, 0x027d, 0x2c68, 0x2c6c, 0x0251,
|
||||
0x0271, 0x0250, 0x0252, 0x2c73, 0x2c76, 0x023f, 0x0240, 0x2c81, 0x2ce3, 0x2cec, 0x2cee, 0x2cf3, 0xa641,
|
||||
0xa66d, 0xa681, 0xa69b, 0xa723, 0xa72f, 0xa733, 0xa76f, 0xa77a, 0xa77c, 0x1d79, 0xa77f, 0xa787, 0xa78c,
|
||||
0x0265, 0xa791, 0xa793, 0xa797, 0xa7a9, 0x0266, 0x025c, 0x0261, 0x026c, 0x026a, 0x029e, 0x0287, 0x029d,
|
||||
0xab53, 0xa7b5, 0xa7c3, 0xa794, 0x0282, 0x1d8e, 0xa7c8, 0xa7ca, 0xa7d1, 0xa7d7, 0xa7d9, 0xa7f6, 0x13a0,
|
||||
0x13ef, 0xff41, 0xff5a, 0x10428, 0x1044f, 0x104d8, 0x104fb, 0x10597, 0x105a1, 0x105a3, 0x105b1, 0x105b3,
|
||||
0x105b9, 0x105bb, 0x105bc, 0x10cc0, 0x10cf2, 0x118c0, 0x118df, 0x16e60, 0x16e7f, 0x1e922, 0x1e943
|
||||
};
|
||||
static const unsigned FOLD_MAP_2[] = {
|
||||
S(0x00df), S(0x0130), S(0x0149), S(0x01f0), S(0x0587), S(0x1e96), S(0x1e97), S(0x1e98), S(0x1e99),
|
||||
S(0x1e9a), S(0x1e9e), S(0x1f50), R(0x1f80,0x1f87), R(0x1f88,0x1f8f), R(0x1f90,0x1f97), R(0x1f98,0x1f9f),
|
||||
R(0x1fa0,0x1fa7), R(0x1fa8,0x1faf), S(0x1fb2), S(0x1fb3), S(0x1fb4), S(0x1fb6), S(0x1fbc), S(0x1fc2),
|
||||
S(0x1fc3), S(0x1fc4), S(0x1fc6), S(0x1fcc), S(0x1fd6), S(0x1fe4), S(0x1fe6), S(0x1ff2), S(0x1ff3),
|
||||
S(0x1ff4), S(0x1ff6), S(0x1ffc), S(0xfb00), S(0xfb01), S(0xfb02), S(0xfb05), S(0xfb06), S(0xfb13),
|
||||
S(0xfb14), S(0xfb15), S(0xfb16), S(0xfb17)
|
||||
};
|
||||
static const unsigned FOLD_MAP_2_DATA[] = {
|
||||
0x0073,0x0073, 0x0069,0x0307, 0x02bc,0x006e, 0x006a,0x030c, 0x0565,0x0582, 0x0068,0x0331, 0x0074,0x0308,
|
||||
0x0077,0x030a, 0x0079,0x030a, 0x0061,0x02be, 0x0073,0x0073, 0x03c5,0x0313, 0x1f00,0x03b9, 0x1f07,0x03b9,
|
||||
0x1f00,0x03b9, 0x1f07,0x03b9, 0x1f20,0x03b9, 0x1f27,0x03b9, 0x1f20,0x03b9, 0x1f27,0x03b9, 0x1f60,0x03b9,
|
||||
0x1f67,0x03b9, 0x1f60,0x03b9, 0x1f67,0x03b9, 0x1f70,0x03b9, 0x03b1,0x03b9, 0x03ac,0x03b9, 0x03b1,0x0342,
|
||||
0x03b1,0x03b9, 0x1f74,0x03b9, 0x03b7,0x03b9, 0x03ae,0x03b9, 0x03b7,0x0342, 0x03b7,0x03b9, 0x03b9,0x0342,
|
||||
0x03c1,0x0313, 0x03c5,0x0342, 0x1f7c,0x03b9, 0x03c9,0x03b9, 0x03ce,0x03b9, 0x03c9,0x0342, 0x03c9,0x03b9,
|
||||
0x0066,0x0066, 0x0066,0x0069, 0x0066,0x006c, 0x0073,0x0074, 0x0073,0x0074, 0x0574,0x0576, 0x0574,0x0565,
|
||||
0x0574,0x056b, 0x057e,0x0576, 0x0574,0x056d
|
||||
};
|
||||
static const unsigned FOLD_MAP_3[] = {
|
||||
S(0x0390), S(0x03b0), S(0x1f52), S(0x1f54), S(0x1f56), S(0x1fb7), S(0x1fc7), S(0x1fd2), S(0x1fd3),
|
||||
S(0x1fd7), S(0x1fe2), S(0x1fe3), S(0x1fe7), S(0x1ff7), S(0xfb03), S(0xfb04)
|
||||
};
|
||||
static const unsigned FOLD_MAP_3_DATA[] = {
|
||||
0x03b9,0x0308,0x0301, 0x03c5,0x0308,0x0301, 0x03c5,0x0313,0x0300, 0x03c5,0x0313,0x0301,
|
||||
0x03c5,0x0313,0x0342, 0x03b1,0x0342,0x03b9, 0x03b7,0x0342,0x03b9, 0x03b9,0x0308,0x0300,
|
||||
0x03b9,0x0308,0x0301, 0x03b9,0x0308,0x0342, 0x03c5,0x0308,0x0300, 0x03c5,0x0308,0x0301,
|
||||
0x03c5,0x0308,0x0342, 0x03c9,0x0342,0x03b9, 0x0066,0x0066,0x0069, 0x0066,0x0066,0x006c
|
||||
};
|
||||
#undef R
|
||||
#undef S
|
||||
static const struct {
|
||||
@ -954,7 +985,7 @@ static const unsigned FOLD_MAP_3_DATA[] = {
|
||||
* what the caller should allocate.)
|
||||
*/
|
||||
static void
|
||||
md_merge_lines(MD_CTX* ctx, OFF beg, OFF end, const MD_LINE* lines, int n_lines,
|
||||
md_merge_lines(MD_CTX* ctx, OFF beg, OFF end, const MD_LINE* lines, MD_SIZE n_lines,
|
||||
CHAR line_break_replacement_char, CHAR* buffer, SZ* p_size)
|
||||
{
|
||||
CHAR* ptr = buffer;
|
||||
@ -991,7 +1022,7 @@ md_merge_lines(MD_CTX* ctx, OFF beg, OFF end, const MD_LINE* lines, int n_lines,
|
||||
/* Wrapper of md_merge_lines() which allocates new buffer for the output string.
|
||||
*/
|
||||
static int
|
||||
md_merge_lines_alloc(MD_CTX* ctx, OFF beg, OFF end, const MD_LINE* lines, int n_lines,
|
||||
md_merge_lines_alloc(MD_CTX* ctx, OFF beg, OFF end, const MD_LINE* lines, MD_SIZE n_lines,
|
||||
CHAR line_break_replacement_char, CHAR** p_str, SZ* p_size)
|
||||
{
|
||||
CHAR* buffer;
|
||||
@ -1038,12 +1069,12 @@ md_skip_unicode_whitespace(const CHAR* label, OFF off, SZ size)
|
||||
* by n_lines == 0.
|
||||
*/
|
||||
static int
|
||||
md_is_html_tag(MD_CTX* ctx, const MD_LINE* lines, int n_lines, OFF beg, OFF max_end, OFF* p_end)
|
||||
md_is_html_tag(MD_CTX* ctx, const MD_LINE* lines, MD_SIZE n_lines, OFF beg, OFF max_end, OFF* p_end)
|
||||
{
|
||||
int attr_state;
|
||||
OFF off = beg;
|
||||
OFF line_end = (n_lines > 0) ? lines[0].end : ctx->size;
|
||||
int i = 0;
|
||||
MD_SIZE line_index = 0;
|
||||
|
||||
MD_ASSERT(CH(beg) == _T('<'));
|
||||
|
||||
@ -1133,12 +1164,12 @@ md_is_html_tag(MD_CTX* ctx, const MD_LINE* lines, int n_lines, OFF beg, OFF max_
|
||||
if(n_lines == 0)
|
||||
return FALSE;
|
||||
|
||||
i++;
|
||||
if(i >= n_lines)
|
||||
line_index++;
|
||||
if(line_index >= n_lines)
|
||||
return FALSE;
|
||||
|
||||
off = lines[i].beg;
|
||||
line_end = lines[i].end;
|
||||
off = lines[line_index].beg;
|
||||
line_end = lines[line_index].end;
|
||||
|
||||
if(attr_state == 0 || attr_state == 41)
|
||||
attr_state = 1;
|
||||
@ -1157,12 +1188,12 @@ done:
|
||||
|
||||
static int
|
||||
md_scan_for_html_closer(MD_CTX* ctx, const MD_CHAR* str, MD_SIZE len,
|
||||
const MD_LINE* lines, int n_lines,
|
||||
const MD_LINE* lines, MD_SIZE n_lines,
|
||||
OFF beg, OFF max_end, OFF* p_end,
|
||||
OFF* p_scan_horizon)
|
||||
{
|
||||
OFF off = beg;
|
||||
int i = 0;
|
||||
MD_SIZE line_index = 0;
|
||||
|
||||
if(off < *p_scan_horizon && *p_scan_horizon >= max_end - len) {
|
||||
/* We have already scanned the range up to the max_end so we know
|
||||
@ -1171,7 +1202,7 @@ md_scan_for_html_closer(MD_CTX* ctx, const MD_CHAR* str, MD_SIZE len,
|
||||
}
|
||||
|
||||
while(TRUE) {
|
||||
while(off + len <= lines[i].end && off + len <= max_end) {
|
||||
while(off + len <= lines[line_index].end && off + len <= max_end) {
|
||||
if(md_ascii_eq(STR(off), str, len)) {
|
||||
/* Success. */
|
||||
*p_end = off + len;
|
||||
@ -1180,19 +1211,19 @@ md_scan_for_html_closer(MD_CTX* ctx, const MD_CHAR* str, MD_SIZE len,
|
||||
off++;
|
||||
}
|
||||
|
||||
i++;
|
||||
if(off >= max_end || i >= n_lines) {
|
||||
line_index++;
|
||||
if(off >= max_end || line_index >= n_lines) {
|
||||
/* Failure. */
|
||||
*p_scan_horizon = off;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
off = lines[i].beg;
|
||||
off = lines[line_index].beg;
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
md_is_html_comment(MD_CTX* ctx, const MD_LINE* lines, int n_lines, OFF beg, OFF max_end, OFF* p_end)
|
||||
md_is_html_comment(MD_CTX* ctx, const MD_LINE* lines, MD_SIZE n_lines, OFF beg, OFF max_end, OFF* p_end)
|
||||
{
|
||||
OFF off = beg;
|
||||
|
||||
@ -1202,30 +1233,17 @@ md_is_html_comment(MD_CTX* ctx, const MD_LINE* lines, int n_lines, OFF beg, OFF
|
||||
return FALSE;
|
||||
if(CH(off+1) != _T('!') || CH(off+2) != _T('-') || CH(off+3) != _T('-'))
|
||||
return FALSE;
|
||||
off += 4;
|
||||
|
||||
/* ">" and "->" must not follow the opening. */
|
||||
if(off < lines[0].end && CH(off) == _T('>'))
|
||||
return FALSE;
|
||||
if(off+1 < lines[0].end && CH(off) == _T('-') && CH(off+1) == _T('>'))
|
||||
return FALSE;
|
||||
/* Skip only "<!" so that we accept also "<!-->" or "<!--->" */
|
||||
off += 2;
|
||||
|
||||
/* HTML comment must not contain "--", so we scan just for "--" instead
|
||||
* of "-->" and verify manually that '>' follows. */
|
||||
if(md_scan_for_html_closer(ctx, _T("--"), 2,
|
||||
lines, n_lines, off, max_end, p_end, &ctx->html_comment_horizon))
|
||||
{
|
||||
if(*p_end < max_end && CH(*p_end) == _T('>')) {
|
||||
*p_end = *p_end + 1;
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
/* Scan for ordinary comment closer "-->". */
|
||||
return md_scan_for_html_closer(ctx, _T("-->"), 3,
|
||||
lines, n_lines, off, max_end, p_end, &ctx->html_comment_horizon);
|
||||
}
|
||||
|
||||
static int
|
||||
md_is_html_processing_instruction(MD_CTX* ctx, const MD_LINE* lines, int n_lines, OFF beg, OFF max_end, OFF* p_end)
|
||||
md_is_html_processing_instruction(MD_CTX* ctx, const MD_LINE* lines, MD_SIZE n_lines, OFF beg, OFF max_end, OFF* p_end)
|
||||
{
|
||||
OFF off = beg;
|
||||
|
||||
@ -1240,7 +1258,7 @@ md_is_html_processing_instruction(MD_CTX* ctx, const MD_LINE* lines, int n_lines
|
||||
}
|
||||
|
||||
static int
|
||||
md_is_html_declaration(MD_CTX* ctx, const MD_LINE* lines, int n_lines, OFF beg, OFF max_end, OFF* p_end)
|
||||
md_is_html_declaration(MD_CTX* ctx, const MD_LINE* lines, MD_SIZE n_lines, OFF beg, OFF max_end, OFF* p_end)
|
||||
{
|
||||
OFF off = beg;
|
||||
|
||||
@ -1262,7 +1280,7 @@ md_is_html_declaration(MD_CTX* ctx, const MD_LINE* lines, int n_lines, OFF beg,
|
||||
}
|
||||
|
||||
static int
|
||||
md_is_html_cdata(MD_CTX* ctx, const MD_LINE* lines, int n_lines, OFF beg, OFF max_end, OFF* p_end)
|
||||
md_is_html_cdata(MD_CTX* ctx, const MD_LINE* lines, MD_SIZE n_lines, OFF beg, OFF max_end, OFF* p_end)
|
||||
{
|
||||
static const CHAR open_str[] = _T("<![CDATA[");
|
||||
static const SZ open_size = SIZEOF_ARRAY(open_str) - 1;
|
||||
@ -1275,15 +1293,12 @@ md_is_html_cdata(MD_CTX* ctx, const MD_LINE* lines, int n_lines, OFF beg, OFF ma
|
||||
return FALSE;
|
||||
off += open_size;
|
||||
|
||||
if(lines[n_lines-1].end < max_end)
|
||||
max_end = lines[n_lines-1].end - 2;
|
||||
|
||||
return md_scan_for_html_closer(ctx, _T("]]>"), 3,
|
||||
lines, n_lines, off, max_end, p_end, &ctx->html_cdata_horizon);
|
||||
}
|
||||
|
||||
static int
|
||||
md_is_html_any(MD_CTX* ctx, const MD_LINE* lines, int n_lines, OFF beg, OFF max_end, OFF* p_end)
|
||||
md_is_html_any(MD_CTX* ctx, const MD_LINE* lines, MD_SIZE n_lines, OFF beg, OFF max_end, OFF* p_end)
|
||||
{
|
||||
MD_ASSERT(CH(beg) == _T('<'));
|
||||
return (md_is_html_tag(ctx, lines, n_lines, beg, max_end, p_end) ||
|
||||
@ -1911,14 +1926,14 @@ struct MD_LINK_ATTR_tag {
|
||||
|
||||
|
||||
static int
|
||||
md_is_link_label(MD_CTX* ctx, const MD_LINE* lines, int n_lines, OFF beg,
|
||||
OFF* p_end, int* p_beg_line_index, int* p_end_line_index,
|
||||
md_is_link_label(MD_CTX* ctx, const MD_LINE* lines, MD_SIZE n_lines, OFF beg,
|
||||
OFF* p_end, MD_SIZE* p_beg_line_index, MD_SIZE* p_end_line_index,
|
||||
OFF* p_contents_beg, OFF* p_contents_end)
|
||||
{
|
||||
OFF off = beg;
|
||||
OFF contents_beg = 0;
|
||||
OFF contents_end = 0;
|
||||
int line_index = 0;
|
||||
MD_SIZE line_index = 0;
|
||||
int len = 0;
|
||||
|
||||
if(CH(off) != _T('['))
|
||||
@ -2068,13 +2083,13 @@ md_is_link_destination(MD_CTX* ctx, OFF beg, OFF max_end, OFF* p_end,
|
||||
}
|
||||
|
||||
static int
|
||||
md_is_link_title(MD_CTX* ctx, const MD_LINE* lines, int n_lines, OFF beg,
|
||||
OFF* p_end, int* p_beg_line_index, int* p_end_line_index,
|
||||
md_is_link_title(MD_CTX* ctx, const MD_LINE* lines, MD_SIZE n_lines, OFF beg,
|
||||
OFF* p_end, MD_SIZE* p_beg_line_index, MD_SIZE* p_end_line_index,
|
||||
OFF* p_contents_beg, OFF* p_contents_end)
|
||||
{
|
||||
OFF off = beg;
|
||||
CHAR closer_char;
|
||||
int line_index = 0;
|
||||
MD_SIZE line_index = 0;
|
||||
|
||||
/* White space with up to one line break. */
|
||||
while(off < lines[line_index].end && ISWHITESPACE(off))
|
||||
@ -2136,21 +2151,21 @@ md_is_link_title(MD_CTX* ctx, const MD_LINE* lines, int n_lines, OFF beg,
|
||||
* Returns -1 in case of an error (out of memory).
|
||||
*/
|
||||
static int
|
||||
md_is_link_reference_definition(MD_CTX* ctx, const MD_LINE* lines, int n_lines)
|
||||
md_is_link_reference_definition(MD_CTX* ctx, const MD_LINE* lines, MD_SIZE n_lines)
|
||||
{
|
||||
OFF label_contents_beg;
|
||||
OFF label_contents_end;
|
||||
int label_contents_line_index = -1;
|
||||
MD_SIZE label_contents_line_index;
|
||||
int label_is_multiline = FALSE;
|
||||
OFF dest_contents_beg;
|
||||
OFF dest_contents_end;
|
||||
OFF title_contents_beg;
|
||||
OFF title_contents_end;
|
||||
int title_contents_line_index;
|
||||
MD_SIZE title_contents_line_index;
|
||||
int title_is_multiline = FALSE;
|
||||
OFF off;
|
||||
int line_index = 0;
|
||||
int tmp_line_index;
|
||||
MD_SIZE line_index = 0;
|
||||
MD_SIZE tmp_line_index;
|
||||
MD_REF_DEF* def = NULL;
|
||||
int ret = 0;
|
||||
|
||||
@ -2258,7 +2273,7 @@ abort:
|
||||
}
|
||||
|
||||
static int
|
||||
md_is_link_reference(MD_CTX* ctx, const MD_LINE* lines, int n_lines,
|
||||
md_is_link_reference(MD_CTX* ctx, const MD_LINE* lines, MD_SIZE n_lines,
|
||||
OFF beg, OFF end, MD_LINK_ATTR* attr)
|
||||
{
|
||||
const MD_REF_DEF* def;
|
||||
@ -2275,7 +2290,7 @@ md_is_link_reference(MD_CTX* ctx, const MD_LINE* lines, int n_lines,
|
||||
end--;
|
||||
|
||||
/* Find lines corresponding to the beg and end positions. */
|
||||
beg_line = md_lookup_line(beg, lines, n_lines);
|
||||
beg_line = md_lookup_line(beg, lines, n_lines, NULL);
|
||||
is_multiline = (end > beg_line->end);
|
||||
|
||||
if(is_multiline) {
|
||||
@ -2305,14 +2320,14 @@ abort:
|
||||
}
|
||||
|
||||
static int
|
||||
md_is_inline_link_spec(MD_CTX* ctx, const MD_LINE* lines, int n_lines,
|
||||
md_is_inline_link_spec(MD_CTX* ctx, const MD_LINE* lines, MD_SIZE n_lines,
|
||||
OFF beg, OFF* p_end, MD_LINK_ATTR* attr)
|
||||
{
|
||||
int line_index = 0;
|
||||
int tmp_line_index;
|
||||
MD_SIZE line_index = 0;
|
||||
MD_SIZE tmp_line_index;
|
||||
OFF title_contents_beg;
|
||||
OFF title_contents_end;
|
||||
int title_contents_line_index;
|
||||
MD_SIZE title_contents_line_index;
|
||||
int title_is_multiline;
|
||||
OFF off = beg;
|
||||
int ret = FALSE;
|
||||
@ -2509,7 +2524,6 @@ struct MD_MARK_tag {
|
||||
#define MD_MARK_RESOLVED 0x10 /* Resolved in any definite way. */
|
||||
|
||||
/* Mark flags specific for various mark types (so they can share bits). */
|
||||
#define MD_MARK_CODE_EXTRA_SPACE 0x20
|
||||
#define MD_MARK_EMPH_OC 0x20 /* Opener/closer mixed candidate. Helper for the "rule of 3". */
|
||||
#define MD_MARK_EMPH_MOD3_0 0x40
|
||||
#define MD_MARK_EMPH_MOD3_1 0x80
|
||||
@ -2558,7 +2572,7 @@ md_opener_stack(MD_CTX* ctx, int mark_index)
|
||||
case _T('!'):
|
||||
case _T('['): return &BRACKET_OPENERS;
|
||||
|
||||
default: return NULL;
|
||||
default: MD_UNREACHABLE();
|
||||
}
|
||||
}
|
||||
|
||||
@ -2741,7 +2755,7 @@ md_build_mark_char_map(MD_CTX* ctx)
|
||||
}
|
||||
|
||||
static int
|
||||
md_is_code_span(MD_CTX* ctx, const MD_LINE* lines, int n_lines, OFF beg,
|
||||
md_is_code_span(MD_CTX* ctx, const MD_LINE* lines, MD_SIZE n_lines, OFF beg,
|
||||
MD_MARK* opener, MD_MARK* closer,
|
||||
OFF last_potential_closers[CODESPAN_MARK_MAXLEN],
|
||||
int* p_reached_paragraph_end)
|
||||
@ -2757,9 +2771,7 @@ md_is_code_span(MD_CTX* ctx, const MD_LINE* lines, int n_lines, OFF beg,
|
||||
int has_space_before_closer = FALSE;
|
||||
int has_eol_before_closer = FALSE;
|
||||
int has_only_space = TRUE;
|
||||
int opener_needs_extra_space = FALSE;
|
||||
int closer_needs_extra_space = FALSE;
|
||||
int line_index = 0;
|
||||
MD_SIZE line_index = 0;
|
||||
|
||||
line_end = lines[0].end;
|
||||
opener_end = opener_beg;
|
||||
@ -2845,27 +2857,22 @@ md_is_code_span(MD_CTX* ctx, const MD_LINE* lines, int n_lines, OFF beg,
|
||||
if(has_space_before_closer)
|
||||
closer_beg--;
|
||||
else {
|
||||
/* Go back to the end of prev line */
|
||||
closer_beg = lines[line_index-1].end;
|
||||
/* We need to eat the preceding "\r\n" but not any line trailing
|
||||
* spaces. */
|
||||
/* But restore any trailing whitespace */
|
||||
while(closer_beg < ctx->size && ISBLANK(closer_beg))
|
||||
closer_beg++;
|
||||
}
|
||||
} else {
|
||||
if(has_eol_after_opener)
|
||||
opener_needs_extra_space = TRUE;
|
||||
if(has_eol_before_closer)
|
||||
closer_needs_extra_space = TRUE;
|
||||
}
|
||||
|
||||
opener->ch = _T('`');
|
||||
opener->beg = opener_beg;
|
||||
opener->end = opener_end;
|
||||
opener->flags = (opener_needs_extra_space ? MD_MARK_CODE_EXTRA_SPACE : 0);
|
||||
opener->flags = MD_MARK_POTENTIAL_OPENER;
|
||||
closer->ch = _T('`');
|
||||
closer->beg = closer_beg;
|
||||
closer->end = closer_end;
|
||||
closer->flags = (closer_needs_extra_space ? MD_MARK_CODE_EXTRA_SPACE : 0);
|
||||
closer->flags = MD_MARK_POTENTIAL_CLOSER;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@ -2975,16 +2982,16 @@ md_is_autolink(MD_CTX* ctx, OFF beg, OFF max_end, OFF* p_end, int* p_missing_mai
|
||||
}
|
||||
|
||||
static int
|
||||
md_collect_marks(MD_CTX* ctx, const MD_LINE* lines, int n_lines, int table_mode)
|
||||
md_collect_marks(MD_CTX* ctx, const MD_LINE* lines, MD_SIZE n_lines, int table_mode)
|
||||
{
|
||||
const MD_LINE* line_term = lines + n_lines;
|
||||
const MD_LINE* line;
|
||||
MD_SIZE line_index;
|
||||
int ret = 0;
|
||||
MD_MARK* mark;
|
||||
OFF codespan_last_potential_closers[CODESPAN_MARK_MAXLEN] = { 0 };
|
||||
int codespan_scanned_till_paragraph_end = FALSE;
|
||||
|
||||
for(line = lines; line < line_term; line++) {
|
||||
for(line_index = 0; line_index < n_lines; line_index++) {
|
||||
const MD_LINE* line = &lines[line_index];
|
||||
OFF off = line->beg;
|
||||
|
||||
while(TRUE) {
|
||||
@ -3016,7 +3023,7 @@ md_collect_marks(MD_CTX* ctx, const MD_LINE* lines, int n_lines, int table_mode)
|
||||
* line to form a hard break. */
|
||||
if(ch == _T('\\') && off+1 < ctx->size && (ISPUNCT(off+1) || ISNEWLINE(off+1))) {
|
||||
/* Hard-break cannot be on the last line of the block. */
|
||||
if(!ISNEWLINE(off+1) || line+1 < line_term)
|
||||
if(!ISNEWLINE(off+1) || line_index+1 < n_lines)
|
||||
ADD_MARK(ch, off, off+2, MD_MARK_RESOLVED);
|
||||
off += 2;
|
||||
continue;
|
||||
@ -3095,7 +3102,7 @@ md_collect_marks(MD_CTX* ctx, const MD_LINE* lines, int n_lines, int table_mode)
|
||||
MD_MARK closer;
|
||||
int is_code_span;
|
||||
|
||||
is_code_span = md_is_code_span(ctx, line, line_term - line, off,
|
||||
is_code_span = md_is_code_span(ctx, line, n_lines - line_index, off,
|
||||
&opener, &closer, codespan_last_potential_closers,
|
||||
&codespan_scanned_till_paragraph_end);
|
||||
if(is_code_span) {
|
||||
@ -3106,7 +3113,7 @@ md_collect_marks(MD_CTX* ctx, const MD_LINE* lines, int n_lines, int table_mode)
|
||||
|
||||
/* Advance the current line accordingly. */
|
||||
if(off > line->end)
|
||||
line = md_lookup_line(off, line, line_term - line);
|
||||
line = md_lookup_line(off, lines, n_lines, &line_index);
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -3144,7 +3151,7 @@ md_collect_marks(MD_CTX* ctx, const MD_LINE* lines, int n_lines, int table_mode)
|
||||
/* Given the nature of the raw HTML, we have to recognize
|
||||
* it here. Doing so later in md_analyze_lt_gt() could
|
||||
* open can of worms of quadratic complexity. */
|
||||
is_html = md_is_html_any(ctx, line, line_term - line, off,
|
||||
is_html = md_is_html_any(ctx, line, n_lines - line_index, off,
|
||||
lines[n_lines-1].end, &html_end);
|
||||
if(is_html) {
|
||||
ADD_MARK(_T('<'), off, off, MD_MARK_OPENER | MD_MARK_RESOLVED);
|
||||
@ -3155,7 +3162,7 @@ md_collect_marks(MD_CTX* ctx, const MD_LINE* lines, int n_lines, int table_mode)
|
||||
|
||||
/* Advance the current line accordingly. */
|
||||
if(off > line->end)
|
||||
line = md_lookup_line(off, line, line_term - line);
|
||||
line = md_lookup_line(off, lines, n_lines, &line_index);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
@ -3248,7 +3255,9 @@ md_collect_marks(MD_CTX* ctx, const MD_LINE* lines, int n_lines, int table_mode)
|
||||
|
||||
/* A potential permissive WWW autolink. */
|
||||
if(ch == _T('.')) {
|
||||
if(line->beg + 3 <= off && md_ascii_eq(STR(off-3), _T("www"), 3)) {
|
||||
if(line->beg + 3 <= off && md_ascii_eq(STR(off-3), _T("www"), 3) &&
|
||||
(off-3 == line->beg || ISUNICODEWHITESPACEBEFORE(off-3) || ISUNICODEPUNCTBEFORE(off-3)))
|
||||
{
|
||||
ADD_MARK(ch, off-3, off+1, MD_MARK_POTENTIAL_OPENER);
|
||||
/* Push a dummy as a reserve for a closer. */
|
||||
ADD_MARK('D', line->beg, line->end, 0);
|
||||
@ -3393,11 +3402,11 @@ md_analyze_bracket(MD_CTX* ctx, int mark_index)
|
||||
}
|
||||
|
||||
/* Forward declaration. */
|
||||
static void md_analyze_link_contents(MD_CTX* ctx, const MD_LINE* lines, int n_lines,
|
||||
static void md_analyze_link_contents(MD_CTX* ctx, const MD_LINE* lines, MD_SIZE n_lines,
|
||||
int mark_beg, int mark_end);
|
||||
|
||||
static int
|
||||
md_resolve_links(MD_CTX* ctx, const MD_LINE* lines, int n_lines)
|
||||
md_resolve_links(MD_CTX* ctx, const MD_LINE* lines, MD_SIZE n_lines)
|
||||
{
|
||||
int opener_index = ctx->unresolved_link_head;
|
||||
OFF last_link_beg = 0;
|
||||
@ -3940,6 +3949,20 @@ md_analyze_permissive_autolink(MD_CTX* ctx, int mark_index)
|
||||
return;
|
||||
}
|
||||
|
||||
/* Verify there's line boundary, whitespace, allowed punctuation or
|
||||
* resolved emphasis mark just before the suspected autolink. */
|
||||
if(beg == line_beg || ISUNICODEWHITESPACEBEFORE(beg) || ISANYOF(beg-1, _T("({["))) {
|
||||
left_boundary_ok = TRUE;
|
||||
} else if(ISANYOF(beg-1, _T("*_~"))) {
|
||||
MD_MARK* left_mark;
|
||||
|
||||
left_mark = md_scan_left_for_resolved_mark(ctx, left_cursor, beg-1, &left_cursor);
|
||||
if(left_mark != NULL && (left_mark->flags & MD_MARK_OPENER))
|
||||
left_boundary_ok = TRUE;
|
||||
}
|
||||
if(!left_boundary_ok)
|
||||
return;
|
||||
|
||||
for(i = 0; i < SIZEOF_ARRAY(URL_MAP); i++) {
|
||||
int n_components = 0;
|
||||
int n_open_brackets = 0;
|
||||
@ -3992,20 +4015,8 @@ md_analyze_permissive_autolink(MD_CTX* ctx, int mark_index)
|
||||
break;
|
||||
}
|
||||
|
||||
/* Verify there's line boundary, whitespace or resolved emphasis mark just
|
||||
* before and after the suspected autolink. */
|
||||
if(beg == line_beg || ISUNICODEWHITESPACEBEFORE(beg) || ISANYOF(beg-1, _T("({["))) {
|
||||
left_boundary_ok = TRUE;
|
||||
} else if(ISANYOF(beg-1, _T("*_~"))) {
|
||||
MD_MARK* left_mark;
|
||||
|
||||
left_mark = md_scan_left_for_resolved_mark(ctx, left_cursor, beg-1, &left_cursor);
|
||||
if(left_mark != NULL && (left_mark->flags & MD_MARK_OPENER))
|
||||
left_boundary_ok = TRUE;
|
||||
}
|
||||
if(!left_boundary_ok)
|
||||
return;
|
||||
|
||||
/* Verify there's line boundary, whitespace, allowed punctuation or
|
||||
* resolved emphasis mark just after the suspected autolink. */
|
||||
if(end == line_end || ISUNICODEWHITESPACE(end) || ISANYOF(end, _T(")}].!?,;"))) {
|
||||
right_boundary_ok = TRUE;
|
||||
} else {
|
||||
@ -4030,7 +4041,7 @@ md_analyze_permissive_autolink(MD_CTX* ctx, int mark_index)
|
||||
#define MD_ANALYZE_NOSKIP_EMPH 0x01
|
||||
|
||||
static inline void
|
||||
md_analyze_marks(MD_CTX* ctx, const MD_LINE* lines, int n_lines,
|
||||
md_analyze_marks(MD_CTX* ctx, const MD_LINE* lines, MD_SIZE n_lines,
|
||||
int mark_beg, int mark_end, const CHAR* mark_chars, unsigned flags)
|
||||
{
|
||||
int i = mark_beg;
|
||||
@ -4096,7 +4107,7 @@ md_analyze_marks(MD_CTX* ctx, const MD_LINE* lines, int n_lines,
|
||||
|
||||
/* Analyze marks (build ctx->marks). */
|
||||
static int
|
||||
md_analyze_inlines(MD_CTX* ctx, const MD_LINE* lines, int n_lines, int table_mode)
|
||||
md_analyze_inlines(MD_CTX* ctx, const MD_LINE* lines, MD_SIZE n_lines, int table_mode)
|
||||
{
|
||||
int ret;
|
||||
|
||||
@ -4129,7 +4140,7 @@ abort:
|
||||
}
|
||||
|
||||
static void
|
||||
md_analyze_link_contents(MD_CTX* ctx, const MD_LINE* lines, int n_lines,
|
||||
md_analyze_link_contents(MD_CTX* ctx, const MD_LINE* lines, MD_SIZE n_lines,
|
||||
int mark_beg, int mark_end)
|
||||
{
|
||||
int i;
|
||||
@ -4200,7 +4211,7 @@ abort:
|
||||
|
||||
/* Render the output, accordingly to the analyzed ctx->marks. */
|
||||
static int
|
||||
md_process_inlines(MD_CTX* ctx, const MD_LINE* lines, int n_lines)
|
||||
md_process_inlines(MD_CTX* ctx, const MD_LINE* lines, MD_SIZE n_lines)
|
||||
{
|
||||
MD_TEXTTYPE text_type;
|
||||
const MD_LINE* line = lines;
|
||||
@ -4208,6 +4219,7 @@ md_process_inlines(MD_CTX* ctx, const MD_LINE* lines, int n_lines)
|
||||
MD_MARK* mark;
|
||||
OFF off = lines[0].beg;
|
||||
OFF end = lines[n_lines-1].end;
|
||||
OFF tmp;
|
||||
int enforce_hardbreak = 0;
|
||||
int ret = 0;
|
||||
|
||||
@ -4223,7 +4235,7 @@ md_process_inlines(MD_CTX* ctx, const MD_LINE* lines, int n_lines)
|
||||
|
||||
while(1) {
|
||||
/* Process the text up to the next mark or end-of-line. */
|
||||
OFF tmp = (line->end < mark->beg ? line->end : mark->beg);
|
||||
tmp = (line->end < mark->beg ? line->end : mark->beg);
|
||||
if(tmp > off) {
|
||||
MD_TEXT(text_type, STR(off), tmp - off);
|
||||
off = tmp;
|
||||
@ -4247,11 +4259,7 @@ md_process_inlines(MD_CTX* ctx, const MD_LINE* lines, int n_lines)
|
||||
if(mark->flags & MD_MARK_OPENER) {
|
||||
MD_ENTER_SPAN(MD_SPAN_CODE, NULL);
|
||||
text_type = MD_TEXT_CODE;
|
||||
if(mark->flags & MD_MARK_CODE_EXTRA_SPACE)
|
||||
MD_TEXT(text_type, _T(" "), 1);
|
||||
} else {
|
||||
if(mark->flags & MD_MARK_CODE_EXTRA_SPACE)
|
||||
MD_TEXT(text_type, _T(" "), 1);
|
||||
MD_LEAVE_SPAN(MD_SPAN_CODE, NULL);
|
||||
text_type = MD_TEXT_NORMAL;
|
||||
}
|
||||
@ -4438,8 +4446,6 @@ md_process_inlines(MD_CTX* ctx, const MD_LINE* lines, int n_lines)
|
||||
break;
|
||||
|
||||
if(text_type == MD_TEXT_CODE || text_type == MD_TEXT_LATEXMATH) {
|
||||
OFF tmp;
|
||||
|
||||
MD_ASSERT(prev_mark != NULL);
|
||||
MD_ASSERT(ISANYOF2_(prev_mark->ch, '`', '$') && (prev_mark->flags & MD_MARK_OPENER));
|
||||
MD_ASSERT(ISANYOF2_(mark->ch, '`', '$') && (mark->flags & MD_MARK_CLOSER));
|
||||
@ -4453,13 +4459,12 @@ md_process_inlines(MD_CTX* ctx, const MD_LINE* lines, int n_lines)
|
||||
MD_TEXT(text_type, STR(tmp), off-tmp);
|
||||
|
||||
/* and new lines are transformed into single spaces. */
|
||||
if(prev_mark->end < off && off < mark->beg)
|
||||
if(off == line->end)
|
||||
MD_TEXT(text_type, _T(" "), 1);
|
||||
} else if(text_type == MD_TEXT_HTML) {
|
||||
/* Inside raw HTML, we output the new line verbatim, including
|
||||
* any trailing spaces. */
|
||||
OFF tmp = off;
|
||||
|
||||
tmp = off;
|
||||
while(tmp < end && ISBLANK(tmp))
|
||||
tmp++;
|
||||
if(tmp > off)
|
||||
@ -4524,7 +4529,7 @@ md_analyze_table_alignment(MD_CTX* ctx, OFF beg, OFF end, MD_ALIGN* align, int n
|
||||
}
|
||||
|
||||
/* Forward declaration. */
|
||||
static int md_process_normal_block_contents(MD_CTX* ctx, const MD_LINE* lines, int n_lines);
|
||||
static int md_process_normal_block_contents(MD_CTX* ctx, const MD_LINE* lines, MD_SIZE n_lines);
|
||||
|
||||
static int
|
||||
md_process_table_cell(MD_CTX* ctx, MD_BLOCKTYPE cell_type, MD_ALIGN align, OFF beg, OFF end)
|
||||
@ -4599,11 +4604,6 @@ md_process_table_row(MD_CTX* ctx, MD_BLOCKTYPE cell_type, OFF beg, OFF end,
|
||||
abort:
|
||||
free(pipe_offs);
|
||||
|
||||
/* Free any temporary memory blocks stored within some dummy marks. */
|
||||
for(i = ctx->ptr_stack.top; i >= 0; i = ctx->marks[i].next)
|
||||
free(md_mark_get_ptr(ctx, i));
|
||||
ctx->ptr_stack.top = -1;
|
||||
|
||||
ctx->table_cell_boundaries_head = -1;
|
||||
ctx->table_cell_boundaries_tail = -1;
|
||||
|
||||
@ -4611,10 +4611,10 @@ abort:
|
||||
}
|
||||
|
||||
static int
|
||||
md_process_table_block_contents(MD_CTX* ctx, int col_count, const MD_LINE* lines, int n_lines)
|
||||
md_process_table_block_contents(MD_CTX* ctx, int col_count, const MD_LINE* lines, MD_SIZE n_lines)
|
||||
{
|
||||
MD_ALIGN* align;
|
||||
int i;
|
||||
MD_SIZE line_index;
|
||||
int ret = 0;
|
||||
|
||||
/* At least two lines have to be present: The column headers and the line
|
||||
@ -4637,9 +4637,9 @@ md_process_table_block_contents(MD_CTX* ctx, int col_count, const MD_LINE* lines
|
||||
|
||||
if(n_lines > 2) {
|
||||
MD_ENTER_BLOCK(MD_BLOCK_TBODY, NULL);
|
||||
for(i = 2; i < n_lines; i++) {
|
||||
for(line_index = 2; line_index < n_lines; line_index++) {
|
||||
MD_CHECK(md_process_table_row(ctx, MD_BLOCK_TD,
|
||||
lines[i].beg, lines[i].end, align, col_count));
|
||||
lines[line_index].beg, lines[line_index].end, align, col_count));
|
||||
}
|
||||
MD_LEAVE_BLOCK(MD_BLOCK_TBODY, NULL);
|
||||
}
|
||||
@ -4675,7 +4675,7 @@ struct MD_BLOCK_tag {
|
||||
* MD_BLOCK_LI: Task mark offset in the input doc.
|
||||
* MD_BLOCK_OL: Start item number.
|
||||
*/
|
||||
unsigned n_lines;
|
||||
MD_SIZE n_lines;
|
||||
};
|
||||
|
||||
struct MD_CONTAINER_tag {
|
||||
@ -4691,7 +4691,7 @@ struct MD_CONTAINER_tag {
|
||||
|
||||
|
||||
static int
|
||||
md_process_normal_block_contents(MD_CTX* ctx, const MD_LINE* lines, int n_lines)
|
||||
md_process_normal_block_contents(MD_CTX* ctx, const MD_LINE* lines, MD_SIZE n_lines)
|
||||
{
|
||||
int i;
|
||||
int ret;
|
||||
@ -4709,16 +4709,16 @@ abort:
|
||||
}
|
||||
|
||||
static int
|
||||
md_process_verbatim_block_contents(MD_CTX* ctx, MD_TEXTTYPE text_type, const MD_VERBATIMLINE* lines, int n_lines)
|
||||
md_process_verbatim_block_contents(MD_CTX* ctx, MD_TEXTTYPE text_type, const MD_VERBATIMLINE* lines, MD_SIZE n_lines)
|
||||
{
|
||||
static const CHAR indent_chunk_str[] = _T(" ");
|
||||
static const SZ indent_chunk_size = SIZEOF_ARRAY(indent_chunk_str) - 1;
|
||||
|
||||
int i;
|
||||
MD_SIZE line_index;
|
||||
int ret = 0;
|
||||
|
||||
for(i = 0; i < n_lines; i++) {
|
||||
const MD_VERBATIMLINE* line = &lines[i];
|
||||
for(line_index = 0; line_index < n_lines; line_index++) {
|
||||
const MD_VERBATIMLINE* line = &lines[line_index];
|
||||
int indent = line->indent;
|
||||
|
||||
MD_ASSERT(indent >= 0);
|
||||
@ -4743,7 +4743,7 @@ abort:
|
||||
}
|
||||
|
||||
static int
|
||||
md_process_code_block_contents(MD_CTX* ctx, int is_fenced, const MD_VERBATIMLINE* lines, int n_lines)
|
||||
md_process_code_block_contents(MD_CTX* ctx, int is_fenced, const MD_VERBATIMLINE* lines, MD_SIZE n_lines)
|
||||
{
|
||||
if(is_fenced) {
|
||||
/* Skip the first line in case of fenced code: It is the fence.
|
||||
@ -5070,8 +5070,8 @@ static int
|
||||
md_consume_link_reference_definitions(MD_CTX* ctx)
|
||||
{
|
||||
MD_LINE* lines = (MD_LINE*) (ctx->current_block + 1);
|
||||
int n_lines = ctx->current_block->n_lines;
|
||||
int n = 0;
|
||||
MD_SIZE n_lines = ctx->current_block->n_lines;
|
||||
MD_SIZE n = 0;
|
||||
|
||||
/* Compute how many lines at the start of the block form one or more
|
||||
* reference definitions. */
|
||||
@ -5134,7 +5134,7 @@ md_end_current_block(MD_CTX* ctx)
|
||||
}
|
||||
|
||||
if(ctx->current_block->type == MD_BLOCK_H && (ctx->current_block->flags & MD_BLOCK_SETEXT_HEADER)) {
|
||||
int n_lines = ctx->current_block->n_lines;
|
||||
MD_SIZE n_lines = ctx->current_block->n_lines;
|
||||
|
||||
if(n_lines > 1) {
|
||||
/* Get rid of the underline. */
|
||||
@ -5438,7 +5438,7 @@ static const TAG m6[] = { X("main"), X("menu"), X("menuitem"), Xend };
|
||||
static const TAG n6[] = { X("nav"), X("noframes"), Xend };
|
||||
static const TAG o6[] = { X("ol"), X("optgroup"), X("option"), Xend };
|
||||
static const TAG p6[] = { X("p"), X("param"), Xend };
|
||||
static const TAG s6[] = { X("section"), X("source"), X("summary"), Xend };
|
||||
static const TAG s6[] = { X("search"), X("section"), X("summary"), Xend };
|
||||
static const TAG t6[] = { X("table"), X("tbody"), X("td"), X("tfoot"), X("th"),
|
||||
X("thead"), X("title"), X("tr"), X("track"), Xend };
|
||||
static const TAG u6[] = { X("ul"), Xend };
|
||||
|
2
src/3rdparty/md4c/md4c.h
vendored
2
src/3rdparty/md4c/md4c.h
vendored
@ -2,7 +2,7 @@
|
||||
* MD4C: Markdown parser for C
|
||||
* (http://github.com/mity/md4c)
|
||||
*
|
||||
* Copyright (c) 2016-2024 Martin Mitas
|
||||
* Copyright (c) 2016-2024 Martin Mitáš
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
|
4
src/3rdparty/md4c/qt_attribution.json
vendored
4
src/3rdparty/md4c/qt_attribution.json
vendored
@ -10,7 +10,7 @@
|
||||
"License": "MIT License",
|
||||
"LicenseId": "MIT",
|
||||
"LicenseFile": "LICENSE.md",
|
||||
"Version": "0.5.1",
|
||||
"DownloadLocation": "https://github.com/mity/md4c/releases/tag/release-0.5.1",
|
||||
"Version": "0.5.2",
|
||||
"DownloadLocation": "https://github.com/mity/md4c/releases/tag/release-0.5.2",
|
||||
"Copyright": "Copyright © 2016-2024 Martin Mitáš"
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user