1515#include < sstream>
1616#include < stdexcept>
1717#include < unordered_map>
18+ #include < utility>
1819
1920#include " TIVarTypes.h"
2021#include " TypeHandlers/TypeHandlers.h"
@@ -58,9 +59,24 @@ namespace tivars::EvoFormat
5859
5960 bool is_displayable_ucs2_scalar (uint16_t codepoint)
6061 {
61- return (codepoint >= 0x0020 && codepoint <= 0x007E )
62- || (codepoint >= 0x00A0 && codepoint <= 0x00FF )
63- || codepoint == 0x0177 ;
62+ static constexpr std::pair<uint16_t , uint16_t > acceptedRanges[] = {
63+ {0x0020 , 0x007E }, {0x00A0 , 0x00FF }, {0x0177 , 0x0177 }, {0x0394 , 0x0394 },
64+ {0x03A3 , 0x03A3 }, {0x03A9 , 0x03A9 }, {0x03B1 , 0x03B5 }, {0x03B8 , 0x03B8 },
65+ {0x03BB , 0x03BC }, {0x03C0 , 0x03C1 }, {0x03C3 , 0x03C4 }, {0x03C6 , 0x03C7 },
66+ {0x2010 , 0x2010 }, {0x2026 , 0x2026 }, {0x2070 , 0x2070 }, {0x2074 , 0x2079 },
67+ {0x2080 , 0x2089 }, {0x2122 , 0x2122 }, {0x2190 , 0x2193 }, {0x221A , 0x221A },
68+ {0x2220 , 0x2220 }, {0x222B , 0x222B }, {0x2260 , 0x2260 }, {0x2264 , 0x2265 },
69+ {0x238C , 0x238C }, {0x25A0 , 0x25A0 }, {0x25AB , 0x25AB }, {0x25B2 , 0x25B2 },
70+ {0x25B6 , 0x25B6 }, {0x25B8 , 0x25B8 }, {0x25BC , 0x25BC }, {0x25C0 , 0x25C0 },
71+ {0x25C2 , 0x25C2 }, {0xF000 , 0xF032 }, {0xF038 , 0xF03A }, {0xF041 , 0xF04D },
72+ {0xF04F , 0xF058 }, {0xF05B , 0xF061 },
73+ };
74+
75+ return std::ranges::any_of (acceptedRanges, [codepoint](const auto & range)
76+ {
77+ const auto & [first, last] = range;
78+ return codepoint >= first && codepoint <= last;
79+ });
6480 }
6581
6682 bool utf8_to_single_codepoint (const std::string& text, uint16_t & codepoint)
@@ -752,6 +768,7 @@ static const char* evo_token_name(uint16_t token)
752768}
753769
754770static bool direct_legacy_token_for_evo (uint16_t evoToken, uint16_t & legacyToken);
771+ static bool direct_legacy_payload_for_evo (uint16_t evoToken, data_t & payload);
755772static bool direct_evo_token_for_legacy (uint16_t legacyToken, uint16_t & evoToken);
756773static void append_evo_token (data_t & out, uint16_t evoToken);
757774static bool legacy_token_to_evo_ucs2 (uint16_t legacyToken, uint16_t & evoToken);
@@ -770,6 +787,9 @@ static std::string evo_token_to_string(uint16_t token)
770787 if (token == 0xE41A ) return " '" ;
771788 if (token == 0xE424 ) return " ᵍ" ;
772789 if (token == 0xE589 ) return " Grad" ;
790+ if (token == 0xE9D6 ) return " ►ʳ" ;
791+ if (token == 0xE9D7 ) return " ►ᵍ" ;
792+ if (token == 0xE9D8 ) return " ►º" ;
773793 if (token >= 0xE850 && token <= 0xE85B )
774794 {
775795 const uint16_t idx = static_cast <uint16_t >((token - 0xE850 ) / 2 + 1 );
@@ -946,6 +966,28 @@ static bool legacy_payload_for_evo_ucs2(uint16_t evoToken, data_t& payload)
946966 }
947967}
948968
969+ static bool direct_legacy_payload_for_evo (uint16_t evoToken, data_t & payload)
970+ {
971+ payload.clear ();
972+
973+ // ►{angle} conv token
974+ if (evoToken == 0xE9D6 || evoToken == 0xE9D7 || evoToken == 0xE9D8 )
975+ {
976+ append_legacy_token (payload, 0xBBEC );
977+ append_legacy_token (payload, evoToken == 0xE9D6 ? 0x0A : evoToken == 0xE9D7 ? 0xAF : 0x0B );
978+ return true ;
979+ }
980+
981+ uint16_t legacyToken = 0 ;
982+ if (!direct_legacy_token_for_evo (evoToken, legacyToken))
983+ {
984+ return false ;
985+ }
986+
987+ append_legacy_token (payload, legacyToken);
988+ return true ;
989+ }
990+
949991static bool legacy_token_to_evo_ucs2 (uint16_t legacyToken, uint16_t & evoToken)
950992{
951993 const std::string text = TypeHandlers::TH_Tokenized::oneTokenBytesToString (legacyToken);
@@ -1105,6 +1147,7 @@ static bool direct_legacy_token_for_evo(uint16_t evoToken, uint16_t& legacyToken
11051147 {0xE5BD , 0x7F }, {0xE5BE , 0x80 }, {0xE5BF , 0x81 }, {0xE5C0 , 0xEF73 },
11061148 {0xE5C1 , 0xEF74 }, {0xE5C2 , 0xEF75 },
11071149 {0xE4F9 , 0xBB57 }, {0xE593 , 0xBB64 }, {0xE6C6 , 0xE8 }, {0xE6C7 , 0xE7 },
1150+ {0xE6AE , 0xEF79 },
11081151 {0xE900 , 0x6201 }, {0xE901 , 0x6202 }, {0xE902 , 0x6203 }, {0xE903 , 0x6204 },
11091152 {0xE904 , 0x6205 }, {0xE905 , 0x6206 }, {0xE906 , 0x6207 }, {0xE907 , 0x6208 },
11101153 {0xE908 , 0x6209 }, {0xE909 , 0x620A }, {0xE90A , 0x620B }, {0xE90B , 0x620C },
@@ -1121,6 +1164,9 @@ static bool direct_legacy_token_for_evo(uint16_t evoToken, uint16_t& legacyToken
11211164 {0xE932 , 0x6234 }, {0xE933 , 0x6235 }, {0xE934 , 0x6236 }, {0xE935 , 0x6237 },
11221165 {0xE936 , 0x6238 }, {0xE937 , 0x6239 }, {0xE938 , 0x623A }, {0xE939 , 0x623B },
11231166 {0xE93A , 0x623C }, {0xE980 , 0x6304 }, {0xE981 , 0x6305 }, {0xE982 , 0x6332 },
1167+ {0xE93B , 0x6203 }, {0xE93C , 0x622B }, {0xE93D , 0x622E }, {0xE93E , 0xBBA6 },
1168+ {0xE941 , 0x622D }, {0xE942 , 0x6230 }, {0xE943 , 0x6206 }, {0xE944 , 0x622C },
1169+ {0xE945 , 0x622F }, {0xE946 , 0xBBCB }, {0xE95C , 0x6227 },
11241170 {0xE983 , 0x6306 }, {0xE984 , 0x6307 }, {0xE985 , 0x6308 }, {0xE986 , 0x6309 },
11251171 {0xE987 , 0x6333 }, {0xE98F , 0x630A }, {0xE990 , 0x630B }, {0xE991 , 0x6302 },
11261172 {0xE992 , 0x6336 }, {0xE993 , 0x630C }, {0xE994 , 0x630D }, {0xE995 , 0x6303 },
@@ -1600,6 +1646,7 @@ static bool direct_evo_token_for_legacy(uint16_t legacyToken, uint16_t& evoToken
16001646 {0x7F , 0xE5BD }, {0x80 , 0xE5BE }, {0x81 , 0xE5BF }, {0xEF73 , 0xE5C0 },
16011647 {0xEF74 , 0xE5C1 }, {0xEF75 , 0xE5C2 },
16021648 {0xBB57 , 0xE4F9 }, {0xBB64 , 0xE593 }, {0xE8 , 0xE6C6 }, {0xE7 , 0xE6C7 },
1649+ {0xEF79 , 0xE6AE },
16031650 {0x6201 , 0xE900 }, {0x6202 , 0xE901 }, {0x6203 , 0xE902 }, {0x6204 , 0xE903 },
16041651 {0x6205 , 0xE904 }, {0x6206 , 0xE905 }, {0x6207 , 0xE906 }, {0x6208 , 0xE907 },
16051652 {0x6209 , 0xE908 }, {0x620A , 0xE909 }, {0x620B , 0xE90A }, {0x620C , 0xE90B },
@@ -1948,20 +1995,8 @@ static bool direct_evo_token_for_legacy(uint16_t legacyToken, uint16_t& evoToken
19481995
19491996static bool tokenized_legacy_payload_for_evo (uint16_t evoToken, data_t & payload)
19501997{
1951- if (legacy_payload_for_evo_ucs2 (evoToken, payload))
1952- {
1953- return true ;
1954- }
1955-
1956- uint16_t legacyToken = 0 ;
1957- if (!direct_legacy_token_for_evo (evoToken, legacyToken))
1958- {
1959- return false ;
1960- }
1961-
1962- payload.clear ();
1963- append_legacy_token (payload, legacyToken);
1964- return true ;
1998+ return direct_legacy_payload_for_evo (evoToken, payload)
1999+ || legacy_payload_for_evo_ucs2 (evoToken, payload);
19652000}
19662001
19672002data_t evo_tokenized_data_to_legacy (const data_t & evoData)
0 commit comments