feat: Update getFlag() #build

Update geo.js
This commit is contained in:
Virgil Clyne 2022-06-22 22:29:56 +08:00 committed by GitHub
parent 6610f835ba
commit 237ecd497e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1,14 +1,21 @@
// get proxy flag according to its name // get proxy flag according to its name
export function getFlag(name) { export function getFlag(name) {
// flags from @KOP-XIAO: https://github.com/KOP-XIAO/QuantumultX/blob/master/Scripts/resource-parser.js // flags from @KOP-XIAO: https://github.com/KOP-XIAO/QuantumultX/blob/master/Scripts/resource-parser.js
const flags = { // flags from @surgioproject: https://github.com/surgioproject/surgio/blob/master/lib/misc/flag_cn.ts
'🇦🇿': ['阿塞拜疆'],
'🇦🇹': ['奥地利', '奧地利', 'Austria', '维也纳'], // refer: https://zh.wikipedia.org/wiki/ISO_3166-1二位字母代码
'🇦🇺': [ // refer: https://zh.wikipedia.org/wiki/ISO_3166-1三位字母代码
'AU', const Flags = {
'Australia', '🏳️‍🌈': ['流量', '时间', '过期', 'Bandwidth', 'Expire'],
'Sydney', '🇸🇱': ['应急', '测试节点'],
'澳大利亚', '🇦🇩': ['AD', 'AND', 'Andorra', '安道尔'],
'🇦🇪': ['AE', 'ARE', 'United Arab Emirates', '阿联酋', '迪拜'],
'🇦🇫': ['AF', 'AFG', 'Afghanistan', '阿富汗'],
'🇦🇱': ['AL', 'ALB', 'Albania', '阿尔巴尼亚', '阿爾巴尼亞'],
'🇦🇲': ['AM', 'ARM', 'Armenia', '亚美尼亚'],
'🇦🇷': ['AR', 'ARG', 'Argentina', '阿根廷'],
'🇦🇹': ['AT', 'AUT', 'Austria', '奥地利', '奧地利', '维也纳'],
'🇦🇺': ['AU', 'AUS', 'Australia', '澳大利亚',
'澳洲', '澳洲',
'墨尔本', '墨尔本',
'悉尼', '悉尼',
@ -18,78 +25,79 @@ export function getFlag(name) {
'滬澳', '滬澳',
'沪澳', '沪澳',
'广澳', '广澳',
'Sydney'
], ],
'🇧🇪': ['BE', '比利時', '比利时'], '🇦🇿': ['AZ', 'AZE', 'Azerbaijan', '阿塞拜疆'],
'🇧🇬': ['保加利亚', '保加利亞', 'Bulgaria'], '🇧🇦': ['BA', 'BIH', 'Bosnia and Herzegovina', '波黑共和国', '波黑'],
'🇧🇭': ['BH', '巴林'], '🇧🇩': ['BD', 'BGD', 'Bangladesh', '孟加拉国', '孟加拉'],
'🇧🇩': ['BD', '孟加拉'], '🇧🇪': ['BE', 'BEL', 'Belgium', '比利时', '比利時'],
'🇵🇰': ['巴基斯坦'], '🇧🇬': ['BG', 'BGR', 'Bulgaria', '保加利亚', '保加利亞'],
'🇰🇭': ['柬埔寨'], '🇧🇭': ['BH', 'BHR', 'Bahrain', '巴林'],
'🇺🇦': ['烏克蘭', '乌克兰'], '🇧🇷': ['BR', 'BRA', 'Brazil', '巴西', '圣保罗'],
'🇭🇷': ['克罗地亚', 'HR', '克羅地亞'], '🇧🇾': ['BY', 'BLR', 'Belarus', '白俄罗斯', '白俄'],
'🇨🇦': [ '🇨🇦': ['CA', 'CAN', 'Canada', '加拿大',
'Canada',
'CANADA',
'CAN',
'Waterloo',
'加拿大',
'蒙特利尔', '蒙特利尔',
'温哥华', '温哥华',
'楓葉', '楓葉',
'枫叶', '枫叶',
'滑铁卢', '滑铁卢',
'多伦多', '多伦多',
'CA', 'Waterloo',
], ],
'🇨🇭': ['瑞士', '苏黎世', 'Switzerland', 'Zurich'], '🇨🇭': ['CH', 'CHE', 'Switzerland', '瑞士', '苏黎世', 'Zurich'],
'🇳🇬': ['尼日利亚', 'NG', '尼日利亞'], '🇨🇱': ['CL', 'CHL', 'Chile', '智利'],
'🇨🇿': ['Czechia', '捷克'], '🇨🇳': ['CN', 'CHN', 'China', '中国',
'🇸🇰': ['斯洛伐克', 'SK'], '中國',
'🇷🇸': ['RS', '塞尔维亚'], '回国',
'🇲🇩': ['摩爾多瓦', 'MD', '摩尔多瓦'], '回國',
'🇩🇪': [ '江苏',
'DE', '北京',
'German', '上海',
'GERMAN', '广州',
'德国', '深圳',
'杭州',
'徐州',
'青岛',
'宁波',
'镇江',
'back',
],
'🇨🇴': ['CO', 'COL', 'Colombia', '哥伦比亚'],
'🇨🇷': ['CR', 'CRI', 'Costa Rica', '哥斯达黎加'],
'🇨🇾': ['CY', 'CYP', 'Cyprus', '塞浦路斯'],
'🇨🇿': ['CZ', 'CZE', 'Czechia', '捷克'],
'🇩🇪': ['DE', 'DEU', 'German', '德国',
'德國', '德國',
'法兰克福',
'京德', '京德',
'滬德', '滬德',
'廣德', '廣德',
'沪德', '沪德',
'广德', '广德',
'法兰克福',
'Frankfurt', 'Frankfurt',
], ],
'🇦🇲': ['亚美尼亚', 'AM', 'Armenia'],
'🇦🇩': ['安道尔', 'AD', 'Andorra'],
'🇷🇪': ['留尼汪', '法属留尼汪', 'Réunion', 'RE'],
'🇵🇾': ['巴拉圭', 'Paraguay', 'PY'],
'🇩🇰': ['DK', 'DNK', '丹麦', '丹麥'], '🇩🇰': ['DK', 'DNK', '丹麦', '丹麥'],
'🇪🇸': ['ES', '西班牙', 'Spain'], '🇪🇨': ['EC', 'ECU', 'Ecuador', '厄瓜多尔'],
'🇪🇺': ['EU', '欧盟', '欧罗巴'], '🇪🇪': ['EE', 'EST', 'Estonia', '爱沙尼亚'],
'🇫🇮': ['Finland', '芬兰', '芬蘭', '赫尔辛基'], '🇪🇬': ['EG', 'EGY', 'Egypt', '埃及'],
'🇫🇷': ['FR', 'France', '法国', '法國', '巴黎'], '🇪🇸': ['ES', 'ESP', 'Spain', '西班牙'],
'🇬🇧': [ '🇪🇺': ['EU', 'European Union', '欧盟', '欧罗巴'],
'🇫🇮': ['FI', 'FIN', 'Finland', '芬兰', '芬蘭', '赫尔辛基'],
'🇫🇷': ['FR', 'FRA', 'France', '法国', '法國', '巴黎'],
'🇬🇧': ['GB', 'GBR', 'Great Britain', '英国',
'UK', 'UK',
'GB',
'England', 'England',
'United Kingdom', 'United Kingdom',
'英国',
'伦敦', '伦敦',
'英', '英',
'London', 'London',
], ],
'🇲🇴': ['MO', 'Macao', '澳门', '澳門', 'CTM'], '🇬🇪': ['GE', 'GEO', 'Georgia', '格鲁吉亚', '格魯吉亞'],
'🇰🇿': ['哈萨克斯坦', '哈萨克'], '🇬🇷': ['GR', 'GRC', 'Greece', '希腊', '希臘'],
'🇭🇺': ['匈牙利', 'Hungary'], '🇭🇰': ['HK', 'HKG', 'Hongkong', '香港',
'🇭🇰': [
'HK',
'Hongkong',
'Hong Kong', 'Hong Kong',
'HongKong', 'HongKong',
'HONG KONG', 'HONG KONG',
'香港',
'深港', '深港',
'沪港', '沪港',
'呼港', '呼港',
@ -102,53 +110,81 @@ export function getFlag(name) {
'京港', '京港',
'港', '港',
], ],
'🇮🇩': ['Indonesia', '印尼', '印度尼西亚', '雅加达'], '🇭🇷': ['HR', 'HRV', 'Croatia', '克罗地亚', '克羅地亞'],
'🇮🇪': ['Ireland', 'IRELAND', '爱尔兰', '愛爾蘭', '都柏林'], '🇭🇺': ['HU', 'HUN', 'Hungary', '匈牙利'],
'🇮🇱': ['Israel', '以色列'], '🇯🇴': ['JO', 'JOR', 'Jordan', '约旦'],
'🇮🇳': ['India', 'IND', 'INDIA', '印度', '孟买', 'MFumbai'], '🇯🇵': ['JP', 'JPN', 'Japan', '日本',
'🇮🇸': ['IS', 'ISL', '冰岛', '冰島'], '东京',
'🇰🇵': ['KP', '朝鲜'], '大阪',
'🇰🇷': [ '埼玉',
'KR', '沪日',
'Korea', '穗日',
'KOR', '川日',
'韩国', '中日',
'首尔', '泉日',
'杭日',
'深日',
'辽日',
'广日',
'大坂',
'Osaka',
'Tokyo',
],
'🇰🇪': ['KE', 'KEN', 'Kenya', '肯尼亚'],
'🇰🇬': ['KG', 'KGZ', 'Kyrgyzstan', '吉尔吉斯斯坦'],
'🇰🇭': ['KH', 'KGZ', 'Cambodia', '柬埔寨'],
'🇰🇵': ['KP', 'PRK', 'North Korea', '朝鲜'],
'🇰🇷': ['KR', 'KOR', 'Korea', '韩国',
'韩', '韩',
'韓', '韓',
'首尔',
'春川', '春川',
'Chuncheon', 'Chuncheon',
'Seoul', 'Seoul',
], ],
'🇱🇺': ['卢森堡'], '🇰🇿': ['KZ', 'KAZ', 'Kazakhstan', '哈萨克斯坦', '哈萨克'],
'🇱🇻': ['Latvia', 'Latvija', '拉脱维亚'], '🇮🇩': ['ID', 'IDN', 'Indonesia', '印尼', '印度尼西亚', '雅加达'],
'🇲🇽': ['MEX', 'MX', '墨西哥'], '🇮🇪': ['IE', 'IRL', 'Ireland', '爱尔兰', '愛爾蘭', '都柏林'],
'🇲🇾': [ '🇮🇱': ['IL', 'ISR', 'Israel', '以色列'],
'MY', '🇮🇲': ['IM', 'Isle of Man', '马恩岛', '馬恩島'],
'Malaysia', '🇮🇳': ['IN', 'IND', 'India', '印度', '孟买', 'MFumbai'],
'MALAYSIA', '🇮🇷': ['IR', 'IRN', 'Iran', '伊朗'],
'马来西亚', '🇮🇸': ['IS', 'ISL', 'Iceland', '冰岛', '冰島'],
'大馬', '🇮🇹': ['IT', 'ITA', 'Italy', '意大利', '義大利', '米兰', 'Nachash'],
'馬來西亞', '🇱🇹': ['LT', 'Lithuania', '立陶宛'],
'吉隆坡', '🇱🇺': ['LU', 'Luxembourg', '卢森堡'],
], '🇱🇻': ['LV', 'Latvia', '拉脱维亚', 'Latvija'],
'🇧🇾': ['BY', '白俄', '白俄罗斯'], '🇲🇦': ['MA', 'Morocco', '摩洛哥'],
'🇳🇱': ['NL', 'Netherlands', '荷兰', '荷蘭', '尼德蘭', '阿姆斯特丹'], '🇲🇩': ['MD', 'Moldova', '摩尔多瓦', '摩爾多瓦'],
'🇳🇵': ['尼泊尔'], '🇳🇬': ['NG', 'Nigeria', '尼日利亚', '尼日利亞'],
'🇲🇰': ['MK', 'Macedonia', '马其顿', '馬其頓'],
'🇲🇳': ['MN', 'Mongolia', '蒙古'],
'🇲🇴': ['MO', 'MAC', 'Macao', '澳门', '澳門', 'CTM'],
'🇲🇹': ['MT', 'Malta', '马耳他'],
'🇲🇽': ['MX', 'MEX', 'Mexico', '墨西哥'],
'🇲🇾': ['MY', 'MYS', 'Malaysia', '马来西亚', '馬來西亞', '吉隆坡', '大馬'],
'🇳🇱': ['NL', 'NLD', 'Netherlands', '荷兰', '荷蘭', '尼德蘭', '阿姆斯特丹'],
'🇳🇴': ['NO', 'NOR', 'Norway', '挪威'],
'🇳🇵': ['NP', 'Nepal', '尼泊尔'],
'🇳🇿': ['NZ', 'NZL', 'New Zealand', '新西兰', '新西蘭'],
'🇵🇦': ['PA', 'Panama', '巴拿马'],
'🇵🇪': ['PE', 'Peru', '秘鲁', '祕魯'],
'🇵🇭': ['PH', 'Philippines', '菲律宾', '菲律賓'], '🇵🇭': ['PH', 'Philippines', '菲律宾', '菲律賓'],
'🇵🇷': ['PR', '波多黎各'], '🇵🇰': ['PK', 'Pakistan', '巴基斯坦'],
'🇷🇴': ['RO', '罗马尼亚'], '🇵🇱': ['PL', 'POL', 'Poland', '波兰', '波蘭'],
'🇷🇺': [ '🇵🇷': ['PR', 'Puerto Rico', '波多黎各'],
'RU', '🇵🇹': ['PT', 'PRT', 'Portugal', '葡萄牙'],
'Russia', '🇵🇾': ['PY', 'Paraguay', '巴拉圭'],
'俄罗斯', '🇷🇴': ['RO', 'Romania', '罗马尼亚'],
'🇷🇸': ['RS', 'Serbia', '塞尔维亚'],
'🇷🇪': ['RE', 'Réunion', '留尼汪', '法属留尼汪'],
'🇷🇺': ['RU', 'RUS', 'Russia', '俄罗斯',
'俄国', '俄国',
'俄羅斯', '俄羅斯',
'伯力', '伯力',
'莫斯科', '莫斯科',
'圣彼得堡', '圣彼得堡',
'西伯利亚', '西伯利亚',
'新西伯利亚',
'京俄', '京俄',
'杭俄', '杭俄',
'廣俄', '廣俄',
@ -157,18 +193,13 @@ export function getFlag(name) {
'沪俄', '沪俄',
'Moscow', 'Moscow',
], ],
'🇸🇦': ['沙特'], '🇸🇦': ['SA', 'SAU', 'Saudi', '沙特阿拉伯', '沙特'],
'🇸🇪': ['SE', 'Sweden', '瑞典'], '🇸🇪': ['SE', 'SWE', 'Sweden', '瑞典'],
'🇲🇹': ['马耳他'], '🇸🇬': ['SG', 'SGP', 'Singapore', '新加坡',
'🇲🇦': ['MA', '摩洛哥'],
'🇸🇬': [
'SG',
'Singapore',
'SINGAPORE',
'新加坡',
'狮城', '狮城',
'沪新', '沪新',
'京新', '京新',
'中新',
'泉新', '泉新',
'穗新', '穗新',
'深新', '深新',
@ -177,13 +208,12 @@ export function getFlag(name) {
'廣新', '廣新',
'滬新', '滬新',
], ],
'🇹🇭': ['TH', 'Thailand', '泰国', '泰國', '曼谷'], '🇸🇮': ['SI', 'Slovenia', '斯洛文尼亚'],
'🇹🇷': ['TR', 'Turkey', '土耳其', '伊斯坦布尔'], '🇸🇰': ['SK', 'Slovakia', '斯洛伐克'],
'🇹🇼': [ '🇹🇭': ['TH', 'THA', 'Thailand', '泰国', '泰國', '曼谷'],
'TW', '🇹🇳': ['TN', 'Tunisia', '突尼斯'],
'Taiwan', '🇹🇷': ['TR', 'TUR', 'Turkey', '土耳其', '伊斯坦布尔'],
'TAIWAN', '🇹🇼': ['TW', 'TWN', 'Taiwan', '台湾',
'台湾',
'台北', '台北',
'台中', '台中',
'新北', '新北',
@ -193,12 +223,9 @@ export function getFlag(name) {
'HINET', 'HINET',
'Taipei', 'Taipei',
], ],
'🇺🇸': [ '🇺🇦': ['UA', 'UKR', 'Ukraine', '乌克兰', '烏克蘭'],
'US', '🇺🇸': ['US', 'USA', 'United States', '美国',
'USA',
'America', 'America',
'United States',
'美国',
'美', '美',
'京美', '京美',
'波特兰', '波特兰',
@ -221,91 +248,37 @@ export function getFlag(name) {
'San Jose', 'San Jose',
'Sillicon Valley', 'Sillicon Valley',
'Michigan', 'Michigan',
'LAX',
'SFO'
], ],
'🇻🇳': ['VN', '越南', '胡志明市'], '🇺🇾': ['UY', 'Uruguay', '乌拉圭'],
'🇻🇪': ['VE', '委内瑞拉'], '🇻🇪': ['VE', 'Venezuela', '委内瑞拉'],
'🇮🇹': ['Italy', 'IT', 'Nachash', '意大利', '米兰', '義大利'], '🇻🇳': ['VN', 'VNM', 'Vietnam', '越南', '胡志明'],
'🇿🇦': ['South Africa', '南非'], '🇿🇦': ['ZA', 'ZAF', 'South Africa', '南非']
'🇦🇪': ['United Arab Emirates', '阿联酋', '迪拜', 'AE'],
'🇧🇷': ['BR', 'Brazil', '巴西', '圣保罗'],
'🇯🇵': [
'JP',
'Japan',
'JAPAN',
'日本',
'东京',
'大阪',
'埼玉',
'沪日',
'穗日',
'川日',
'中日',
'泉日',
'杭日',
'深日',
'辽日',
'广日',
'大坂',
'Osaka',
'Tokyo',
],
'🇦🇷': ['AR', '阿根廷'],
'🇳🇴': ['Norway', '挪威', 'NO'],
'🇨🇳': [
'CN',
'China',
'回国',
'中国',
'中國',
'江苏',
'北京',
'上海',
'广州',
'深圳',
'杭州',
'徐州',
'青岛',
'宁波',
'镇江',
'back',
],
'🇵🇱': ['PL', 'POL', '波兰', '波蘭'],
'🇨🇱': ['智利'],
'🇳🇿': ['新西蘭', '新西兰'],
'🇬🇷': ['希腊', '希臘'],
'🇪🇬': ['埃及'],
'🇨🇾': ['CY', '塞浦路斯'],
'🇨🇷': ['CR', '哥斯达黎加'],
'🇸🇮': ['SI', '斯洛文尼亚'],
'🇱🇹': ['LT', '立陶宛'],
'🇵🇦': ['PA', '巴拿马'],
'🇹🇳': ['TN', '突尼斯'],
'🇮🇲': ['马恩岛', '馬恩島'],
'🇵🇹': ['葡萄牙'],
'🇰🇪': ['KE', '肯尼亚'],
'🇰🇬': ['KG', '吉尔吉斯坦'],
'🇯🇴': ['JO', '约旦'],
'🇺🇾': ['UY', '乌拉圭'],
'🇲🇳': ['蒙古'],
'🇮🇷': ['IR', '伊朗'],
'🇵🇪': ['秘鲁', '祕魯'],
'🇨🇴': ['哥伦比亚'],
'🇪🇪': ['爱沙尼亚'],
'🇪🇨': ['EC', '厄瓜多尔'],
'🇲🇰': ['马其顿', '馬其頓'],
'🇧🇦': ['波黑共和国', '波黑'],
'🇬🇪': ['格魯吉亞', '格鲁吉亚'],
'🇦🇱': ['阿爾巴尼亞', '阿尔巴尼亚'],
'🏳️‍🌈': ['流量', '时间', '应急', '过期', 'Bandwidth', 'expire'],
}; };
for (let k of Object.keys(flags)) { // 原旗帜或空
if (flags[k].some((item) => name.indexOf(item) !== -1)) { let Flag = name.match(/[\uD83C][\uDDE6-\uDDFF][\uD83C][\uDDE6-\uDDFF]/)?.[0] || '🏴‍☠️'
return k; // 旗帜匹配
for (let flag of Object.keys(Flags)) {
const keywords = Flags[flag]
//console.log(`keywords = ${keywords}`)
// 精确匹配(两侧均有分割)
if (keywords.some(keyword => RegExp(`[^a-zA-Z]${keyword}[^a-zA-Z]`, "i").test(name))) {
//console.log(`new Flag1 = ${flag}`)
Flag = flag;
break; // 这里及时跳出,避免被之后的匹配覆盖结果
// 半精确匹配(至少一侧有分隔符)
} else if (keywords.some(keyword =>
RegExp(`[^a-zA-Z]${keyword}`, "i").test(name) || RegExp(`${keyword}[^a-zA-Z]`, "i").test(name)
)) {
//console.log(`new Flag2 = ${flag}`)
Flag = flag;
// 不精确匹配(只要包含就算)
} else if (keywords.some(keyword => RegExp(`${keyword}`, "i").test(name))) {
//console.log(`new Flag3 = ${flag}`)
Flag = flag;
} }
} }
// no flag found //console.log(`Final Flag = ${Flag}`)
const oldFlag = (name.match( return Flag
/[\uD83C][\uDDE6-\uDDFF][\uD83C][\uDDE6-\uDDFF]/,
) || [])[0];
return oldFlag || '🏴‍☠️';
} }