Add slice methods, some helpers for CodePointSlice and a few predicates
This commit is contained in:
parent
8471c60967
commit
f72575ae54
1 changed files with 30 additions and 2 deletions
32
src/index.ts
32
src/index.ts
|
|
@ -37,8 +37,13 @@ export function isDigit(x: CodePoint): boolean {
|
||||||
return isBetween(DIGIT_0, x, DIGIT_9);
|
return isBetween(DIGIT_0, x, DIGIT_9);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function isAlphanumeric(x: CodePoint): boolean {
|
export function isAsciiAlpha(x: CodePoint): boolean {
|
||||||
return isDigit(x) || isBetween(LOWERCASE_a, x, LOWERCASE_z) || isBetween(LOWERCASE_z, x, UPPERCASE_Z);
|
return isBetween(LOWERCASE_a, x, LOWERCASE_z)
|
||||||
|
|| isBetween(UPPERCASE_A, x, UPPERCASE_Z);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function isAsciiAlphanumeric(x: CodePoint): boolean {
|
||||||
|
return isAsciiAlpha(x) || isDigit(x);
|
||||||
}
|
}
|
||||||
|
|
||||||
export type CodePointRef = {
|
export type CodePointRef = {
|
||||||
|
|
@ -137,6 +142,10 @@ export class SourceText {
|
||||||
return this.source.slice(startOff, endOff);
|
return this.source.slice(startOff, endOff);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
slice(span: CodePointSpan): string {
|
||||||
|
return this.sliceByCp(span.start, span.end);
|
||||||
|
}
|
||||||
|
|
||||||
// Returns a Span for the given line (1-based index).
|
// Returns a Span for the given line (1-based index).
|
||||||
// If stripNewlines is true, the span will exclude trailing \r\n.
|
// If stripNewlines is true, the span will exclude trailing \r\n.
|
||||||
getLineSpan(line: number, stripNewlines = true): Span {
|
getLineSpan(line: number, stripNewlines = true): Span {
|
||||||
|
|
@ -248,6 +257,18 @@ export function rawSpan(start: CodePointIndex, end: CodePointIndex): CodePointSp
|
||||||
return { start, end };
|
return { start, end };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function pointSpan(index: CodePointIndex): CodePointSpan {
|
||||||
|
return { start: index, end: index };
|
||||||
|
}
|
||||||
|
|
||||||
|
export function spanLength(span: CodePointSpan): number {
|
||||||
|
return span.end - span.start;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function isZeroWidth(span: CodePointSpan): boolean {
|
||||||
|
return span.start === span.end;
|
||||||
|
}
|
||||||
|
|
||||||
export class SourceRegion {
|
export class SourceRegion {
|
||||||
constructor(
|
constructor(
|
||||||
public readonly source: SourceText,
|
public readonly source: SourceText,
|
||||||
|
|
@ -317,6 +338,13 @@ export class SourceRegion {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
slice(span: CodePointSpan): string {
|
||||||
|
if (span.start < this.span.start.index || span.end > this.span.end.index) {
|
||||||
|
throw new Error(`CodePointSpan ${span.start}-${span.end} is outside region ${this.span.start.index}-${this.span.end.index}`);
|
||||||
|
}
|
||||||
|
return this.source.sliceByCp(span.start, span.end);
|
||||||
|
}
|
||||||
|
|
||||||
// Creates a sub-region within this region.
|
// Creates a sub-region within this region.
|
||||||
// Validates that the new span is contained within the current region.
|
// Validates that the new span is contained within the current region.
|
||||||
subRegion(span: Span): SourceRegion {
|
subRegion(span: Span): SourceRegion {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue