diff --git a/src/constructs/anchors.ts b/src/constructs/anchors.ts index 6d61f42..4d8b8d1 100644 --- a/src/constructs/anchors.ts +++ b/src/constructs/anchors.ts @@ -1,22 +1,22 @@ import type { EncodedRegex } from '../types'; export const startOfString: EncodedRegex = { - precedence: 'atom', + type: 'atom', pattern: '^', }; export const endOfString: EncodedRegex = { - precedence: 'atom', + type: 'atom', pattern: '$', }; export const wordBoundary: EncodedRegex = { - precedence: 'atom', + type: 'atom', pattern: '\\b', }; export const nonWordBoundary: EncodedRegex = { - precedence: 'atom', + type: 'atom', pattern: '\\B', }; diff --git a/src/constructs/capture.ts b/src/constructs/capture.ts index 3814866..c285e9a 100644 --- a/src/constructs/capture.ts +++ b/src/constructs/capture.ts @@ -21,13 +21,13 @@ export function capture(sequence: RegexSequence, options?: CaptureOptions): Enco const name = options?.name; if (name) { return { - precedence: 'atom', + type: 'atom', pattern: `(?<${name}>${encode(sequence).pattern})`, }; } return { - precedence: 'atom', + type: 'atom', pattern: `(${encode(sequence).pattern})`, }; } @@ -43,7 +43,7 @@ export function capture(sequence: RegexSequence, options?: CaptureOptions): Enco */ export function ref(name: string): Reference { return { - precedence: 'atom', + type: 'atom', pattern: `\\k<${name}>`, name, }; diff --git a/src/constructs/char-class.ts b/src/constructs/char-class.ts index 5724503..f6d5ec6 100644 --- a/src/constructs/char-class.ts +++ b/src/constructs/char-class.ts @@ -69,7 +69,7 @@ function encodeCharClass( if (pattern === '[^-]') pattern = '[\\^-]'; return { - precedence: 'atom', + type: 'atom', pattern, }; } diff --git a/src/constructs/char-escape.ts b/src/constructs/char-escape.ts index 77aa2cb..2fc9c22 100644 --- a/src/constructs/char-escape.ts +++ b/src/constructs/char-escape.ts @@ -5,42 +5,42 @@ import type { CharacterEscape, EncodedRegex } from '../types'; * Specifically this one is NOT a character escape. */ export const any: EncodedRegex = { - precedence: 'atom', + type: 'atom', pattern: '.', }; export const digit: CharacterEscape = { - precedence: 'atom', + type: 'atom', pattern: '\\d', chars: ['\\d'], }; export const nonDigit: CharacterEscape = { - precedence: 'atom', + type: 'atom', pattern: '\\D', chars: ['\\D'], }; export const word: CharacterEscape = { - precedence: 'atom', + type: 'atom', pattern: '\\w', chars: ['\\w'], }; export const nonWord: CharacterEscape = { - precedence: 'atom', + type: 'atom', pattern: '\\W', chars: ['\\W'], }; export const whitespace: CharacterEscape = { - precedence: 'atom', + type: 'atom', pattern: '\\s', chars: ['\\s'], }; export const nonWhitespace: CharacterEscape = { - precedence: 'atom', + type: 'atom', pattern: '\\S', chars: ['\\S'], }; diff --git a/src/constructs/choice-of.ts b/src/constructs/choice-of.ts index a899c94..271a2ec 100644 --- a/src/constructs/choice-of.ts +++ b/src/constructs/choice-of.ts @@ -12,7 +12,7 @@ export function choiceOf(...alternatives: RegexSequence[]): EncodedRegex { } return { - precedence: 'disjunction', + type: 'disjunction', pattern: encodedAlternatives.map((n) => n.pattern).join('|'), }; } diff --git a/src/constructs/lookahead.ts b/src/constructs/lookahead.ts index 6180033..2233bec 100644 --- a/src/constructs/lookahead.ts +++ b/src/constructs/lookahead.ts @@ -17,7 +17,7 @@ import type { EncodedRegex, RegexSequence } from '../types'; */ export function lookahead(sequence: RegexSequence): EncodedRegex { return { - precedence: 'atom', + type: 'atom', pattern: `(?=${encode(sequence).pattern})`, }; } diff --git a/src/constructs/lookbehind.ts b/src/constructs/lookbehind.ts index 9187bed..223783c 100644 --- a/src/constructs/lookbehind.ts +++ b/src/constructs/lookbehind.ts @@ -17,7 +17,7 @@ import type { EncodedRegex, RegexSequence } from '../types'; */ export function lookbehind(sequence: RegexSequence): EncodedRegex { return { - precedence: 'atom', + type: 'atom', pattern: `(?<=${encode(sequence).pattern})`, }; } diff --git a/src/constructs/negative-lookahead.ts b/src/constructs/negative-lookahead.ts index 5694ca6..51d3d33 100644 --- a/src/constructs/negative-lookahead.ts +++ b/src/constructs/negative-lookahead.ts @@ -17,7 +17,7 @@ import type { EncodedRegex, RegexSequence } from '../types'; */ export function negativeLookahead(sequence: RegexSequence): EncodedRegex { return { - precedence: 'atom', + type: 'atom', pattern: `(?!${encode(sequence).pattern})`, }; } diff --git a/src/constructs/negative-lookbehind.ts b/src/constructs/negative-lookbehind.ts index b0264f3..5955be8 100644 --- a/src/constructs/negative-lookbehind.ts +++ b/src/constructs/negative-lookbehind.ts @@ -17,7 +17,7 @@ import type { EncodedRegex, RegexSequence } from '../types'; */ export function negativeLookbehind(sequence: RegexSequence): EncodedRegex { return { - precedence: 'atom', + type: 'atom', pattern: `(? (n.precedence === 'disjunction' ? encodeAtomic(n) : n.pattern)) - .join(''), + type: 'sequence', + pattern: encoded.map((n) => (n.type === 'disjunction' ? encodeAtomic(n) : n.pattern)).join(''), }; } export function encodeAtomic(sequence: RegexSequence): string { const encoded = encode(sequence); - return encoded.precedence === 'atom' ? encoded.pattern : `(?:${encoded.pattern})`; + return encoded.type === 'atom' ? encoded.pattern : `(?:${encoded.pattern})`; } function encodeElement(element: RegexElement): EncodedRegex { @@ -51,7 +49,7 @@ function encodeText(text: string): EncodedRegex { return { // Optimize for single character case - precedence: text.length === 1 ? 'atom' : 'sequence', + type: text.length === 1 ? 'atom' : 'sequence', pattern: escapeText(text), }; } @@ -61,7 +59,7 @@ function encodeRegExp(regexp: RegExp): EncodedRegex { return { // Encode at safe precedence - precedence: isAtomicPattern(pattern) ? 'atom' : 'disjunction', + type: isAtomicPattern(pattern) ? 'atom' : 'disjunction', pattern, }; } diff --git a/src/types.ts b/src/types.ts index f6fd401..c24b247 100644 --- a/src/types.ts +++ b/src/types.ts @@ -21,11 +21,11 @@ export type RegexConstruct = EncodedRegex | LazyEncodableRegex; * Encoded regex pattern with information about its type (atom, sequence) */ export interface EncodedRegex { - precedence: EncodePrecedence; + type: RegexType; pattern: string; } -export type EncodePrecedence = 'atom' | 'sequence' | 'disjunction'; +export type RegexType = 'atom' | 'sequence' | 'disjunction'; export interface CharacterEscape extends EncodedRegex { // `CharacterClass` compatibility