diff --git a/public/logos/calconnect-logo.svg b/public/logos/calconnect-logo.svg new file mode 100644 index 0000000..2a84e1d --- /dev/null +++ b/public/logos/calconnect-logo.svg @@ -0,0 +1 @@ +CALCONNECT \ No newline at end of file diff --git a/src/content/about/index.md b/src/content/about/index.md index 85def15..fd43d98 100644 --- a/src/content/about/index.md +++ b/src/content/about/index.md @@ -22,7 +22,7 @@ There was no universal way to: **PubID was born** from a conviction that the meaning of an identifier should be separate from any single representation of it. We needed a metaschema — a shared grammar — that could capture the full semantic depth of any publication identifier and express it in whatever form the situation demands. -Since then, PubID has grown to cover **37+ publishers** across international, regional, national, and industry standards, with a Ruby reference implementation that parses, renders, and interchanges identifiers with round-trip fidelity. +Since then, PubID has grown to cover **38+ publishers** across international, regional, national, and industry standards, with a Ruby reference implementation that parses, renders, and interchanges identifiers with round-trip fidelity. ## The Metaschema @@ -72,7 +72,7 @@ This pattern extends across all supported publishers: every PubID can render as | Component | Description | |-----------|-------------| | **Metaschema** | Formal definition of identifier elements and their relationships | -| **Publisher Schemas** | 37+ publisher-specific schema definitions | +| **Publisher Schemas** | 38+ publisher-specific schema definitions | | **Reference Library** | Ruby gem implementing all schemas with parse/render/URN support | | **This Website** | Documentation, interactive playground, and schema registry | diff --git a/src/content/library/index.md b/src/content/library/index.md index 43e4ae1..ea2e1c5 100644 --- a/src/content/library/index.md +++ b/src/content/library/index.md @@ -38,7 +38,7 @@ gem install pubid - **Generate URNs** for machine interchange - **Serialize** to JSON, YAML, or Hash - **Validate** identifier syntax -- **37+ publisher schemes** supported out of the box +- **38+ publisher schemes** supported out of the box ## Quick Example diff --git a/src/data/__tests__/flavors.spec.ts b/src/data/__tests__/flavors.spec.ts index 5947371..8cb1c37 100644 --- a/src/data/__tests__/flavors.spec.ts +++ b/src/data/__tests__/flavors.spec.ts @@ -188,6 +188,13 @@ describe('specific flavor invariants', () => { expect(keys).toEqual(['rfc', 'bcp', 'std', 'fyi', 'internet_draft']) }) + it('CalConnect has the Standard doc type', () => { + const cc = publishers.find(p => p.flavor === 'calconnect') + expect(cc).toBeDefined() + expect(cc?.docTypes).toHaveLength(1) + expect(cc?.docTypes[0]?.key).toBe('standard') + }) + it('PDF Association is not a flavor (not in pubid gem)', () => { const pdf = publishers.find(p => p.flavor === 'pdf' || p.flavor === 'pdf_association') expect(pdf).toBeUndefined() diff --git a/src/data/__tests__/registry.spec.ts b/src/data/__tests__/registry.spec.ts index 64a52d0..163d375 100644 --- a/src/data/__tests__/registry.spec.ts +++ b/src/data/__tests__/registry.spec.ts @@ -8,8 +8,8 @@ import type { Publisher, Category } from '~/data/types' describe('registry', () => { it('contains exactly the expected publisher count', () => { - // 37 = 35 (prior baseline) + ECMA + IETF (added 2026-07-15) - expect(publishers).toHaveLength(37) + // 38 = 37 (post-Astro-cutover baseline on main) + CalConnect (added 2026-07-16) + expect(publishers).toHaveLength(38) }) it('publishers are sorted alphabetically by flavor', () => { diff --git a/src/data/flavors/calconnect.ts b/src/data/flavors/calconnect.ts new file mode 100644 index 0000000..453016b --- /dev/null +++ b/src/data/flavors/calconnect.ts @@ -0,0 +1,43 @@ +import type { Publisher } from '../types' + +export const calconnect: Publisher = { + flavor: "calconnect", + logo: "/logos/calconnect-logo.svg", + name: "CalConnect", + fullName: "The Calendaring and Scheduling Consortium", + category: "industry", + description: "CalConnect (The Calendaring and Scheduling Consortium) is a nonprofit organization founded in 2004 that develops open standards for calendaring and scheduling. CalConnect brings together vendors, developers, and users of calendar systems to coordinate interoperability of iCalendar (RFC 5545/7986), CalDAV, and related calendaring technologies. CalConnect standards address gaps in the iCalendar ecosystem: calendaring event metadata, scheduling protocols, time-zone handling, and event publishing. Member organizations include major technology vendors, universities, and government agencies.", + website: "https://www.calconnect.org", + syntaxNotes: "CalConnect identifiers follow the shape: CC[/] :. The publisher token is always 'CC'. An optional series letter or token follows after a slash (A, WD, DIR, …). The number is a plain string (preserves leading zeros and sub-part separators like '0812-1' or '0707.1'). The date segment uses the ISO-style year format with optional month and day for full-date forms (e.g. 'CC/WD 51017:2024-07-23').", + urnPattern: "urn:cc:[series]:[number]:[year]", + relatedFlavors: ["ietf", "iso"], + docTypes: [ + { + key: "standard", + title: "CalConnect Standard (CC)", + abbr: ["CC"], + description: "CalConnect Standards — the normative specifications published by CalConnect. Numbered with a 4-digit sequence (preserves leading zeros, e.g. CC 18011:2018). An optional series letter (A, WD for Working Draft, DIR for Directives) can prefix the number after a slash. Full-date forms occur for working drafts (e.g. CC/WD 51017:2024-07-23).", + examples: [ + { input: "CC 18011:2018" }, + { input: "CC/DIR 10006:2019" }, + { input: "CC/WD 51017:2024-07-23" }, + { input: "CC 0514:2017" }, + { input: "CC 0812-1:2019" }, + ], + }, + ], + components: [ + { name: "Publisher", description: "CC — the canonical publisher token", example: "CC" }, + { name: "Series", description: "Optional series letter or token (A, WD, DIR, etc.) appearing after the publisher, separated by slash", attribute: "series", example: "WD" }, + { name: "Number", description: "Document number, kept as a string to preserve leading zeros and sub-part separators (0514, 0812-1, 0707.1)", attribute: "number", example: "51017" }, + { name: "Date", description: "Publication date: always year; month/day present only for full-date forms (2024-07-23)", attribute: "date", example: "2024" }, + ], + algebra: [ + { type: "Standard", description: "Basic CalConnect Standard without series", syntax: "CC :", example: "CC 18011:2018" }, + { type: "With Series", description: "Series prefix after the publisher, separated by slash", syntax: "CC/ :", example: "CC/DIR 10006:2019" }, + { type: "Full Date", description: "Full-date form for working drafts", syntax: "CC/ :--", example: "CC/WD 51017:2024-07-23" }, + { type: "Without Publisher", description: "Bare series+number form (no 'CC' prefix)", syntax: "[ ]:", example: "DIR 10006:2019" }, + ], +} + +export default calconnect