Skip to content

Commit

Permalink
feat: 支持去掉节点名称中的国旗 emoji
Browse files Browse the repository at this point in the history
  • Loading branch information
geekdada committed Sep 12, 2020
1 parent 94e35f7 commit 7b363d6
Show file tree
Hide file tree
Showing 5 changed files with 64 additions and 25 deletions.
9 changes: 6 additions & 3 deletions lib/generator/artifact.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ import {
trojanFilter,
socks5Filter,
} from '../utils/filter';
import { prependFlag } from '../utils/flag';
import { prependFlag, removeFlag } from '../utils/flag';
import { loadLocalSnippet } from './template';

export interface ArtifactOptions {
Expand Down Expand Up @@ -362,9 +362,12 @@ export class Artifact extends EventEmitter {
}
}

// 给节点名加国旗
if (provider.addFlag) {
nodeConfig.nodeName = prependFlag(nodeConfig.nodeName);
// 给节点名加国旗
nodeConfig.nodeName = prependFlag(nodeConfig.nodeName, provider.removeExistingFlag);
} else if (provider.removeExistingFlag) {
// 去掉名称中的国旗
nodeConfig.nodeName = removeFlag(nodeConfig.nodeName);
}

// TCP Fast Open
Expand Down
30 changes: 19 additions & 11 deletions lib/provider/Provider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ export default class Provider {
public readonly youtubePremiumFilter?: ProviderConfig['youtubePremiumFilter'];
public readonly customFilters?: ProviderConfig['customFilters'];
public readonly addFlag?: boolean;
public readonly removeExistingFlag?: boolean;
public readonly tfo?: boolean;
public readonly mptcp?: boolean;
public readonly renameNode?: ProviderConfig['renameNode'];
Expand All @@ -39,6 +40,7 @@ export default class Provider {
Joi.any().allow(Joi.function(), Joi.object({ filter: Joi.function(), supportSort: Joi.boolean().strict() }))
),
addFlag: Joi.boolean().strict(),
removeExistingFlag: Joi.boolean().strict(),
mptcp: Joi.boolean().strict(),
tfo: Joi.boolean().strict(),
startPort: Joi.number().integer().min(1024).max(65535),
Expand All @@ -57,18 +59,24 @@ export default class Provider {
throw error;
}

this.type = config.type;
this.nodeFilter = config.nodeFilter;
this.netflixFilter = config.netflixFilter;
this.youtubePremiumFilter = config.youtubePremiumFilter;
this.customFilters = config.customFilters;
this.addFlag = config.addFlag;
this.tfo = config.tfo;
this.mptcp = config.mptcp;
this.startPort = config.startPort;
this.renameNode = config.renameNode;
this.relayUrl = config.relayUrl;
this.supportGetSubscriptionUserInfo = false;

[
'type',
'nodeFilter',
'netflixFilter',
'youtubePremiumFilter',
'customFilters',
'addFlag',
'removeExistingFlag',
'tfo',
'mptcp',
'startPort',
'renameNode',
'relayUrl',
].forEach(key => {
this[key] = config[key];
});
}

public get nextPort(): number {
Expand Down
1 change: 1 addition & 0 deletions lib/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@ export interface ProviderConfig {
readonly [name: string]: NodeNameFilterType|SortedNodeNameFilterType;
};
readonly addFlag?: boolean;
readonly removeExistingFlag?: boolean;
readonly tfo?: boolean;
readonly mptcp?: boolean;
readonly renameNode?: (name: string) => string;
Expand Down
39 changes: 29 additions & 10 deletions lib/utils/flag.ts
Original file line number Diff line number Diff line change
@@ -1,29 +1,48 @@
import EmojiRegex from 'emoji-regex'
import flag from '../misc/flag_cn';

const flagMap: {
[name: string]: string;
} = {};
const flagMap: Map<string|RegExp, string> = new Map();

Object.keys(flag).forEach(emoji => {
flag[emoji].forEach((name: string) => {
flagMap[name] = emoji;
flagMap.set(name, emoji);
});
});

export const prependFlag = (str: string): string => {
export const addFlagMap = (name: string|RegExp, emoji: string): void => {
flagMap.set(name, emoji);
};

export const prependFlag = (str: string, removeExistingEmoji = false): string => {
const emojiRegex = EmojiRegex();
const existingEmoji = emojiRegex.exec(str);

// 如果已经存在 emoji 则不作处理
if (existingEmoji) {
return str;
if (removeExistingEmoji) {
// 去除已有的 emoji
str = removeFlag(str);
} else {
// 不作处理
return str;
}
}

for (const key in flagMap) {
if (flagMap.hasOwnProperty(key) && str.toUpperCase().includes(key)) {
return `${flagMap[key]} ${str}`;
for (const [key, value] of flagMap.entries()) {
if (typeof key === 'string') {
if (str.toUpperCase().includes(key)) {
return `${value} ${str}`;
}
} else {
if (key.test(str)) {
return `${value} ${str}`;
}
}
}

return str;
};

export const removeFlag = (str: string): string => {
const emojiRegex = EmojiRegex();
return str.replace(emojiRegex, '').trim();
};
10 changes: 9 additions & 1 deletion test/utils/flag.test.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import test from 'ava';
import { prependFlag } from '../../lib/utils/flag';
import { prependFlag, removeFlag } from '../../lib/utils/flag';

test('addFlag', t => {
t.is(prependFlag('美国'), '🇺🇸 美国');
Expand All @@ -10,4 +10,12 @@ test('addFlag', t => {
t.is(prependFlag('us'), '🇺🇸 us');
t.is(prependFlag('🇺🇸 jp'), '🇺🇸 jp');
t.is(prependFlag('🇯🇵 US'), '🇯🇵 US');
t.is(prependFlag('🇺🇸 jp', true), '🇯🇵 jp');
t.is(prependFlag('🇯🇵 🇺🇸 jp', true), '🇯🇵 jp');
t.is(prependFlag('🇺🇸 🇯🇵 US', true), '🇺🇸 US');
});

test('removeFlag', t => {
t.is(removeFlag('🇺🇸 jp'), 'jp');
t.is(removeFlag('🇺🇸 🇺🇸 jp'), 'jp');
});

0 comments on commit 7b363d6

Please sign in to comment.