diff --git a/packages/core/src/Id.ts b/packages/core/src/Id.ts index 6f8c148d..187d6353 100644 --- a/packages/core/src/Id.ts +++ b/packages/core/src/Id.ts @@ -6,12 +6,13 @@ export type Tagged = | PropertyId | TheoremId | { kind: 'trait'; space: number; property: number } + | { kind: 'unknown'; id: number } export type SpaceId = { kind: 'space'; id: number } export type PropertyId = { kind: 'property'; id: number } export type TheoremId = { kind: 'theorem'; id: number } -const pattern = /^(?[spti])0*(?\d+)/i +const pattern = /^(?[spti])?0*(?\d+)/i export function traitId({ space, property }: TraitId): string { return `${space}|${property}` @@ -33,6 +34,9 @@ export function tag(input: string): Tagged | null { } const id = parseInt(match.groups.id) + if (!match.groups.prefix) { + return { kind: 'unknown', id } + } switch (match.groups.prefix.toUpperCase()) { case 'S': return { kind: 'space', id } diff --git a/packages/core/test/Id.test.ts b/packages/core/test/Id.test.ts index 2b071f3c..f89c425d 100644 --- a/packages/core/test/Id.test.ts +++ b/packages/core/test/Id.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest' -import { format, toInt, trim } from '../src/Id' +import { format, toInt, trim, tag } from '../src/Id' describe('format', () => { it('pads the given character', () => { @@ -16,13 +16,17 @@ describe('toInt', () => { expect(toInt('T000100')).toEqual(100) }) - it('does not require a leading prefix', () => { + it('does not require leading zeros', () => { expect(toInt('P12')).toEqual(12) }) - it('does not match unknown types', () => { + it('does not match nonexistent kinds', () => { expect(toInt('Z000100')).toEqual(0) }) + + it('matches unknown kind', () => { + expect(toInt('000123')).toEqual(123) + }) }) describe('trim', () => { @@ -30,11 +34,41 @@ describe('trim', () => { expect(trim('T000100')).toEqual('100') }) - it('does not require a leading prefix', () => { + it('does not require leading zeros', () => { expect(trim('P12')).toEqual('12') }) - it('does not match unknown types', () => { + it('returns self for nonexistent kinds', () => { expect(trim('Z000100')).toEqual('Z000100') }) + + it('matches unknown kind', () => { + expect(trim('000123')).toEqual('123') + }) +}) + +describe('tag', () => { + it('tags spaces', () => { + expect(tag('S000100')?.kind).toEqual('space') + }) + + it('tags properties', () => { + expect(tag('P000100')?.kind).toEqual('property') + }) + + it('tags theorems', () => { + expect(tag('T000100')?.kind).toEqual('theorem') + }) + + it('tags unknowns', () => { + expect(tag('000100')?.kind).toEqual('unknown') + }) + + it('is null for nonexistent kinds', () => { + expect(tag('X000100')).toEqual(null) + }) + + it('allows lowercase', () => { + expect(tag('s000100')?.kind).toEqual('space') + }) }) diff --git a/packages/core/vite.config.ts b/packages/core/vite.config.ts index ec2c34f9..a0f6f73c 100644 --- a/packages/core/vite.config.ts +++ b/packages/core/vite.config.ts @@ -17,10 +17,10 @@ export default defineConfig({ }, test: { coverage: { - lines: 91.04, - branches: 93.68, - statements: 91.04, - functions: 83.55, + lines: 91.19, + branches: 94.07, + statements: 91.19, + functions: 84.21, skipFull: true, thresholdAutoUpdate: true, exclude: ['src/Formula/Grammar.ts', 'test'], diff --git a/packages/viewer/src/params/id.ts b/packages/viewer/src/params/id.ts new file mode 100644 index 00000000..51d005bd --- /dev/null +++ b/packages/viewer/src/params/id.ts @@ -0,0 +1,5 @@ +import type { ParamMatcher } from '@sveltejs/kit' + +export const match: ParamMatcher = param => { + return /^\w?(\d+)(.md)?$/.test(param) +} diff --git a/packages/viewer/src/routes/(app)/properties/[id]/+layout.ts b/packages/viewer/src/routes/(app)/properties/[id=id]/+layout.ts similarity index 100% rename from packages/viewer/src/routes/(app)/properties/[id]/+layout.ts rename to packages/viewer/src/routes/(app)/properties/[id=id]/+layout.ts diff --git a/packages/viewer/src/routes/(app)/properties/[id]/+page.svelte b/packages/viewer/src/routes/(app)/properties/[id=id]/+page.svelte similarity index 100% rename from packages/viewer/src/routes/(app)/properties/[id]/+page.svelte rename to packages/viewer/src/routes/(app)/properties/[id=id]/+page.svelte diff --git a/packages/viewer/src/routes/(app)/properties/[id]/references/+page.svelte b/packages/viewer/src/routes/(app)/properties/[id=id]/references/+page.svelte similarity index 100% rename from packages/viewer/src/routes/(app)/properties/[id]/references/+page.svelte rename to packages/viewer/src/routes/(app)/properties/[id=id]/references/+page.svelte diff --git a/packages/viewer/src/routes/(app)/properties/[id]/spaces/+page.svelte b/packages/viewer/src/routes/(app)/properties/[id=id]/spaces/+page.svelte similarity index 100% rename from packages/viewer/src/routes/(app)/properties/[id]/spaces/+page.svelte rename to packages/viewer/src/routes/(app)/properties/[id=id]/spaces/+page.svelte diff --git a/packages/viewer/src/routes/(app)/properties/[id]/theorems/+page.svelte b/packages/viewer/src/routes/(app)/properties/[id=id]/theorems/+page.svelte similarity index 100% rename from packages/viewer/src/routes/(app)/properties/[id]/theorems/+page.svelte rename to packages/viewer/src/routes/(app)/properties/[id=id]/theorems/+page.svelte diff --git a/packages/viewer/src/routes/(app)/spaces/[id]/+layout.ts b/packages/viewer/src/routes/(app)/spaces/[id=id]/+layout.ts similarity index 100% rename from packages/viewer/src/routes/(app)/spaces/[id]/+layout.ts rename to packages/viewer/src/routes/(app)/spaces/[id=id]/+layout.ts diff --git a/packages/viewer/src/routes/(app)/spaces/[id]/+page.svelte b/packages/viewer/src/routes/(app)/spaces/[id=id]/+page.svelte similarity index 100% rename from packages/viewer/src/routes/(app)/spaces/[id]/+page.svelte rename to packages/viewer/src/routes/(app)/spaces/[id=id]/+page.svelte diff --git a/packages/viewer/src/routes/(app)/spaces/[id]/properties/+page.svelte b/packages/viewer/src/routes/(app)/spaces/[id=id]/properties/+page.svelte similarity index 100% rename from packages/viewer/src/routes/(app)/spaces/[id]/properties/+page.svelte rename to packages/viewer/src/routes/(app)/spaces/[id=id]/properties/+page.svelte diff --git a/packages/viewer/src/routes/(app)/spaces/[id]/properties/[propertyId]/+page.svelte b/packages/viewer/src/routes/(app)/spaces/[id=id]/properties/[propertyId=id]/+page.svelte similarity index 100% rename from packages/viewer/src/routes/(app)/spaces/[id]/properties/[propertyId]/+page.svelte rename to packages/viewer/src/routes/(app)/spaces/[id=id]/properties/[propertyId=id]/+page.svelte diff --git a/packages/viewer/src/routes/(app)/spaces/[id]/references/+page.svelte b/packages/viewer/src/routes/(app)/spaces/[id=id]/references/+page.svelte similarity index 100% rename from packages/viewer/src/routes/(app)/spaces/[id]/references/+page.svelte rename to packages/viewer/src/routes/(app)/spaces/[id=id]/references/+page.svelte diff --git a/packages/viewer/src/routes/(app)/spaces/[id]/theorems/+page.svelte b/packages/viewer/src/routes/(app)/spaces/[id=id]/theorems/+page.svelte similarity index 100% rename from packages/viewer/src/routes/(app)/spaces/[id]/theorems/+page.svelte rename to packages/viewer/src/routes/(app)/spaces/[id=id]/theorems/+page.svelte diff --git a/packages/viewer/src/routes/(app)/theorems/[id]/+layout.ts b/packages/viewer/src/routes/(app)/theorems/[id=id]/+layout.ts similarity index 100% rename from packages/viewer/src/routes/(app)/theorems/[id]/+layout.ts rename to packages/viewer/src/routes/(app)/theorems/[id=id]/+layout.ts diff --git a/packages/viewer/src/routes/(app)/theorems/[id]/+page.svelte b/packages/viewer/src/routes/(app)/theorems/[id=id]/+page.svelte similarity index 100% rename from packages/viewer/src/routes/(app)/theorems/[id]/+page.svelte rename to packages/viewer/src/routes/(app)/theorems/[id=id]/+page.svelte diff --git a/packages/viewer/src/routes/(app)/theorems/[id]/converse/+page.svelte b/packages/viewer/src/routes/(app)/theorems/[id=id]/converse/+page.svelte similarity index 100% rename from packages/viewer/src/routes/(app)/theorems/[id]/converse/+page.svelte rename to packages/viewer/src/routes/(app)/theorems/[id=id]/converse/+page.svelte diff --git a/packages/viewer/src/routes/(app)/theorems/[id]/references/+page.svelte b/packages/viewer/src/routes/(app)/theorems/[id=id]/references/+page.svelte similarity index 100% rename from packages/viewer/src/routes/(app)/theorems/[id]/references/+page.svelte rename to packages/viewer/src/routes/(app)/theorems/[id=id]/references/+page.svelte