diff --git a/Build/lib/process-line.test.ts b/Build/lib/process-line.test.ts new file mode 100644 index 00000000..9a0619f9 --- /dev/null +++ b/Build/lib/process-line.test.ts @@ -0,0 +1,21 @@ +import { describe, it } from 'mocha'; + +import { processLine } from './process-line'; +import expect from 'expect'; + +describe('processLine', () => { + ([ + ['! comment', null], + [' ! comment', null], + ['// xommwnr', null], + ['# comment', null], + [' # comment', null], + ['###id', '###id'], + ['##.class', '##.class'], + ['## EOF', '## EOF'] + ] as const).forEach(([input, expected]) => { + it(input, () => { + expect(processLine(input)).toBe(expected); + }); + }); +}); diff --git a/Build/lib/process-line.ts b/Build/lib/process-line.ts index 23ee543f..187054d8 100644 --- a/Build/lib/process-line.ts +++ b/Build/lib/process-line.ts @@ -1,33 +1,29 @@ import { TransformStream } from 'node:stream/web'; export function processLine(line: string): string | null { - if (!line) { - return null; - } - const trimmed: string = line.trim(); if (trimmed.length === 0) { return null; } - const line_0: string = trimmed[0]; + const line_0 = trimmed.charCodeAt(0); if ( - line_0 === ' ' - || line_0 === '\r' - || line_0 === '\n' - || line_0 === '!' - || (line_0 === '/' && trimmed[1] === '/') + // line_0 === 32 /** [space] */ + // || line_0 === 13 /** \r */ + // || line_0 === 10 /** \n */ + line_0 === 33 /** ! */ + || (line_0 === 47 /** / */ && trimmed.charCodeAt(1) === 47 /** / */) ) { return null; } - if (line_0 === '#') { - if (trimmed[1] !== '#') { + if (line_0 === 35 /** # */) { + if (trimmed.charCodeAt(1) !== 35 /** # */) { // # Comment return null; } - if (trimmed[2] === '#' && trimmed[3] === '#') { + if (trimmed.charCodeAt(2) === 35 /** # */ && trimmed.charCodeAt(3) === 35) { // ################## EOF ################## return null; } diff --git a/Build/lib/singbox.ts b/Build/lib/singbox.ts index 32ff050b..4507173e 100644 --- a/Build/lib/singbox.ts +++ b/Build/lib/singbox.ts @@ -1,12 +1,3 @@ -// const unsupported = Symbol('unsupported'); - -// https://sing-box.sagernet.org/configuration/rule-set/source-format/ -// export const PROCESSOR: Record [key: keyof SingboxHeadlessRule, value: Required[keyof SingboxHeadlessRule][number]] | null) | typeof unsupported> = { -// 'IP-ASN': unsupported, -// 'URL-REGEX': unsupported, -// 'USER-AGENT': unsupported -// }; - interface SingboxHeadlessRule { domain?: string[], domain_suffix?: string[],