rspace-online/modules/rdocs/converters/index.ts

58 lines
1.6 KiB
TypeScript

/**
* Converter registry and shared types for rDocs import/export.
*
* All source-specific converters implement NoteConverter.
* ConvertedNote is the intermediate format between external sources and NoteItem.
*/
import type { NoteItem, SourceRef } from '../schemas';
// Re-export types from shared converters
export type { ConvertedNote, ImportResult, ExportResult, NoteConverter, ImportInput, ExportOptions } from '../../../shared/converters/types';
// ── Shared utilities ──
/** Hash content for conflict detection (shared across all converters). */
export function hashContent(content: string): string {
let hash = 0;
for (let i = 0; i < content.length; i++) {
const char = content.charCodeAt(i);
hash = ((hash << 5) - hash) + char;
hash |= 0;
}
return Math.abs(hash).toString(36);
}
// ── Converter registry ──
import type { NoteConverter } from '../../../shared/converters/types';
const converters = new Map<string, NoteConverter>();
export function registerConverter(converter: NoteConverter): void {
converters.set(converter.id, converter);
}
export function getConverter(id: string): NoteConverter | undefined {
ensureConvertersLoaded();
return converters.get(id);
}
export function getAllConverters(): NoteConverter[] {
ensureConvertersLoaded();
return Array.from(converters.values());
}
// ── Lazy-load converters ──
let _loaded = false;
export function ensureConvertersLoaded(): void {
if (_loaded) return;
_loaded = true;
require('./obsidian');
require('./logseq');
require('./notion');
require('./google-docs');
require('./evernote');
require('./roam');
}