book-index-ui 0.6.4 → 0.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/book-index-ui.css +52 -0
- package/dist/index.cjs +51 -13
- package/dist/index.d.ts +672 -11
- package/dist/index.js +6484 -3953
- package/dist/storage.d.ts +15 -0
- package/package.json +96 -96
package/dist/index.d.ts
CHANGED
|
@@ -141,7 +141,7 @@ export declare interface BookDetailLayoutProps {
|
|
|
141
141
|
onNavigate?: (id: string) => void;
|
|
142
142
|
onBack?: () => void;
|
|
143
143
|
backLabel?: string;
|
|
144
|
-
renderLink?:
|
|
144
|
+
renderLink?: RenderLink;
|
|
145
145
|
/** 加载 detail 后的额外加工(如注入 digital_assets) */
|
|
146
146
|
enrichDetail?: (entry: IndexEntry, detail: IndexDetailData) => void;
|
|
147
147
|
/** 当前 tab 的源文件链接解析器 */
|
|
@@ -151,23 +151,20 @@ export declare interface BookDetailLayoutProps {
|
|
|
151
151
|
} | null;
|
|
152
152
|
/** 注入额外 tab(如 kyg 的「数字化」) */
|
|
153
153
|
extraTabs?: ExtraTab[];
|
|
154
|
-
/** 是否显示内置反馈 tab,默认 true。设为 false 时调用方可用 extraTabs 自定义。 */
|
|
155
154
|
showFeedbackTab?: boolean;
|
|
156
|
-
/** 反馈 API 端点(默认 `/api/feedback`) */
|
|
157
155
|
feedbackApiUrl?: string | (() => string);
|
|
158
|
-
/**
|
|
156
|
+
/**
|
|
157
|
+
* 最小高度。旧版这里是「固定高度 + 内滚动」,现已改为文档流,
|
|
158
|
+
* 只用来保证短内容时页面不塌陷。
|
|
159
|
+
*/
|
|
159
160
|
height?: string;
|
|
160
|
-
/**
|
|
161
|
-
|
|
162
|
-
/** 内容区域最大宽度(默认 1024) */
|
|
163
|
-
contentMaxWidth?: number;
|
|
164
|
-
/** 是否在加载/未找到状态下隐藏整体导航(默认 false:仍显示返回链接) */
|
|
165
|
-
hideNavWhenLoading?: boolean;
|
|
161
|
+
/** 页脚左侧附加内容(如站点的引用信息条) */
|
|
162
|
+
footerExtra?: default_2.ReactNode;
|
|
166
163
|
className?: string;
|
|
167
164
|
style?: default_2.CSSProperties;
|
|
168
165
|
}
|
|
169
166
|
|
|
170
|
-
export declare type BookDetailTabKey = 'basic' | 'collated' | 'fulltext' | 'lineage' | '
|
|
167
|
+
export declare type BookDetailTabKey = 'basic' | 'collated' | 'fulltext' | 'lineage' | 'feedback' | string;
|
|
171
168
|
|
|
172
169
|
/**
|
|
173
170
|
* Book 全文 viewer:左侧章节列表 + 右侧 markdown 渲染。
|
|
@@ -371,6 +368,55 @@ export declare interface BookLineage {
|
|
|
371
368
|
note?: string;
|
|
372
369
|
}
|
|
373
370
|
|
|
371
|
+
export declare const BookPage: default_2.FC<BookPageProps>;
|
|
372
|
+
|
|
373
|
+
export declare interface BookPageProps {
|
|
374
|
+
data: BookDetailData;
|
|
375
|
+
transport?: IndexStorage;
|
|
376
|
+
onNavigate?: (id: string) => void;
|
|
377
|
+
renderLink?: RenderLink;
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
export declare function Breadcrumb({ items }: {
|
|
381
|
+
items: {
|
|
382
|
+
label: string;
|
|
383
|
+
onClick?: () => void;
|
|
384
|
+
href?: string;
|
|
385
|
+
}[];
|
|
386
|
+
}): JSX.Element;
|
|
387
|
+
|
|
388
|
+
export declare interface BucketedResources {
|
|
389
|
+
buckets: ResourceBucket[];
|
|
390
|
+
mirrors: MirrorGroup[];
|
|
391
|
+
/** 合并分册后的总数,用于「N 个资源」计数 */
|
|
392
|
+
total: number;
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
/**
|
|
396
|
+
* 把资源按类型分桶(文字全文库 / 影印资源 / 图文对照 / 馆藏),
|
|
397
|
+
* 并把同源镜像组(resource_groups)单独拎出来。
|
|
398
|
+
*
|
|
399
|
+
* 先合并分册系列——御定佩文韻府 23 条「第N冊」在分桶前必须先并成 1 条,
|
|
400
|
+
* 否则「影印資源」栏会出现 23 行一模一样的名字。
|
|
401
|
+
*/
|
|
402
|
+
export declare function bucketResources(items: ResourceEntry[] | undefined, groups?: Record<string, ResourceGroupInfo>): BucketedResources;
|
|
403
|
+
|
|
404
|
+
/**
|
|
405
|
+
* 构造丛编「收錄書籍」表。
|
|
406
|
+
*
|
|
407
|
+
* 三级数据源,按信息量降序:
|
|
408
|
+
* 1. volume_book_mapping.json —— 含部类/册次/缺册/附属子目,但生产仓只有 7 份
|
|
409
|
+
* 2. contained_works[] —— 含标题与册次,29 部丛编有(其中 16 部带 volume_index)
|
|
410
|
+
* 3. books[] —— 只有 ID,需逐条 getItem 才能拿标题
|
|
411
|
+
*
|
|
412
|
+
* 优先级很重要:武英殿聚珍版有 144 条 contained_works(自带标题+册次),
|
|
413
|
+
* 走第 2 级就能直接渲染,不必对 books[] 发 144 次请求。
|
|
414
|
+
*/
|
|
415
|
+
export declare function buildCollectionTable(coll: CollectionDetailData, catalog?: VolumeBookMapping | null, resolvedBooks?: Map<string, {
|
|
416
|
+
title?: string;
|
|
417
|
+
edition?: string;
|
|
418
|
+
}>): CollectionTable;
|
|
419
|
+
|
|
374
420
|
export declare function buildId(status: IndexStatus, type: IndexType, timestamp: bigint, machineId: number, sequence: number): bigint;
|
|
375
421
|
|
|
376
422
|
/**
|
|
@@ -384,12 +430,19 @@ export declare function buildId(status: IndexStatus, type: IndexType, timestamp:
|
|
|
384
430
|
*/
|
|
385
431
|
export declare function buildLineageGraph(work: WorkDetailData, books: BookDetailData[], collection?: string): LineageGraph;
|
|
386
432
|
|
|
433
|
+
/** 构造跳到指定页的 URL(目前只有 Wikimedia Commons 支持页内导航) */
|
|
434
|
+
export declare function buildPageUrl(baseUrl: string, pageNum: number): string;
|
|
435
|
+
|
|
387
436
|
/**
|
|
388
437
|
* 把原始 JSON 转成 draft_id → production_id 的扁平 Map,用于 redirect 查表。
|
|
389
438
|
* 容错:缺字段、版本号不匹配都按空映射处理(log 一条 warn)。
|
|
390
439
|
*/
|
|
391
440
|
export declare function buildPromotionMap(raw: unknown): Map<string, string>;
|
|
392
441
|
|
|
442
|
+
export declare function buildVersionRow(v: ResolvedVersion, vg?: VersionGraph): VersionRow;
|
|
443
|
+
|
|
444
|
+
export declare function buildVersionTable(versions: ResolvedVersion[], vg: VersionGraph | undefined, opts?: VersionTableOptions): VersionTable;
|
|
445
|
+
|
|
393
446
|
/**
|
|
394
447
|
* Bundle 只读 Storage 实现
|
|
395
448
|
*
|
|
@@ -538,6 +591,19 @@ declare interface CatalogDivision {
|
|
|
538
591
|
categories: CatalogCategory[];
|
|
539
592
|
}
|
|
540
593
|
|
|
594
|
+
/** 条目 chip(关联作品、别名、同作品其他版本…) */
|
|
595
|
+
export declare function Chip({ children, href, onClick, title }: {
|
|
596
|
+
children: default_2.ReactNode;
|
|
597
|
+
href?: string;
|
|
598
|
+
onClick?: () => void;
|
|
599
|
+
title?: string;
|
|
600
|
+
}): JSX.Element;
|
|
601
|
+
|
|
602
|
+
/** chip 牆:自动换行 + 「更多 N」 */
|
|
603
|
+
export declare function ChipWall({ children }: {
|
|
604
|
+
children: default_2.ReactNode;
|
|
605
|
+
}): JSX.Element;
|
|
606
|
+
|
|
541
607
|
/**
|
|
542
608
|
* 文件名清洗:保留 ASCII 字母数字 + CJK 全范围。
|
|
543
609
|
*
|
|
@@ -688,6 +754,11 @@ export declare interface CollectionCatalogProps {
|
|
|
688
754
|
/** Collection 详情 */
|
|
689
755
|
export declare interface CollectionDetailData extends BaseDetailData {
|
|
690
756
|
type: 'collection';
|
|
757
|
+
/**
|
|
758
|
+
* 丛编子类:book_collection(书籍汇编,60 部)/ work_collection(作品集,15 部)。
|
|
759
|
+
* 数据里一直有,此前没在类型里声明。
|
|
760
|
+
*/
|
|
761
|
+
subtype?: 'book_collection' | 'work_collection' | string;
|
|
691
762
|
work_id?: string;
|
|
692
763
|
contained_in?: string[];
|
|
693
764
|
history?: string[];
|
|
@@ -699,6 +770,47 @@ export declare interface CollectionDetailData extends BaseDetailData {
|
|
|
699
770
|
}[];
|
|
700
771
|
}
|
|
701
772
|
|
|
773
|
+
export declare const CollectionPage: default_2.FC<CollectionPageProps>;
|
|
774
|
+
|
|
775
|
+
export declare interface CollectionPageProps {
|
|
776
|
+
data: CollectionDetailData;
|
|
777
|
+
/** 丛编目录档(由 layout 预加载,生产仓只有 7 部丛编有) */
|
|
778
|
+
catalog?: VolumeBookMapping | null;
|
|
779
|
+
transport?: IndexStorage;
|
|
780
|
+
onNavigate?: (id: string) => void;
|
|
781
|
+
renderLink?: RenderLink;
|
|
782
|
+
/** 完整目录 tab 的入口(由 layout 注入) */
|
|
783
|
+
catalogAction?: default_2.ReactNode;
|
|
784
|
+
}
|
|
785
|
+
|
|
786
|
+
export declare interface CollectionRow {
|
|
787
|
+
/** 链接目标(work_id 或 book_id);无匹配时为空 */
|
|
788
|
+
id?: string;
|
|
789
|
+
title: string;
|
|
790
|
+
/** 部类(经史子集等),仅目录档有 */
|
|
791
|
+
section?: string;
|
|
792
|
+
/** 册号列表 */
|
|
793
|
+
volumes: number[];
|
|
794
|
+
/** 附属子目(如「附錄一卷」) */
|
|
795
|
+
subItems?: string[];
|
|
796
|
+
edition?: string;
|
|
797
|
+
/** 缺册统计(目录档有) */
|
|
798
|
+
found?: number;
|
|
799
|
+
expected?: number;
|
|
800
|
+
}
|
|
801
|
+
|
|
802
|
+
export declare interface CollectionTable {
|
|
803
|
+
rows: CollectionRow[];
|
|
804
|
+
/** 数据来源:catalog = 目录档(最全);works = contained_works;books = 仅 ID */
|
|
805
|
+
source: 'catalog' | 'works' | 'books';
|
|
806
|
+
/** 可用的部类筛选项 */
|
|
807
|
+
sections: string[];
|
|
808
|
+
/** 全帙册数(目录档有) */
|
|
809
|
+
totalVolumes?: number;
|
|
810
|
+
}
|
|
811
|
+
|
|
812
|
+
export declare function computeVersionPartition(ids: string[], vg?: VersionGraph): VersionPartition;
|
|
813
|
+
|
|
702
814
|
export declare class ConfigError extends BookIndexError {
|
|
703
815
|
constructor(message?: string);
|
|
704
816
|
}
|
|
@@ -752,17 +864,81 @@ export declare interface CreateEntityParams {
|
|
|
752
864
|
inheritData?: Record<string, unknown>;
|
|
753
865
|
}
|
|
754
866
|
|
|
867
|
+
/** 空值占位「—」 */
|
|
868
|
+
export declare function Dash(): JSX.Element;
|
|
869
|
+
|
|
870
|
+
/** 表格容器:顶部墨线 */
|
|
871
|
+
export declare function DataTable({ children }: {
|
|
872
|
+
children: default_2.ReactNode;
|
|
873
|
+
}): JSX.Element;
|
|
874
|
+
|
|
755
875
|
export declare const decodeId: typeof base36Decode;
|
|
756
876
|
|
|
757
877
|
/** Decode an ID string and extract its components. Supports both base36 and legacy base58. */
|
|
758
878
|
export declare function decodeIdString(encoded: string): IdComponents;
|
|
759
879
|
|
|
880
|
+
export declare interface DerivedEra {
|
|
881
|
+
/** 朝代名(繁体),如「宋」「清」「日本」;推不出时为空串 */
|
|
882
|
+
era: string;
|
|
883
|
+
/** 年号或纪年文本,如「乾隆」「慶元」「1773」;推不出时为空串 */
|
|
884
|
+
reign: string;
|
|
885
|
+
source: EraSource;
|
|
886
|
+
}
|
|
887
|
+
|
|
888
|
+
/**
|
|
889
|
+
* 版本类型推断(写本 / 刻本 / 活字本…)。
|
|
890
|
+
* lineage.category 只有 1% 有,其余从题名尾缀猜。
|
|
891
|
+
*/
|
|
892
|
+
export declare function deriveEditionType(book: EraInferable): string;
|
|
893
|
+
|
|
894
|
+
/**
|
|
895
|
+
* 推断一个版本的朝代 / 纪年。
|
|
896
|
+
*
|
|
897
|
+
* 三级回退,越靠前越可信:
|
|
898
|
+
* 1. lineage.year_text —— 人工整理的版本传承信息(仅 1% 有)
|
|
899
|
+
* 2. publication_info.year —— 著录的出版年(仅 2% 有)
|
|
900
|
+
* 3. edition ∥ title 的题名前缀与特征词 —— 覆盖约 96%,但是**推断**
|
|
901
|
+
*
|
|
902
|
+
* UI 必须依 source 区分显示(推断的加 hover 提示),不要让读者误以为
|
|
903
|
+
* 「宋 · 慶元」是著录事实。
|
|
904
|
+
*/
|
|
905
|
+
export declare function deriveEra(book: EraInferable): DerivedEra;
|
|
906
|
+
|
|
907
|
+
/**
|
|
908
|
+
* 推断可排序的公元年份。
|
|
909
|
+
*
|
|
910
|
+
* 优先 lineage.year(人工著录),其次文本里的 4 位公元年,
|
|
911
|
+
* 最后用年号表折算「乾隆四十三年」→ 1736 + 43 - 1 = 1778。
|
|
912
|
+
*/
|
|
913
|
+
export declare function deriveYear(book: EraInferable): number | undefined;
|
|
914
|
+
|
|
760
915
|
/** 描述信息 */
|
|
761
916
|
export declare interface DescriptionInfo {
|
|
762
917
|
text: string;
|
|
763
918
|
sources?: string[];
|
|
764
919
|
}
|
|
765
920
|
|
|
921
|
+
/**
|
|
922
|
+
* 全局样式。用 class 前缀 bim-d- 避免与消费者站点冲突。
|
|
923
|
+
*
|
|
924
|
+
* 响应式全部在这里用 media query 表达:JS 侧不读 window 宽度,
|
|
925
|
+
* 于是 Next.js 服务端渲染出的 HTML 与客户端首帧完全一致。
|
|
926
|
+
*/
|
|
927
|
+
export declare const DETAIL_CSS = "\n.bim-d-page {\n background: var(--bim-page-bg, #fbf9f3);\n color: var(--bim-ink, #2a231c);\n font-family: var(--bim-font-body, system-ui, sans-serif);\n min-height: 100%;\n padding-bottom: 64px;\n}\n.bim-d-main {\n max-width: 1000px;\n margin: 0 auto;\n padding: 24px clamp(16px, 4vw, 28px) 0;\n}\n.bim-d-ui { font-family: var(--bim-font-ui, system-ui, sans-serif); }\n\n.bim-d-page a { color: var(--bim-accent, #9c3a2c); text-decoration: none; }\n.bim-d-page a:hover {\n color: var(--bim-accent-deep, #6f2a20);\n text-decoration: underline;\n text-decoration-thickness: 1px;\n text-underline-offset: 3px;\n}\n.bim-d-page ::selection { background: var(--bim-selection-bg, #ecdcbc); }\n\n/* \u8868\u683C\u884C */\n.bim-d-row { display: grid; align-items: center; padding: 9px 4px;\n border-bottom: 1px solid var(--bim-rule, #eae2d0); font-size: 14px; }\n.bim-d-row:hover { background: var(--bim-row-hover-bg, #f5f1e5); }\n\n/* intro / \u6210\u5BF9\u533A\u5757\uFF1A\u5BBD\u5C4F\u4E24\u680F\uFF0C\u7A84\u5C4F\u5355\u680F */\n.bim-d-intro { display: grid; grid-template-columns: minmax(0, 1fr) 244px; gap: 30px;\n padding: 20px 0 26px; border-bottom: 1px solid var(--bim-rule, #e4dbc9);\n margin-bottom: 40px; align-items: start; }\n.bim-d-pair { display: grid; grid-template-columns: 1fr 1fr; gap: 34px;\n align-items: start; margin-bottom: 48px; }\n.bim-d-pair-wide { grid-template-columns: 1fr 1.2fr; }\n\n@media (max-width: 719px) {\n .bim-d-intro { grid-template-columns: 1fr; gap: 20px; margin-bottom: 32px; }\n .bim-d-pair, .bim-d-pair-wide { grid-template-columns: 1fr; gap: 40px; }\n /* \u8868\u683C\uFF1Ameta \u5217\u6298\u5230\u7B2C\u4E8C\u884C\uFF0C\u8868\u5934\u9690\u85CF */\n .bim-d-thead { display: none !important; }\n .bim-d-row { grid-template-columns: 22px 1fr !important; gap: 5px 10px !important;\n align-items: baseline; padding: 10px 2px; }\n .bim-d-row-meta { grid-column: 2; display: flex !important; flex-wrap: wrap;\n gap: 4px 14px; font-size: 12px; }\n .bim-d-h1 { font-size: 32px !important; }\n}\n";
|
|
928
|
+
|
|
929
|
+
export declare function DetailFooter({ left, right }: {
|
|
930
|
+
left?: default_2.ReactNode;
|
|
931
|
+
right?: default_2.ReactNode;
|
|
932
|
+
}): JSX.Element;
|
|
933
|
+
|
|
934
|
+
/** 页头:大标题 + 副题 + 右上小字 + (可选)第二行 */
|
|
935
|
+
export declare function DetailHeader({ title, subtitle, aside, secondLine }: {
|
|
936
|
+
title: default_2.ReactNode;
|
|
937
|
+
subtitle?: default_2.ReactNode;
|
|
938
|
+
aside?: default_2.ReactNode;
|
|
939
|
+
secondLine?: default_2.ReactNode;
|
|
940
|
+
}): JSX.Element;
|
|
941
|
+
|
|
766
942
|
/** IndexDetailData (结构化) → IndexEditorData (扁平化) */
|
|
767
943
|
export declare function detailToEditor(data: IndexDetailData): IndexEditorData;
|
|
768
944
|
|
|
@@ -799,6 +975,12 @@ export declare function EmendatedBySection({ items, onNavigate, renderLink }: {
|
|
|
799
975
|
renderLink?: (id: string, label?: string) => default_2.ReactNode;
|
|
800
976
|
}): JSX.Element;
|
|
801
977
|
|
|
978
|
+
/** 空状态说明(如「暫無版本著錄」) */
|
|
979
|
+
export declare function EmptyNote({ children, action }: {
|
|
980
|
+
children: default_2.ReactNode;
|
|
981
|
+
action?: default_2.ReactNode;
|
|
982
|
+
}): JSX.Element;
|
|
983
|
+
|
|
802
984
|
export declare const encodeId: typeof base36Encode;
|
|
803
985
|
|
|
804
986
|
export declare const EntityDetail: default_2.FC<EntityDetailProps>;
|
|
@@ -834,6 +1016,12 @@ export declare interface EntityDetailProps {
|
|
|
834
1016
|
onNavigate?: (id: string) => void;
|
|
835
1017
|
renderLink?: (id: string, label?: string) => default_2.ReactNode;
|
|
836
1018
|
headerExtra?: default_2.ReactNode;
|
|
1019
|
+
/**
|
|
1020
|
+
* 隐藏自带的标题块。
|
|
1021
|
+
* 详情页外壳(BookDetailLayout)已经在 DetailHeader 里渲染了
|
|
1022
|
+
* 姓名 / 朝代 / 生卒 / 类型,这里再渲一遍就是同一个名字出现两次。
|
|
1023
|
+
*/
|
|
1024
|
+
hideHeader?: boolean;
|
|
837
1025
|
}
|
|
838
1026
|
|
|
839
1027
|
/** 实体选项(搜索结果、最近使用等) */
|
|
@@ -846,6 +1034,15 @@ export declare interface EntityOption {
|
|
|
846
1034
|
dynasty?: string;
|
|
847
1035
|
}
|
|
848
1036
|
|
|
1037
|
+
export declare const EntityPage: default_2.FC<EntityPageProps>;
|
|
1038
|
+
|
|
1039
|
+
export declare interface EntityPageProps {
|
|
1040
|
+
data: EntityDetailData;
|
|
1041
|
+
transport?: IndexStorage;
|
|
1042
|
+
onNavigate?: (id: string) => void;
|
|
1043
|
+
renderLink?: RenderLink;
|
|
1044
|
+
}
|
|
1045
|
+
|
|
849
1046
|
export declare const EntityPickerDialog: default_2.FC<EntityPickerDialogProps>;
|
|
850
1047
|
|
|
851
1048
|
declare interface EntityPickerDialogProps {
|
|
@@ -886,6 +1083,34 @@ export declare interface EntityWorkRef {
|
|
|
886
1083
|
role?: string;
|
|
887
1084
|
}
|
|
888
1085
|
|
|
1086
|
+
/**
|
|
1087
|
+
* 推断函数只读这几个字段,故用结构类型而非完整 BookDetailData——
|
|
1088
|
+
* 这样 ResolvedVersion(version 表的轻量投影)也能直接传进来。
|
|
1089
|
+
*/
|
|
1090
|
+
export declare interface EraInferable {
|
|
1091
|
+
title?: string;
|
|
1092
|
+
edition?: string;
|
|
1093
|
+
lineage?: BookDetailData['lineage'];
|
|
1094
|
+
publication_info?: BookDetailData['publication_info'];
|
|
1095
|
+
}
|
|
1096
|
+
|
|
1097
|
+
export declare function eraRank(era: string): number;
|
|
1098
|
+
|
|
1099
|
+
/** 推断出的朝代及其可信来源 */
|
|
1100
|
+
export declare type EraSource = 'lineage' | 'publication' | 'edition' | 'none';
|
|
1101
|
+
|
|
1102
|
+
/**
|
|
1103
|
+
* 可展开行(书目收录 / 考证):+/- 方块 + 主行 + 展开内容。
|
|
1104
|
+
* 展开内容缩进对齐主行文字,带浅色左线。
|
|
1105
|
+
*/
|
|
1106
|
+
export declare function ExpandRow({ open, onToggle, main, action, children }: {
|
|
1107
|
+
open: boolean;
|
|
1108
|
+
onToggle: () => void;
|
|
1109
|
+
main: default_2.ReactNode;
|
|
1110
|
+
action?: default_2.ReactNode;
|
|
1111
|
+
children?: default_2.ReactNode;
|
|
1112
|
+
}): JSX.Element;
|
|
1113
|
+
|
|
889
1114
|
/** Entity.external_ids —— 外部数据库引用 */
|
|
890
1115
|
export declare interface ExternalIds {
|
|
891
1116
|
cbdb_id?: number;
|
|
@@ -893,6 +1118,12 @@ export declare interface ExternalIds {
|
|
|
893
1118
|
cbdb_source?: string;
|
|
894
1119
|
}
|
|
895
1120
|
|
|
1121
|
+
/** 外部链接(资源、机构) */
|
|
1122
|
+
export declare function ExtLink({ href, children }: {
|
|
1123
|
+
href: string;
|
|
1124
|
+
children: default_2.ReactNode;
|
|
1125
|
+
}): JSX.Element;
|
|
1126
|
+
|
|
896
1127
|
/**
|
|
897
1128
|
* 从 URL 的域名中提取简短标识符
|
|
898
1129
|
*/
|
|
@@ -924,6 +1155,39 @@ export declare interface ExtraTabContext {
|
|
|
924
1155
|
onNavigate?: (id: string) => void;
|
|
925
1156
|
}
|
|
926
1157
|
|
|
1158
|
+
export declare interface Fact {
|
|
1159
|
+
key: string;
|
|
1160
|
+
label: string;
|
|
1161
|
+
value: string;
|
|
1162
|
+
/** 点击跳转(如「收入」跳父丛编、「著錄」滚到书目区) */
|
|
1163
|
+
href?: string;
|
|
1164
|
+
/** 内部条目 ID(渲染成 BidLink) */
|
|
1165
|
+
linkId?: string;
|
|
1166
|
+
/** 锚点(页内滚动) */
|
|
1167
|
+
anchor?: string;
|
|
1168
|
+
/** hover 提示(如「據版本題名推斷」) */
|
|
1169
|
+
title?: string;
|
|
1170
|
+
}
|
|
1171
|
+
|
|
1172
|
+
export declare interface FactItem {
|
|
1173
|
+
label: string;
|
|
1174
|
+
value: default_2.ReactNode;
|
|
1175
|
+
/** hover 提示(如「據版本題名推斷」) */
|
|
1176
|
+
title?: string;
|
|
1177
|
+
}
|
|
1178
|
+
|
|
1179
|
+
/** facts 列表:左标签右值,带朱色左线 */
|
|
1180
|
+
export declare function FactList({ items, horizontal }: {
|
|
1181
|
+
items: FactItem[];
|
|
1182
|
+
/**
|
|
1183
|
+
* 横排模式:没有简介正文时用(Book 的 description 只有 2.5% 有)。
|
|
1184
|
+
* 此时标签与值改为上下堆叠——横排还左右对齐的话,标签和值之间会被
|
|
1185
|
+
* 拉开一大段空白,读者要横扫半个屏幕才能把「冊次」和「第 321–343 冊」
|
|
1186
|
+
* 对上号。
|
|
1187
|
+
*/
|
|
1188
|
+
horizontal?: boolean;
|
|
1189
|
+
}): JSX.Element | null;
|
|
1190
|
+
|
|
927
1191
|
export declare const FeedbackButton: default_2.FC<FeedbackButtonProps>;
|
|
928
1192
|
|
|
929
1193
|
export declare interface FeedbackButtonProps {
|
|
@@ -1018,12 +1282,31 @@ declare interface FileSystem_2 {
|
|
|
1018
1282
|
}
|
|
1019
1283
|
export { FileSystem_2 as FileSystem }
|
|
1020
1284
|
|
|
1285
|
+
/** 筛选 chip(朝代、部类、分组)。选中态为朱红实心。 */
|
|
1286
|
+
export declare function FilterChip({ label, active, onClick, dashed }: {
|
|
1287
|
+
label: string;
|
|
1288
|
+
active?: boolean;
|
|
1289
|
+
onClick?: () => void;
|
|
1290
|
+
dashed?: boolean;
|
|
1291
|
+
}): JSX.Element;
|
|
1292
|
+
|
|
1293
|
+
/**
|
|
1294
|
+
* 把 `additional_titles` / `attached_texts` 这类
|
|
1295
|
+
* `(string | { book_title })[]` 摊平成字符串数组。
|
|
1296
|
+
*/
|
|
1297
|
+
export declare function flattenTitles(items?: (string | {
|
|
1298
|
+
book_title: string;
|
|
1299
|
+
})[]): string[];
|
|
1300
|
+
|
|
1021
1301
|
/**
|
|
1022
1302
|
* 简单模板替换
|
|
1023
1303
|
* formatTemplate('共 {n} 册', { n: 100 }) → '共 100 册'
|
|
1024
1304
|
*/
|
|
1025
1305
|
export declare function formatTemplate(template: string, values: Record<string, string | number>): string;
|
|
1026
1306
|
|
|
1307
|
+
/** 格式化册号范围:连续用「321–343」,零散用逗号,过多用「a–b (N 冊)」 */
|
|
1308
|
+
export declare function formatVolumeRange(volumes: number[], unitVolume?: string): string;
|
|
1309
|
+
|
|
1027
1310
|
export declare const FormInput: default_2.FC<FormInputProps>;
|
|
1028
1311
|
|
|
1029
1312
|
declare interface FormInputProps {
|
|
@@ -1042,6 +1325,14 @@ declare interface FormTextAreaProps {
|
|
|
1042
1325
|
placeholder?: string;
|
|
1043
1326
|
}
|
|
1044
1327
|
|
|
1328
|
+
/** 从 URL 提取域名并映射为显示名称 */
|
|
1329
|
+
export declare function getDisplayNameFromUrl(url: string): string | undefined;
|
|
1330
|
+
|
|
1331
|
+
/** Extract the start page number from metadata (page_range or file_page_range) */
|
|
1332
|
+
export declare function getStartPage(metadata?: Record<string, unknown>): number | undefined;
|
|
1333
|
+
|
|
1334
|
+
export declare function getTypeGroupKey(types: ResourceTypeAtom[]): string;
|
|
1335
|
+
|
|
1045
1336
|
/**
|
|
1046
1337
|
* GitHub 只读 Storage 实现
|
|
1047
1338
|
*
|
|
@@ -1135,6 +1426,12 @@ export declare interface GithubStorageConfig {
|
|
|
1135
1426
|
timeout?: number;
|
|
1136
1427
|
}
|
|
1137
1428
|
|
|
1429
|
+
/** 方形字形徽章(版·源·目·考·續·叢·收·作) */
|
|
1430
|
+
export declare function GlyphBadge({ char, tone }: {
|
|
1431
|
+
char: string;
|
|
1432
|
+
tone?: 'accent' | 'ink';
|
|
1433
|
+
}): JSX.Element;
|
|
1434
|
+
|
|
1138
1435
|
/** 统一搜索结果(按类型分组) */
|
|
1139
1436
|
export declare interface GroupedSearchResult {
|
|
1140
1437
|
works: IndexEntry[];
|
|
@@ -1148,6 +1445,15 @@ export declare interface GroupedSearchResult {
|
|
|
1148
1445
|
totalEntities?: number;
|
|
1149
1446
|
}
|
|
1150
1447
|
|
|
1448
|
+
/**
|
|
1449
|
+
* 把 related_works 按 relation 分成 5 桶。
|
|
1450
|
+
*
|
|
1451
|
+
* 现有 IndexDetail 只识别 4 种 relation,剩下 8 种(contains_text_of 4231 条、
|
|
1452
|
+
* collected_in 3376 条、studies 304 条…)全落进「相關作品」兜底桶,
|
|
1453
|
+
* 语义全丢。这里覆盖生产仓里出现过的全部 12 种。
|
|
1454
|
+
*/
|
|
1455
|
+
export declare function groupRelatedWorks(items: RelatedWorkRef[]): RelatedGroup[];
|
|
1456
|
+
|
|
1151
1457
|
export declare const HomePage: default_2.FC<HomePageProps>;
|
|
1152
1458
|
|
|
1153
1459
|
export declare interface HomePageProps {
|
|
@@ -1289,6 +1595,16 @@ export declare interface IndexedByEntry {
|
|
|
1289
1595
|
author_info?: string;
|
|
1290
1596
|
/** 收录时的版本信息,如"內府藏本" */
|
|
1291
1597
|
edition?: string;
|
|
1598
|
+
/**
|
|
1599
|
+
* 在该书目中的门类,如"六藝略/春秋"。
|
|
1600
|
+
* 抽样 2480 部作品中 21.6% 有此字段,此前一直没在类型里声明,
|
|
1601
|
+
* 于是详情页读不到、也就从没展示过。
|
|
1602
|
+
*/
|
|
1603
|
+
section?: string;
|
|
1604
|
+
/** section 的判定依据(整理时记录的推理过程,一般不展示) */
|
|
1605
|
+
section_basis?: string;
|
|
1606
|
+
/** 出处页码,如"KR2a0007_WYG_030-12b"(抽样 8.6% 有) */
|
|
1607
|
+
page?: string;
|
|
1292
1608
|
/** 提要/摘要 */
|
|
1293
1609
|
summary?: string;
|
|
1294
1610
|
/** 编者评论 */
|
|
@@ -1584,6 +1900,12 @@ export declare interface IndexViewProps {
|
|
|
1584
1900
|
style?: default_2.CSSProperties;
|
|
1585
1901
|
}
|
|
1586
1902
|
|
|
1903
|
+
/** intro 区:左正文 + 右 facts */
|
|
1904
|
+
export declare function IntroGrid({ children, facts }: {
|
|
1905
|
+
children?: default_2.ReactNode;
|
|
1906
|
+
facts?: default_2.ReactNode;
|
|
1907
|
+
}): JSX.Element;
|
|
1908
|
+
|
|
1587
1909
|
/** 卷数 */
|
|
1588
1910
|
export declare interface JuanCount {
|
|
1589
1911
|
number?: number;
|
|
@@ -1695,6 +2017,12 @@ export declare type LineageSiblingRelation = '兄弟本' | '同源' | '互校' |
|
|
|
1695
2017
|
/** 版本现存状态 */
|
|
1696
2018
|
export declare type LineageStatus = 'extant' | 'fragment' | 'lost';
|
|
1697
2019
|
|
|
2020
|
+
/** 链接渲染上下文。消费者可据此调整样式,如表格里不显示类型图标。 */
|
|
2021
|
+
export declare interface LinkContext {
|
|
2022
|
+
/** 位于成列的表格/列表中——整列同类型时图标只是噪音 */
|
|
2023
|
+
dense?: boolean;
|
|
2024
|
+
}
|
|
2025
|
+
|
|
1698
2026
|
/** 加载选项 */
|
|
1699
2027
|
export declare interface LoadOptions {
|
|
1700
2028
|
page?: number;
|
|
@@ -1845,6 +2173,8 @@ export declare interface LocaleMessages {
|
|
|
1845
2173
|
containedWorks: string;
|
|
1846
2174
|
adaptations: string;
|
|
1847
2175
|
derivativeWorks: string;
|
|
2176
|
+
/** 本作品所研究/注解的对象(relation: studies / preceded_by) */
|
|
2177
|
+
studies: string;
|
|
1848
2178
|
};
|
|
1849
2179
|
relation: {
|
|
1850
2180
|
belongsToWork: string;
|
|
@@ -1908,6 +2238,13 @@ export declare interface LocaleMessages {
|
|
|
1908
2238
|
collectionCatalog: string;
|
|
1909
2239
|
collatedEdition: string;
|
|
1910
2240
|
catalogSuffix: string;
|
|
2241
|
+
fullText: string;
|
|
2242
|
+
lineage: string;
|
|
2243
|
+
feedback: string;
|
|
2244
|
+
dataSource: string;
|
|
2245
|
+
backToIndex: string;
|
|
2246
|
+
submitVersion: string;
|
|
2247
|
+
dataLicense: string;
|
|
1911
2248
|
};
|
|
1912
2249
|
metadata: Record<string, string>;
|
|
1913
2250
|
editor: {
|
|
@@ -2099,10 +2436,31 @@ declare interface Measure {
|
|
|
2099
2436
|
note?: string;
|
|
2100
2437
|
}
|
|
2101
2438
|
|
|
2439
|
+
/** 计量文本:measure_info 优先(70% 有),回退 juan_count */
|
|
2440
|
+
export declare function measureText(detail: Partial<IndexDetailData>, juanUnit?: string): string;
|
|
2441
|
+
|
|
2442
|
+
/**
|
|
2443
|
+
* 将同名模式的分册资源自动合并为一条带 volumes 的资源。
|
|
2444
|
+
*
|
|
2445
|
+
* 匹配「XXX·第N冊」与「XXX (N)」「XXX·N」两种命名;≥2 册才合并,
|
|
2446
|
+
* 免得把「史記 (1)」这种孤例也变成一个空壳分册组。
|
|
2447
|
+
*
|
|
2448
|
+
* 御定佩文韻府就是典型:23 条「摛藻堂四庫全書薈要·第321冊」…「第343冊」
|
|
2449
|
+
* 合成一条「摛藻堂四庫全書薈要」+ 23 个册号。
|
|
2450
|
+
*/
|
|
2451
|
+
export declare function mergeVolumeResources(items: ResourceEntry[]): ResourceEntry[];
|
|
2452
|
+
|
|
2102
2453
|
export declare class MigrationError extends BookIndexError {
|
|
2103
2454
|
constructor(message?: string);
|
|
2104
2455
|
}
|
|
2105
2456
|
|
|
2457
|
+
export declare interface MirrorGroup {
|
|
2458
|
+
key: string;
|
|
2459
|
+
label: string;
|
|
2460
|
+
description?: string;
|
|
2461
|
+
items: ResourceEntry[];
|
|
2462
|
+
}
|
|
2463
|
+
|
|
2106
2464
|
/**
|
|
2107
2465
|
* 模式指示器
|
|
2108
2466
|
* 显示和切换本地模式/同步模式、draft/official 切换
|
|
@@ -2119,17 +2477,48 @@ declare interface ModeIndicatorProps {
|
|
|
2119
2477
|
onSelectFolder?: () => void;
|
|
2120
2478
|
}
|
|
2121
2479
|
|
|
2480
|
+
/** 整行宽的虚线「展开其余 N 条」按钮 */
|
|
2481
|
+
export declare function MoreButton({ label, onClick, inline }: {
|
|
2482
|
+
label: string;
|
|
2483
|
+
onClick: () => void;
|
|
2484
|
+
/** inline = chip 牆里的「更多 N 種」,非整行 */
|
|
2485
|
+
inline?: boolean;
|
|
2486
|
+
}): JSX.Element;
|
|
2487
|
+
|
|
2122
2488
|
/**
|
|
2123
2489
|
* 将任意格式的 volume_book_mapping.json 归一化为统一的 VolumeBookMapping。
|
|
2124
2490
|
*/
|
|
2125
2491
|
export declare function normalizeCatalog(raw: unknown): VolumeBookMapping;
|
|
2126
2492
|
|
|
2493
|
+
export declare function normalizeEra(era: string): string;
|
|
2494
|
+
|
|
2495
|
+
/**
|
|
2496
|
+
* 把原始 role 歸到粗類。
|
|
2497
|
+
* 空值歸「撰」——802 條 null + 121 條空串,絕大多數是錄入時省略的作者本人著作。
|
|
2498
|
+
*/
|
|
2499
|
+
export declare function normalizeRole(role?: string | null): RoleClass;
|
|
2500
|
+
|
|
2501
|
+
/** volume_index 有 int / number[] / string 三种形态(生产仓实测),统一成 number[] */
|
|
2502
|
+
export declare function normalizeVolumeIndex(vi: unknown): number[];
|
|
2503
|
+
|
|
2504
|
+
/** 归一化 volumes:补齐 URL */
|
|
2505
|
+
export declare function normalizeVolumes(item: ResourceEntry): ResourceVolume[] | null;
|
|
2506
|
+
|
|
2507
|
+
export declare function numberToChinese(n: number): string;
|
|
2508
|
+
|
|
2509
|
+
export declare const PAGE_MAX_WIDTH = 1000;
|
|
2510
|
+
|
|
2127
2511
|
/** 页数 */
|
|
2128
2512
|
export declare interface PageCount {
|
|
2129
2513
|
number?: number;
|
|
2130
2514
|
description?: string;
|
|
2131
2515
|
}
|
|
2132
2516
|
|
|
2517
|
+
export declare function PageFrame({ children, style }: {
|
|
2518
|
+
children: default_2.ReactNode;
|
|
2519
|
+
style?: default_2.CSSProperties;
|
|
2520
|
+
}): JSX.Element;
|
|
2521
|
+
|
|
2133
2522
|
/** 分页结果 */
|
|
2134
2523
|
export declare interface PageResult<T> {
|
|
2135
2524
|
entries: T[];
|
|
@@ -2138,6 +2527,9 @@ export declare interface PageResult<T> {
|
|
|
2138
2527
|
pageSize: number;
|
|
2139
2528
|
}
|
|
2140
2529
|
|
|
2530
|
+
/** 解析「四十三」「廿四」「元」这类中文序数 */
|
|
2531
|
+
export declare function parseChineseNumber(s: string): number | undefined;
|
|
2532
|
+
|
|
2141
2533
|
export declare function parseId(id: bigint): IdComponents;
|
|
2142
2534
|
|
|
2143
2535
|
/** 解析 JSON 格式的来源数组 */
|
|
@@ -2168,6 +2560,12 @@ export declare interface PublicationInfo {
|
|
|
2168
2560
|
details?: string;
|
|
2169
2561
|
}
|
|
2170
2562
|
|
|
2563
|
+
/** 展开区里的引文块(提要 / 按语 / 附按) */
|
|
2564
|
+
export declare function Quote({ label, children }: {
|
|
2565
|
+
label?: string;
|
|
2566
|
+
children: default_2.ReactNode;
|
|
2567
|
+
}): JSX.Element;
|
|
2568
|
+
|
|
2171
2569
|
/** 推荐数据 */
|
|
2172
2570
|
export declare interface RecommendedData {
|
|
2173
2571
|
groups: RecommendedGroup[];
|
|
@@ -2221,6 +2619,19 @@ export declare interface RelatedEntity {
|
|
|
2221
2619
|
type: IndexType;
|
|
2222
2620
|
}
|
|
2223
2621
|
|
|
2622
|
+
export declare interface RelatedGroup {
|
|
2623
|
+
key: string;
|
|
2624
|
+
/** i18n key,UI 侧翻译 */
|
|
2625
|
+
labelKey: 'belongsToWork' | 'containedWorks' | 'derivativeWorks' | 'studies' | 'relatedWorks';
|
|
2626
|
+
items: RelatedWorkRef[];
|
|
2627
|
+
}
|
|
2628
|
+
|
|
2629
|
+
export declare interface RelatedWorkRef {
|
|
2630
|
+
id: string;
|
|
2631
|
+
title: string;
|
|
2632
|
+
relation?: string;
|
|
2633
|
+
}
|
|
2634
|
+
|
|
2224
2635
|
/** 关联关系数据 */
|
|
2225
2636
|
export declare interface RelationData {
|
|
2226
2637
|
parentWork?: RelatedEntity;
|
|
@@ -2254,6 +2665,8 @@ declare interface RelationPanelProps {
|
|
|
2254
2665
|
onSaveRelations?: () => void;
|
|
2255
2666
|
}
|
|
2256
2667
|
|
|
2668
|
+
export declare type RenderLink = (id: string, label?: string, ctx?: LinkContext) => default_2.ReactNode;
|
|
2669
|
+
|
|
2257
2670
|
/**
|
|
2258
2671
|
* 指向开源数据源文件的 GitHub icon 链接。
|
|
2259
2672
|
* 库内不感知具体仓库,由调用方传入 href。
|
|
@@ -2271,6 +2684,24 @@ export declare interface RepoSourceLinkProps {
|
|
|
2271
2684
|
style?: default_2.CSSProperties;
|
|
2272
2685
|
}
|
|
2273
2686
|
|
|
2687
|
+
/** 已解析的版本条目(BookDetailData 的子集 + 派生字段) */
|
|
2688
|
+
export declare interface ResolvedVersion {
|
|
2689
|
+
id: string;
|
|
2690
|
+
title?: string;
|
|
2691
|
+
edition?: string;
|
|
2692
|
+
type?: string;
|
|
2693
|
+
resources?: ResourceEntry[];
|
|
2694
|
+
resource_groups?: Record<string, ResourceGroupInfo>;
|
|
2695
|
+
publication_info?: BookDetailData['publication_info'];
|
|
2696
|
+
current_location?: BookDetailData['current_location'];
|
|
2697
|
+
lineage?: BookDetailData['lineage'];
|
|
2698
|
+
}
|
|
2699
|
+
|
|
2700
|
+
export declare interface ResourceBucket {
|
|
2701
|
+
key: 'text' | 'image' | 'textImage' | 'physical';
|
|
2702
|
+
items: ResourceEntry[];
|
|
2703
|
+
}
|
|
2704
|
+
|
|
2274
2705
|
/** 带资源信息的丛编目录 */
|
|
2275
2706
|
export declare interface ResourceCatalog {
|
|
2276
2707
|
resource_id: string;
|
|
@@ -2319,18 +2750,46 @@ export declare interface ResourceEntry {
|
|
|
2319
2750
|
group_role?: 'origin' | 'mirror';
|
|
2320
2751
|
}
|
|
2321
2752
|
|
|
2753
|
+
/** 资源分组:标题 + 右上标签 + 若干行 */
|
|
2754
|
+
export declare function ResourceGroup({ title, tag, children }: {
|
|
2755
|
+
title: string;
|
|
2756
|
+
tag?: string;
|
|
2757
|
+
children: default_2.ReactNode;
|
|
2758
|
+
}): JSX.Element;
|
|
2759
|
+
|
|
2322
2760
|
/** Book/Work 上的资源组元数据:每个 group key 对应一组同源镜像的展示信息 */
|
|
2323
2761
|
declare interface ResourceGroupInfo {
|
|
2324
2762
|
label?: string;
|
|
2325
2763
|
description?: string;
|
|
2326
2764
|
}
|
|
2327
2765
|
|
|
2766
|
+
/** 资源的最终跳转地址(有页码范围时直达起始页) */
|
|
2767
|
+
export declare function resourceHref(item: ResourceEntry): string | undefined;
|
|
2768
|
+
|
|
2328
2769
|
/** 资源导入状态 */
|
|
2329
2770
|
export declare type ResourceImportStatus = 'todo' | 'in_progress' | 'done';
|
|
2330
2771
|
|
|
2331
2772
|
/** 资源导入类型 */
|
|
2332
2773
|
export declare type ResourceImportType = 'catalog' | 'collection';
|
|
2333
2774
|
|
|
2775
|
+
/**
|
|
2776
|
+
* 资源行(含分册展开)。
|
|
2777
|
+
*
|
|
2778
|
+
* 三张页面原先各写了一份:作品页 ResourceLine、版本页 BookResourceLine、
|
|
2779
|
+
* 丛编页 CollectionResourceLine —— 名称解析、note 拼接、分册展开按钮、
|
|
2780
|
+
* 缺册划线的样式全都是复制过去的,其中版本页那份连 VolumeLinks 都内联了
|
|
2781
|
+
* 一遍。合成一个,差异用 props 表达。
|
|
2782
|
+
*/
|
|
2783
|
+
export declare function ResourceLine({ item, siblings, showVolumes, fallbackNote, }: {
|
|
2784
|
+
item: ResourceEntry;
|
|
2785
|
+
/** 同组资源,用于给重名条目加区分后缀(史記在 CText 上三条同名) */
|
|
2786
|
+
siblings?: ResourceEntry[];
|
|
2787
|
+
/** 关掉分册展开:册号已在别处逐个列出时(版本页的「收入叢編」) */
|
|
2788
|
+
showVolumes?: boolean;
|
|
2789
|
+
/** note 为空时的兜底(丛编页用 details 补) */
|
|
2790
|
+
fallbackNote?: string;
|
|
2791
|
+
}): JSX.Element;
|
|
2792
|
+
|
|
2334
2793
|
/**
|
|
2335
2794
|
* 只读资源列表
|
|
2336
2795
|
* 用于 kaiyuanguji-web 等场景的资源展示
|
|
@@ -2349,6 +2808,12 @@ declare interface ResourceListProps {
|
|
|
2349
2808
|
renderLink?: (id: string, label?: string) => default_2.ReactNode;
|
|
2350
2809
|
}
|
|
2351
2810
|
|
|
2811
|
+
/**
|
|
2812
|
+
* 资源的一行说明文字(设计稿里名称下方的小字)。
|
|
2813
|
+
* 例:「原卷掃描 · 23 / 23 冊」「精校版 · 圖文對照」「文淵閣本 · v224」
|
|
2814
|
+
*/
|
|
2815
|
+
export declare function resourceNote(item: ResourceEntry): string;
|
|
2816
|
+
|
|
2352
2817
|
/** 资源导入进度数据 */
|
|
2353
2818
|
export declare interface ResourceProgress {
|
|
2354
2819
|
resources: ResourceProgressItem[];
|
|
@@ -2376,6 +2841,15 @@ export declare interface ResourceProgressItem {
|
|
|
2376
2841
|
notes?: string;
|
|
2377
2842
|
}
|
|
2378
2843
|
|
|
2844
|
+
/** 资源行:名称 + note + 外链箭头 */
|
|
2845
|
+
export declare function ResourceRow({ name, note, href, extra }: {
|
|
2846
|
+
name: default_2.ReactNode;
|
|
2847
|
+
note?: string;
|
|
2848
|
+
href?: string;
|
|
2849
|
+
/** 行尾附加内容(如分册展开按钮) */
|
|
2850
|
+
extra?: default_2.ReactNode;
|
|
2851
|
+
}): JSX.Element;
|
|
2852
|
+
|
|
2379
2853
|
/** 资源类型(旧版兼容:可单值或组合)。新数据应用 `types: ResourceTypeAtom[]` */
|
|
2380
2854
|
export declare type ResourceType = ResourceTypeAtom | 'text+image';
|
|
2381
2855
|
|
|
@@ -2396,6 +2870,34 @@ export declare interface ResourceVolume {
|
|
|
2396
2870
|
[key: string]: unknown;
|
|
2397
2871
|
}
|
|
2398
2872
|
|
|
2873
|
+
export declare const ROLE_CLASS_ORDER: RoleClass[];
|
|
2874
|
+
|
|
2875
|
+
/**
|
|
2876
|
+
* 職任歸一。
|
|
2877
|
+
*
|
|
2878
|
+
* 生產倉全量 62,068 條人物—作品關聯裡出現了 **307 種不同寫法**:
|
|
2879
|
+
* 撰 51,247(82.6%)· 作 2,440 · 編 2,008 · 注 1,003 · 修 927 · 纂修 876 …
|
|
2880
|
+
* 長尾則是「等奉敕撰」「舊題撰」「集解」「校正並音釋」這類,
|
|
2881
|
+
* 還混著繁簡兩寫(輯/辑、註/注、刪/删、傳/传、贊/赞)與私用區壞字。
|
|
2882
|
+
*
|
|
2883
|
+
* 不歸一的話篩選 chips 會炸出上百個按鈕,且「撰」與「等奉敕撰」分屬兩組。
|
|
2884
|
+
* 這裡只歸「篩選用的粗類」,原始寫法仍原樣顯示在「職任」列裡——
|
|
2885
|
+
* 「等奉敕撰」與「撰」的區別對版本學是有意義的,不能真的抹掉。
|
|
2886
|
+
*/
|
|
2887
|
+
export declare type RoleClass = '撰' | '編' | '注' | '校' | '譯' | '繪' | '其他';
|
|
2888
|
+
|
|
2889
|
+
export declare interface RoleFacet {
|
|
2890
|
+
cls: RoleClass | '全部';
|
|
2891
|
+
label: string;
|
|
2892
|
+
count: number;
|
|
2893
|
+
}
|
|
2894
|
+
|
|
2895
|
+
/** 統計各粗類條數,供篩選 chips 用;空類不出現 */
|
|
2896
|
+
export declare function roleFacets(roles: (string | null | undefined)[]): RoleFacet[];
|
|
2897
|
+
|
|
2898
|
+
/** 行号:统一补零到两位 */
|
|
2899
|
+
export declare function rowNo(i: number): string;
|
|
2900
|
+
|
|
2399
2901
|
export declare const SearchInput: default_2.FC<SearchInputProps>;
|
|
2400
2902
|
|
|
2401
2903
|
export declare interface SearchInputProps {
|
|
@@ -2411,6 +2913,16 @@ export declare interface SearchInputProps {
|
|
|
2411
2913
|
|
|
2412
2914
|
export declare const Section: default_2.FC<SectionProps>;
|
|
2413
2915
|
|
|
2916
|
+
/** 区块头:徽章 + 标题 + 计数 | 右侧动作 */
|
|
2917
|
+
export declare function SectionHead({ glyph, tone, title, count, actions, id }: {
|
|
2918
|
+
glyph: string;
|
|
2919
|
+
tone?: 'accent' | 'ink';
|
|
2920
|
+
title: string;
|
|
2921
|
+
count?: default_2.ReactNode;
|
|
2922
|
+
actions?: default_2.ReactNode;
|
|
2923
|
+
id?: string;
|
|
2924
|
+
}): JSX.Element;
|
|
2925
|
+
|
|
2414
2926
|
declare interface SectionProps {
|
|
2415
2927
|
title: string;
|
|
2416
2928
|
/** 保存按钮回调 */
|
|
@@ -2482,9 +2994,73 @@ export declare interface SyncConfig {
|
|
|
2482
2994
|
|
|
2483
2995
|
declare type TabKey = 'recommend' | 'catalog' | 'collection' | 'site' | 'feedback';
|
|
2484
2996
|
|
|
2997
|
+
/** 表头。窄屏由 CSS 隐藏(meta 折到第二行后表头就没意义了)。 */
|
|
2998
|
+
export declare function TableHead({ spec }: {
|
|
2999
|
+
spec: TableSpec;
|
|
3000
|
+
}): JSX.Element;
|
|
3001
|
+
|
|
3002
|
+
/** 表格行:行号 + 主内容 + meta 组合列。宽度取自与表头同一份 spec。 */
|
|
3003
|
+
export declare function TableRow({ no, main, meta, spec }: {
|
|
3004
|
+
no: default_2.ReactNode;
|
|
3005
|
+
main: default_2.ReactNode;
|
|
3006
|
+
meta: default_2.ReactNode;
|
|
3007
|
+
spec: TableSpec;
|
|
3008
|
+
}): JSX.Element;
|
|
3009
|
+
|
|
3010
|
+
/**
|
|
3011
|
+
* 表格列规格。
|
|
3012
|
+
*
|
|
3013
|
+
* 表头与每一行必须用同一份宽度,否则列会错位。原先三张页面各自把
|
|
3014
|
+
* leadWidth / metaWidth / metaColumns 手抄进 TableHead 和 TableRow 两处
|
|
3015
|
+
* (作品页 22/424、丛编页 26/300、人物页 26/300),改一处忘一处就错位。
|
|
3016
|
+
* 现在一处声明、两处消费。
|
|
3017
|
+
*/
|
|
3018
|
+
export declare interface TableSpec {
|
|
3019
|
+
/** 行号列宽 */
|
|
3020
|
+
leadWidth: number;
|
|
3021
|
+
/** meta 区总宽 */
|
|
3022
|
+
metaWidth: number;
|
|
3023
|
+
/** meta 区各子列:表头文案 + 宽度 */
|
|
3024
|
+
columns: {
|
|
3025
|
+
label: string;
|
|
3026
|
+
width: string;
|
|
3027
|
+
}[];
|
|
3028
|
+
/** 主列表头文案 */
|
|
3029
|
+
mainLabel: string;
|
|
3030
|
+
}
|
|
3031
|
+
|
|
3032
|
+
/**
|
|
3033
|
+
* 标签 + chip 的一行(别名 / 附载篇目 / 附录)。
|
|
3034
|
+
* 作品页的 TagRows 与版本页的 AliasRow 原是同一段样式的两份拷贝。
|
|
3035
|
+
*/
|
|
3036
|
+
export declare function TagRow({ label, items }: {
|
|
3037
|
+
label: string;
|
|
3038
|
+
items: string[];
|
|
3039
|
+
}): JSX.Element | null;
|
|
3040
|
+
|
|
3041
|
+
/** 若干 TagRow 竖排 */
|
|
3042
|
+
export declare function TagRows({ rows }: {
|
|
3043
|
+
rows: {
|
|
3044
|
+
label: string;
|
|
3045
|
+
items: string[];
|
|
3046
|
+
}[];
|
|
3047
|
+
}): JSX.Element | null;
|
|
3048
|
+
|
|
3049
|
+
/** 文字按钮(排序切换等),带下划线 */
|
|
3050
|
+
export declare function TextButton({ label, onClick }: {
|
|
3051
|
+
label: string;
|
|
3052
|
+
onClick?: () => void;
|
|
3053
|
+
}): JSX.Element;
|
|
3054
|
+
|
|
2485
3055
|
/** 整理本文本质量等级 */
|
|
2486
3056
|
declare type TextQualityGrade = 'published' | 'fine' | 'rough' | 'ocr';
|
|
2487
3057
|
|
|
3058
|
+
/** 顶条:品牌/面包屑 | 右侧动作 */
|
|
3059
|
+
export declare function TopStrip({ breadcrumb, actions }: {
|
|
3060
|
+
breadcrumb: default_2.ReactNode;
|
|
3061
|
+
actions?: default_2.ReactNode;
|
|
3062
|
+
}): JSX.Element;
|
|
3063
|
+
|
|
2488
3064
|
export declare function useBidUrl(): BidUrlBuilder;
|
|
2489
3065
|
|
|
2490
3066
|
/**
|
|
@@ -2661,6 +3237,59 @@ export declare interface VersionLineageViewProps {
|
|
|
2661
3237
|
style?: default_2.CSSProperties;
|
|
2662
3238
|
}
|
|
2663
3239
|
|
|
3240
|
+
/**
|
|
3241
|
+
* 版本分组:核心集直接展开,其余按 group 折叠。
|
|
3242
|
+
* (从 IndexDetail.computeVersionPartition 迁入,逻辑不变)
|
|
3243
|
+
*/
|
|
3244
|
+
export declare interface VersionPartition {
|
|
3245
|
+
useGrouping: boolean;
|
|
3246
|
+
coreIds: string[];
|
|
3247
|
+
groupedIds: {
|
|
3248
|
+
id: string;
|
|
3249
|
+
label: string;
|
|
3250
|
+
description?: string;
|
|
3251
|
+
ids: string[];
|
|
3252
|
+
}[];
|
|
3253
|
+
}
|
|
3254
|
+
|
|
3255
|
+
export declare interface VersionRow {
|
|
3256
|
+
id: string;
|
|
3257
|
+
/** 显示名:edition 优先(96.4% 有),回退 title */
|
|
3258
|
+
name: string;
|
|
3259
|
+
era: DerivedEra;
|
|
3260
|
+
year?: number;
|
|
3261
|
+
/** 影印图源(types 含 image 的资源) */
|
|
3262
|
+
images: ResourceEntry[];
|
|
3263
|
+
/** 收藏机构(types 含 physical 的资源 + current_location) */
|
|
3264
|
+
holders: ResourceEntry[];
|
|
3265
|
+
/** current_location.name —— 没有 physical 资源时的回退 */
|
|
3266
|
+
locationName?: string;
|
|
3267
|
+
/** 是否重点版本(在 version_graph 核心集内) */
|
|
3268
|
+
important: boolean;
|
|
3269
|
+
/** 所属分组 id(version_graph.node_groups) */
|
|
3270
|
+
group?: string;
|
|
3271
|
+
hasImage: boolean;
|
|
3272
|
+
}
|
|
3273
|
+
|
|
3274
|
+
export declare interface VersionTable {
|
|
3275
|
+
rows: VersionRow[];
|
|
3276
|
+
/** 全部行(未筛选),用于计数 */
|
|
3277
|
+
allRows: VersionRow[];
|
|
3278
|
+
/** 可用的朝代筛选项(按历史顺序) */
|
|
3279
|
+
eras: string[];
|
|
3280
|
+
/** 是否有任何一行的年代是推断出来的(UI 据此显示说明) */
|
|
3281
|
+
hasInferredEra: boolean;
|
|
3282
|
+
}
|
|
3283
|
+
|
|
3284
|
+
export declare interface VersionTableOptions {
|
|
3285
|
+
/** 朝代筛选,空串或 undefined = 全部 */
|
|
3286
|
+
era?: string;
|
|
3287
|
+
/** 仅看有影印 */
|
|
3288
|
+
scanOnly?: boolean;
|
|
3289
|
+
/** 排序:default = 录入序(人工排的重要程度);year = 年代先后 */
|
|
3290
|
+
sort?: 'default' | 'year';
|
|
3291
|
+
}
|
|
3292
|
+
|
|
2664
3293
|
/** 丛编目录中的书目条目(统一格式,归一化后) */
|
|
2665
3294
|
export declare interface VolumeBookEntry {
|
|
2666
3295
|
title: string;
|
|
@@ -2701,6 +3330,13 @@ export declare interface VolumeBookStats {
|
|
|
2701
3330
|
total_found_volumes?: number;
|
|
2702
3331
|
}
|
|
2703
3332
|
|
|
3333
|
+
/** 册次方块(版本页「收入叢編」的 321…343) */
|
|
3334
|
+
export declare function VolumeChips({ volumes, unit, max }: {
|
|
3335
|
+
volumes: number[];
|
|
3336
|
+
unit?: string;
|
|
3337
|
+
max?: number;
|
|
3338
|
+
}): JSX.Element | null;
|
|
3339
|
+
|
|
2704
3340
|
/** 册级详细信息(来源 URL、状态等) */
|
|
2705
3341
|
export declare interface VolumeDetail {
|
|
2706
3342
|
volume: number;
|
|
@@ -2709,12 +3345,26 @@ export declare interface VolumeDetail {
|
|
|
2709
3345
|
file?: string;
|
|
2710
3346
|
}
|
|
2711
3347
|
|
|
3348
|
+
/** 分册链接网格:缺册划线,无链接的册号显示为灰字 */
|
|
3349
|
+
export declare function VolumeLinks({ item }: {
|
|
3350
|
+
item: ResourceEntry;
|
|
3351
|
+
}): JSX.Element;
|
|
3352
|
+
|
|
2712
3353
|
/** 丛编分部 */
|
|
2713
3354
|
export declare interface VolumeSection {
|
|
2714
3355
|
name: string;
|
|
2715
3356
|
volume_range: [number, number];
|
|
2716
3357
|
}
|
|
2717
3358
|
|
|
3359
|
+
/** 分册统计(按册号去重——同一册可在多个 group 中出现,如跨 Work 共册) */
|
|
3360
|
+
export declare interface VolumeStats {
|
|
3361
|
+
found: number;
|
|
3362
|
+
missing: number;
|
|
3363
|
+
expected: number;
|
|
3364
|
+
}
|
|
3365
|
+
|
|
3366
|
+
export declare function volumeStats(item: ResourceEntry): VolumeStats | null;
|
|
3367
|
+
|
|
2718
3368
|
export declare const WorkCatalog: default_2.FC<WorkCatalogProps>;
|
|
2719
3369
|
|
|
2720
3370
|
export declare interface WorkCatalogProps {
|
|
@@ -2746,4 +3396,15 @@ export declare interface WorkDetailData extends BaseDetailData {
|
|
|
2746
3396
|
version_graph?: VersionGraph;
|
|
2747
3397
|
}
|
|
2748
3398
|
|
|
3399
|
+
export declare const WorkPage: default_2.FC<WorkPageProps>;
|
|
3400
|
+
|
|
3401
|
+
export declare interface WorkPageProps {
|
|
3402
|
+
data: WorkDetailData;
|
|
3403
|
+
transport?: IndexStorage;
|
|
3404
|
+
onNavigate?: (id: string) => void;
|
|
3405
|
+
renderLink?: RenderLink;
|
|
3406
|
+
/** 版本传承入口(由 layout 注入,渲染在版本区块头右侧) */
|
|
3407
|
+
lineageAction?: default_2.ReactNode;
|
|
3408
|
+
}
|
|
3409
|
+
|
|
2749
3410
|
export { }
|