@hamster-note/document-parser 0.2.0 → 0.3.0
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/index.d.ts +76 -3
- package/dist/index.js +78 -3
- package/dist/index.js.map +1 -1
- package/package.json +7 -4
- package/dist/Parser/index.d.ts +0 -19
- package/dist/Parser/index.d.ts.map +0 -1
- package/dist/Parser/index.js +0 -38
- package/dist/Parser/index.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/register/index.d.ts +0 -20
- package/dist/register/index.d.ts.map +0 -1
- package/dist/register/index.js +0 -48
- package/dist/register/index.js.map +0 -1
- package/dist/types/DocumentAnchor.d.ts +0 -11
- package/dist/types/DocumentAnchor.d.ts.map +0 -1
- package/dist/types/DocumentAnchor.js +0 -2
- package/dist/types/DocumentAnchor.js.map +0 -1
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,77 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { IntermediateDocument, IntermediateOutline, Number2 } from "@hamster-note/types";
|
|
2
|
+
|
|
3
|
+
//#region src/types/DocumentAnchor.d.ts
|
|
4
|
+
interface DocumentAnchorWithTextId {
|
|
5
|
+
pageId: string;
|
|
6
|
+
textId?: string;
|
|
7
|
+
}
|
|
8
|
+
interface DocumentAnchorWithPosition {
|
|
9
|
+
pageId: string;
|
|
10
|
+
position: Number2;
|
|
11
|
+
}
|
|
12
|
+
type DocumentAnchor = DocumentAnchorWithPosition | DocumentAnchorWithTextId;
|
|
13
|
+
//#endregion
|
|
14
|
+
//#region src/Parser/index.d.ts
|
|
15
|
+
type ParserInput = ArrayBuffer | ArrayBufferView | Blob;
|
|
16
|
+
declare abstract class DocumentParser {
|
|
17
|
+
static readonly exts: readonly string[];
|
|
18
|
+
/**
|
|
19
|
+
* 将原始输入解析为中间文档结构。
|
|
20
|
+
* - 输入必须是内存态数据(ArrayBuffer / ArrayBufferView / Blob)
|
|
21
|
+
* - 失败时抛出异常;不要返回 undefined。
|
|
22
|
+
*/
|
|
23
|
+
abstract encode(input: ParserInput): Promise<IntermediateDocument>;
|
|
24
|
+
/**
|
|
25
|
+
* 可选:从中间文档逆序列化回原始文件数据。
|
|
26
|
+
* 默认不支持,需要的子类自行实现。
|
|
27
|
+
*/
|
|
28
|
+
decode(_intermediateDocument: IntermediateDocument): Promise<ParserInput>;
|
|
29
|
+
protected static toArrayBuffer(input: ParserInput): Promise<ArrayBuffer>;
|
|
30
|
+
protected static toUint8Array(input: ParserInput): Promise<Uint8Array>;
|
|
31
|
+
}
|
|
32
|
+
//#endregion
|
|
33
|
+
//#region src/register/index.d.ts
|
|
34
|
+
interface DocumentParserConstructor<T extends DocumentParser = DocumentParser> {
|
|
35
|
+
new (): T;
|
|
36
|
+
readonly exts: readonly string[];
|
|
37
|
+
}
|
|
38
|
+
declare const registerParser: (Parser: DocumentParserConstructor) => void;
|
|
39
|
+
declare function unregisterParser(Parser: DocumentParserConstructor): void;
|
|
40
|
+
declare function getParserByExt(ext?: string): DocumentParserConstructor | undefined;
|
|
41
|
+
interface ParseOptions {
|
|
42
|
+
filename?: string;
|
|
43
|
+
ext?: string;
|
|
44
|
+
parser?: DocumentParserConstructor;
|
|
45
|
+
}
|
|
46
|
+
declare function parse(input: ParserInput, options?: ParseOptions): Promise<IntermediateDocument>;
|
|
47
|
+
declare function listRegisteredParsers(): {
|
|
48
|
+
ext: string;
|
|
49
|
+
parser: DocumentParserConstructor<DocumentParser>;
|
|
50
|
+
}[];
|
|
51
|
+
//#endregion
|
|
52
|
+
//#region src/Page/index.d.ts
|
|
53
|
+
declare enum RenderViews {
|
|
54
|
+
THUMBNAIL = "thumbnail",
|
|
55
|
+
TEXT = "text",
|
|
56
|
+
}
|
|
57
|
+
interface RenderOptions {
|
|
58
|
+
views: RenderViews[];
|
|
59
|
+
scale: number;
|
|
60
|
+
}
|
|
61
|
+
declare abstract class HamsterPage {
|
|
62
|
+
abstract render(container: HTMLDivElement, options?: RenderOptions): Promise<void>;
|
|
63
|
+
abstract getNumber(): number;
|
|
64
|
+
abstract getSize(scale: number): Number2;
|
|
65
|
+
abstract getPureText(): string;
|
|
66
|
+
}
|
|
67
|
+
//#endregion
|
|
68
|
+
//#region src/Document/index.d.ts
|
|
69
|
+
declare abstract class HamsterDocument {
|
|
70
|
+
abstract getPages(): Promise<HamsterPage[]>;
|
|
71
|
+
abstract getPage(pageNumber: number): Promise<HamsterPage | undefined>;
|
|
72
|
+
abstract getOutline(): Promise<IntermediateOutline | undefined>;
|
|
73
|
+
abstract getCover(): Promise<HTMLCanvasElement | HTMLImageElement>;
|
|
74
|
+
}
|
|
75
|
+
//#endregion
|
|
76
|
+
export { DocumentAnchor, DocumentAnchorWithPosition, DocumentAnchorWithTextId, DocumentParser, DocumentParserConstructor, HamsterDocument, HamsterPage, ParseOptions, ParserInput, RenderOptions, RenderViews, getParserByExt, listRegisteredParsers, parse, registerParser, unregisterParser };
|
|
4
77
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,79 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
//#region src/Parser/index.ts
|
|
2
|
+
var DocumentParser = class DocumentParser {
|
|
3
|
+
static exts = [];
|
|
4
|
+
/**
|
|
5
|
+
* 可选:从中间文档逆序列化回原始文件数据。
|
|
6
|
+
* 默认不支持,需要的子类自行实现。
|
|
7
|
+
*/
|
|
8
|
+
decode(_intermediateDocument) {
|
|
9
|
+
return Promise.reject(/* @__PURE__ */ new Error("decode is not implemented"));
|
|
10
|
+
}
|
|
11
|
+
static async toArrayBuffer(input) {
|
|
12
|
+
if (input instanceof ArrayBuffer) return input;
|
|
13
|
+
if (ArrayBuffer.isView(input)) {
|
|
14
|
+
const buffer = new ArrayBuffer(input.byteLength);
|
|
15
|
+
new Uint8Array(buffer).set(new Uint8Array(input.buffer, input.byteOffset, input.byteLength));
|
|
16
|
+
return buffer;
|
|
17
|
+
}
|
|
18
|
+
if (typeof Blob !== "undefined" && input instanceof Blob) return input.arrayBuffer();
|
|
19
|
+
throw new TypeError("Unsupported parser input");
|
|
20
|
+
}
|
|
21
|
+
static async toUint8Array(input) {
|
|
22
|
+
const buffer = await DocumentParser.toArrayBuffer(input);
|
|
23
|
+
return new Uint8Array(buffer);
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
//#endregion
|
|
28
|
+
//#region src/register/index.ts
|
|
29
|
+
const parserMap = /* @__PURE__ */ new Map();
|
|
30
|
+
const normalizeExt = (ext) => ext.replace(/^\./, "").toLowerCase();
|
|
31
|
+
const registerParser = (Parser) => {
|
|
32
|
+
if (!Array.isArray(Parser.exts) || Parser.exts.length === 0) throw new Error("Parser.exts 必须是非空数组");
|
|
33
|
+
Parser.exts.forEach((ext) => {
|
|
34
|
+
const key = normalizeExt(ext);
|
|
35
|
+
const exists = parserMap.get(key);
|
|
36
|
+
if (exists && exists !== Parser) throw new Error(`扩展名 ${key} 已被其他解析器占用`);
|
|
37
|
+
parserMap.set(key, Parser);
|
|
38
|
+
});
|
|
39
|
+
};
|
|
40
|
+
function unregisterParser(Parser) {
|
|
41
|
+
Parser.exts.forEach((ext) => {
|
|
42
|
+
const key = normalizeExt(ext);
|
|
43
|
+
if (parserMap.get(key) === Parser) parserMap.delete(key);
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
function getParserByExt(ext) {
|
|
47
|
+
if (!ext) return void 0;
|
|
48
|
+
return parserMap.get(normalizeExt(ext));
|
|
49
|
+
}
|
|
50
|
+
async function parse(input, options = {}) {
|
|
51
|
+
const extFromName = options.filename?.split(".").pop();
|
|
52
|
+
const ext = options.ext ?? extFromName;
|
|
53
|
+
const Parser = options.parser ?? getParserByExt(ext);
|
|
54
|
+
if (!Parser) throw new Error(`未找到匹配的解析器,扩展名: ${ext ?? "未知"},已注册: ${[...parserMap.keys()].join(", ")}`);
|
|
55
|
+
return new Parser().encode(input);
|
|
56
|
+
}
|
|
57
|
+
function listRegisteredParsers() {
|
|
58
|
+
return [...parserMap.entries()].map(([ext, ctor]) => ({
|
|
59
|
+
ext,
|
|
60
|
+
parser: ctor
|
|
61
|
+
}));
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
//#endregion
|
|
65
|
+
//#region src/Page/index.ts
|
|
66
|
+
let RenderViews = /* @__PURE__ */ function(RenderViews$1) {
|
|
67
|
+
RenderViews$1["THUMBNAIL"] = "thumbnail";
|
|
68
|
+
RenderViews$1["TEXT"] = "text";
|
|
69
|
+
return RenderViews$1;
|
|
70
|
+
}({});
|
|
71
|
+
var HamsterPage = class {};
|
|
72
|
+
|
|
73
|
+
//#endregion
|
|
74
|
+
//#region src/Document/index.ts
|
|
75
|
+
var HamsterDocument = class {};
|
|
76
|
+
|
|
77
|
+
//#endregion
|
|
78
|
+
export { DocumentParser, HamsterDocument, HamsterPage, RenderViews, getParserByExt, listRegisteredParsers, parse, registerParser, unregisterParser };
|
|
4
79
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/Parser/index.ts","../src/register/index.ts","../src/Page/index.ts","../src/Document/index.ts"],"sourcesContent":["import type { IntermediateDocument } from '@hamster-note/types'\n\n// 解析器通用输入,兼容 Browser / Worker / Node(Buffer 属于 ArrayBufferView)\nexport type ParserInput = ArrayBuffer | ArrayBufferView | Blob\n\nexport abstract class DocumentParser {\n // 子类必须声明支持的扩展名列表(不带点),用于注册分发\n static readonly exts: readonly string[] = []\n\n /**\n * 将原始输入解析为中间文档结构。\n * - 输入必须是内存态数据(ArrayBuffer / ArrayBufferView / Blob)\n * - 失败时抛出异常;不要返回 undefined。\n */\n abstract encode(input: ParserInput): Promise<IntermediateDocument>\n\n /**\n * 可选:从中间文档逆序列化回原始文件数据。\n * 默认不支持,需要的子类自行实现。\n */\n decode(_intermediateDocument: IntermediateDocument): Promise<ParserInput> {\n return Promise.reject(new Error('decode is not implemented'))\n }\n\n // 将各种输入转换为 ArrayBuffer,方便子类直接消费二进制\n protected static async toArrayBuffer(\n input: ParserInput\n ): Promise<ArrayBuffer> {\n if (input instanceof ArrayBuffer) {\n return input\n }\n if (ArrayBuffer.isView(input)) {\n // 拷贝为独立的 ArrayBuffer,避免 SharedArrayBuffer 兼容性问题\n const buffer = new ArrayBuffer(input.byteLength)\n new Uint8Array(buffer).set(\n new Uint8Array(input.buffer, input.byteOffset, input.byteLength)\n )\n return buffer\n }\n if (typeof Blob !== 'undefined' && input instanceof Blob) {\n return input.arrayBuffer()\n }\n throw new TypeError('Unsupported parser input')\n }\n\n // 子类若需要 Uint8Array,可直接复用\n protected static async toUint8Array(input: ParserInput): Promise<Uint8Array> {\n const buffer = await DocumentParser.toArrayBuffer(input)\n return new Uint8Array(buffer)\n }\n}\n","import type { DocumentParser, ParserInput } from '../Parser/index'\nimport type { IntermediateDocument } from '@hamster-note/types'\n\nexport interface DocumentParserConstructor<\n T extends DocumentParser = DocumentParser\n> {\n new (): T\n readonly exts: readonly string[]\n}\n\nconst parserMap: Map<string, DocumentParserConstructor> = new Map()\n\nconst normalizeExt = (ext: string) => ext.replace(/^\\./, '').toLowerCase()\n\n// 注册解析器:防止重复注册同扩展名的不同类\nexport const registerParser = (Parser: DocumentParserConstructor) => {\n if (!Array.isArray(Parser.exts) || Parser.exts.length === 0) {\n throw new Error('Parser.exts 必须是非空数组')\n }\n Parser.exts.forEach((ext) => {\n const key = normalizeExt(ext)\n const exists = parserMap.get(key)\n if (exists && exists !== Parser) {\n throw new Error(`扩展名 ${key} 已被其他解析器占用`)\n }\n parserMap.set(key, Parser)\n })\n}\n\nexport function unregisterParser(Parser: DocumentParserConstructor) {\n Parser.exts.forEach((ext) => {\n const key = normalizeExt(ext)\n const exists = parserMap.get(key)\n if (exists === Parser) {\n parserMap.delete(key)\n }\n })\n}\n\nexport function getParserByExt(\n ext?: string\n): DocumentParserConstructor | undefined {\n if (!ext) return undefined\n return parserMap.get(normalizeExt(ext))\n}\n\nexport interface ParseOptions {\n filename?: string\n ext?: string\n parser?: DocumentParserConstructor\n}\n\nexport async function parse(\n input: ParserInput,\n options: ParseOptions = {}\n): Promise<IntermediateDocument> {\n const extFromName = options.filename?.split('.').pop()\n const ext = options.ext ?? extFromName\n const Parser = options.parser ?? getParserByExt(ext)\n\n if (!Parser) {\n throw new Error(\n `未找到匹配的解析器,扩展名: ${ext ?? '未知'},已注册: ${[\n ...parserMap.keys()\n ].join(', ')}`\n )\n }\n\n const parser = new Parser()\n return parser.encode(input)\n}\n\n// 便于测试或运行时可观测性\nexport function listRegisteredParsers() {\n return [...parserMap.entries()].map(([ext, ctor]) => ({ ext, parser: ctor }))\n}\n","import { Number2 } from '@hamster-note/types'\n\nexport enum RenderViews {\n THUMBNAIL = 'thumbnail',\n TEXT = 'text'\n}\n\nexport interface RenderOptions {\n views: RenderViews[]\n scale: number\n}\n\nexport abstract class HamsterPage {\n abstract render(\n container: HTMLDivElement,\n options?: RenderOptions\n ): Promise<void>\n abstract getNumber(): number\n abstract getSize(scale: number): Number2\n abstract getPureText(): string\n}\n","import { HamsterPage } from '../Page'\nimport { IntermediateOutline } from '@hamster-note/types'\n\nexport abstract class HamsterDocument {\n abstract getPages(): Promise<HamsterPage[]>\n abstract getPage(pageNumber: number): Promise<HamsterPage | undefined>\n abstract getOutline(): Promise<IntermediateOutline | undefined>\n abstract getCover(): Promise<HTMLCanvasElement | HTMLImageElement>\n}\n"],"mappings":";AAKA,IAAsB,iBAAtB,MAAsB,eAAe;CAEnC,OAAgB,OAA0B,EAAE;;;;;CAa5C,OAAO,uBAAmE;AACxE,SAAO,QAAQ,uBAAO,IAAI,MAAM,4BAA4B,CAAC;;CAI/D,aAAuB,cACrB,OACsB;AACtB,MAAI,iBAAiB,YACnB,QAAO;AAET,MAAI,YAAY,OAAO,MAAM,EAAE;GAE7B,MAAM,SAAS,IAAI,YAAY,MAAM,WAAW;AAChD,OAAI,WAAW,OAAO,CAAC,IACrB,IAAI,WAAW,MAAM,QAAQ,MAAM,YAAY,MAAM,WAAW,CACjE;AACD,UAAO;;AAET,MAAI,OAAO,SAAS,eAAe,iBAAiB,KAClD,QAAO,MAAM,aAAa;AAE5B,QAAM,IAAI,UAAU,2BAA2B;;CAIjD,aAAuB,aAAa,OAAyC;EAC3E,MAAM,SAAS,MAAM,eAAe,cAAc,MAAM;AACxD,SAAO,IAAI,WAAW,OAAO;;;;;;ACtCjC,MAAM,4BAAoD,IAAI,KAAK;AAEnE,MAAM,gBAAgB,QAAgB,IAAI,QAAQ,OAAO,GAAG,CAAC,aAAa;AAG1E,MAAa,kBAAkB,WAAsC;AACnE,KAAI,CAAC,MAAM,QAAQ,OAAO,KAAK,IAAI,OAAO,KAAK,WAAW,EACxD,OAAM,IAAI,MAAM,sBAAsB;AAExC,QAAO,KAAK,SAAS,QAAQ;EAC3B,MAAM,MAAM,aAAa,IAAI;EAC7B,MAAM,SAAS,UAAU,IAAI,IAAI;AACjC,MAAI,UAAU,WAAW,OACvB,OAAM,IAAI,MAAM,OAAO,IAAI,YAAY;AAEzC,YAAU,IAAI,KAAK,OAAO;GAC1B;;AAGJ,SAAgB,iBAAiB,QAAmC;AAClE,QAAO,KAAK,SAAS,QAAQ;EAC3B,MAAM,MAAM,aAAa,IAAI;AAE7B,MADe,UAAU,IAAI,IAAI,KAClB,OACb,WAAU,OAAO,IAAI;GAEvB;;AAGJ,SAAgB,eACd,KACuC;AACvC,KAAI,CAAC,IAAK,QAAO;AACjB,QAAO,UAAU,IAAI,aAAa,IAAI,CAAC;;AASzC,eAAsB,MACpB,OACA,UAAwB,EAAE,EACK;CAC/B,MAAM,cAAc,QAAQ,UAAU,MAAM,IAAI,CAAC,KAAK;CACtD,MAAM,MAAM,QAAQ,OAAO;CAC3B,MAAM,SAAS,QAAQ,UAAU,eAAe,IAAI;AAEpD,KAAI,CAAC,OACH,OAAM,IAAI,MACR,kBAAkB,OAAO,KAAK,QAAQ,CACpC,GAAG,UAAU,MAAM,CACpB,CAAC,KAAK,KAAK,GACb;AAIH,QADe,IAAI,QAAQ,CACb,OAAO,MAAM;;AAI7B,SAAgB,wBAAwB;AACtC,QAAO,CAAC,GAAG,UAAU,SAAS,CAAC,CAAC,KAAK,CAAC,KAAK,WAAW;EAAE;EAAK,QAAQ;EAAM,EAAE;;;;;ACxE/E,IAAY,sDAAL;AACL;AACA;;;AAQF,IAAsB,cAAtB,MAAkC;;;;ACTlC,IAAsB,kBAAtB,MAAsC"}
|
package/package.json
CHANGED
|
@@ -1,17 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hamster-note/document-parser",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "",
|
|
5
5
|
"scripts": {
|
|
6
|
-
"build:all": "
|
|
6
|
+
"build:all": "rolldown --config rolldown.config.ts",
|
|
7
7
|
"prepublishOnly": "yarn build:all",
|
|
8
|
-
"test": "echo 'no-test'"
|
|
8
|
+
"test": "echo 'no-test'",
|
|
9
|
+
"lint": "echo 'no-lint'"
|
|
9
10
|
},
|
|
10
11
|
"dependencies": {
|
|
11
|
-
"@hamster-note/types": "^0.
|
|
12
|
+
"@hamster-note/types": "^0.5.1"
|
|
12
13
|
},
|
|
13
14
|
"devDependencies": {
|
|
14
15
|
"@eslint/js": "^9.39.2",
|
|
16
|
+
"rolldown": "^1.0.0-beta.58",
|
|
17
|
+
"rolldown-plugin-dts": "^0.20.0",
|
|
15
18
|
"@system-ui-js/development-base": "^0.1.2",
|
|
16
19
|
"@typescript-eslint/eslint-plugin": "^8.50.0",
|
|
17
20
|
"@typescript-eslint/parser": "^8.50.0",
|
package/dist/Parser/index.d.ts
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import type { IntermediateDocument } from '@hamster-note/types';
|
|
2
|
-
export type ParserInput = ArrayBuffer | ArrayBufferView | Blob;
|
|
3
|
-
export declare abstract class DocumentParser {
|
|
4
|
-
static readonly exts: readonly string[];
|
|
5
|
-
/**
|
|
6
|
-
* 将原始输入解析为中间文档结构。
|
|
7
|
-
* - 输入必须是内存态数据(ArrayBuffer / ArrayBufferView / Blob)
|
|
8
|
-
* - 失败时抛出异常;不要返回 undefined。
|
|
9
|
-
*/
|
|
10
|
-
abstract encode(input: ParserInput): Promise<IntermediateDocument>;
|
|
11
|
-
/**
|
|
12
|
-
* 可选:从中间文档逆序列化回原始文件数据。
|
|
13
|
-
* 默认不支持,需要的子类自行实现。
|
|
14
|
-
*/
|
|
15
|
-
decode(_intermediateDocument: IntermediateDocument): Promise<ParserInput>;
|
|
16
|
-
protected static toArrayBuffer(input: ParserInput): Promise<ArrayBuffer>;
|
|
17
|
-
protected static toUint8Array(input: ParserInput): Promise<Uint8Array>;
|
|
18
|
-
}
|
|
19
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Parser/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAG/D,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,eAAe,GAAG,IAAI,CAAA;AAE9D,8BAAsB,cAAc;IAElC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAK;IAE5C;;;;OAIG;IACH,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAElE;;;OAGG;IACH,MAAM,CAAC,qBAAqB,EAAE,oBAAoB,GAAG,OAAO,CAAC,WAAW,CAAC;qBAKlD,aAAa,CAClC,KAAK,EAAE,WAAW,GACjB,OAAO,CAAC,WAAW,CAAC;qBAmBA,YAAY,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;CAI7E"}
|
package/dist/Parser/index.js
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
export class DocumentParser {
|
|
2
|
-
/**
|
|
3
|
-
* 可选:从中间文档逆序列化回原始文件数据。
|
|
4
|
-
* 默认不支持,需要的子类自行实现。
|
|
5
|
-
*/
|
|
6
|
-
decode(_intermediateDocument) {
|
|
7
|
-
return Promise.reject(new Error('decode is not implemented'));
|
|
8
|
-
}
|
|
9
|
-
// 将各种输入转换为 ArrayBuffer,方便子类直接消费二进制
|
|
10
|
-
static async toArrayBuffer(input) {
|
|
11
|
-
if (input instanceof ArrayBuffer) {
|
|
12
|
-
return input;
|
|
13
|
-
}
|
|
14
|
-
if (ArrayBuffer.isView(input)) {
|
|
15
|
-
// 拷贝为独立的 ArrayBuffer,避免 SharedArrayBuffer 兼容性问题
|
|
16
|
-
const buffer = new ArrayBuffer(input.byteLength);
|
|
17
|
-
new Uint8Array(buffer).set(new Uint8Array(input.buffer, input.byteOffset, input.byteLength));
|
|
18
|
-
return buffer;
|
|
19
|
-
}
|
|
20
|
-
if (typeof Blob !== 'undefined' && input instanceof Blob) {
|
|
21
|
-
return input.arrayBuffer();
|
|
22
|
-
}
|
|
23
|
-
throw new TypeError('Unsupported parser input');
|
|
24
|
-
}
|
|
25
|
-
// 子类若需要 Uint8Array,可直接复用
|
|
26
|
-
static async toUint8Array(input) {
|
|
27
|
-
const buffer = await DocumentParser.toArrayBuffer(input);
|
|
28
|
-
return new Uint8Array(buffer);
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
// 子类必须声明支持的扩展名列表(不带点),用于注册分发
|
|
32
|
-
Object.defineProperty(DocumentParser, "exts", {
|
|
33
|
-
enumerable: true,
|
|
34
|
-
configurable: true,
|
|
35
|
-
writable: true,
|
|
36
|
-
value: []
|
|
37
|
-
});
|
|
38
|
-
//# sourceMappingURL=index.js.map
|
package/dist/Parser/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/Parser/index.ts"],"names":[],"mappings":"AAKA,MAAM,OAAgB,cAAc;IAWlC;;;OAGG;IACH,MAAM,CAAC,qBAA2C;QAChD,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC,CAAA;IAC/D,CAAC;IAED,mCAAmC;IACzB,MAAM,CAAC,KAAK,CAAC,aAAa,CAClC,KAAkB;QAElB,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;YACjC,OAAO,KAAK,CAAA;QACd,CAAC;QACD,IAAI,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,gDAAgD;YAChD,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;YAChD,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,CACxB,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,CACjE,CAAA;YACD,OAAO,MAAM,CAAA;QACf,CAAC;QACD,IAAI,OAAO,IAAI,KAAK,WAAW,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;YACzD,OAAO,KAAK,CAAC,WAAW,EAAE,CAAA;QAC5B,CAAC;QACD,MAAM,IAAI,SAAS,CAAC,0BAA0B,CAAC,CAAA;IACjD,CAAC;IAED,yBAAyB;IACf,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,KAAkB;QACpD,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;QACxD,OAAO,IAAI,UAAU,CAAC,MAAM,CAAC,CAAA;IAC/B,CAAC;;AA3CD,6BAA6B;AACb;;;;WAA0B,EAAE;GAAA"}
|
package/dist/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAA;AACtC,cAAc,UAAU,CAAA;AACxB,cAAc,YAAY,CAAA"}
|
package/dist/register/index.d.ts
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import type { DocumentParser, ParserInput } from '../Parser';
|
|
2
|
-
import type { IntermediateDocument } from '@hamster-note/types';
|
|
3
|
-
export interface DocumentParserConstructor<T extends DocumentParser = DocumentParser> {
|
|
4
|
-
new (): T;
|
|
5
|
-
readonly exts: readonly string[];
|
|
6
|
-
}
|
|
7
|
-
export declare const registerParser: (Parser: DocumentParserConstructor) => void;
|
|
8
|
-
export declare function unregisterParser(Parser: DocumentParserConstructor): void;
|
|
9
|
-
export declare function getParserByExt(ext?: string): DocumentParserConstructor | undefined;
|
|
10
|
-
export interface ParseOptions {
|
|
11
|
-
filename?: string;
|
|
12
|
-
ext?: string;
|
|
13
|
-
parser?: DocumentParserConstructor;
|
|
14
|
-
}
|
|
15
|
-
export declare function parse(input: ParserInput, options?: ParseOptions): Promise<IntermediateDocument>;
|
|
16
|
-
export declare function listRegisteredParsers(): {
|
|
17
|
-
ext: string;
|
|
18
|
-
parser: DocumentParserConstructor<DocumentParser>;
|
|
19
|
-
}[];
|
|
20
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/register/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAC5D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAE/D,MAAM,WAAW,yBAAyB,CACxC,CAAC,SAAS,cAAc,GAAG,cAAc;IAEzC,QAAQ,CAAC,CAAA;IACT,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAA;CACjC;AAOD,eAAO,MAAM,cAAc,GAAI,QAAQ,yBAAyB,SAY/D,CAAA;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,yBAAyB,QAQjE;AAED,wBAAgB,cAAc,CAC5B,GAAG,CAAC,EAAE,MAAM,GACX,yBAAyB,GAAG,SAAS,CAGvC;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,yBAAyB,CAAA;CACnC;AAED,wBAAsB,KAAK,CACzB,KAAK,EAAE,WAAW,EAClB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,oBAAoB,CAAC,CAe/B;AAGD,wBAAgB,qBAAqB;;;IAEpC"}
|
package/dist/register/index.js
DELETED
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
const parserMap = new Map();
|
|
2
|
-
const normalizeExt = (ext) => ext.replace(/^\./, '').toLowerCase();
|
|
3
|
-
// 注册解析器:防止重复注册同扩展名的不同类
|
|
4
|
-
export const registerParser = (Parser) => {
|
|
5
|
-
if (!Array.isArray(Parser.exts) || Parser.exts.length === 0) {
|
|
6
|
-
throw new Error('Parser.exts 必须是非空数组');
|
|
7
|
-
}
|
|
8
|
-
Parser.exts.forEach((ext) => {
|
|
9
|
-
const key = normalizeExt(ext);
|
|
10
|
-
const exists = parserMap.get(key);
|
|
11
|
-
if (exists && exists !== Parser) {
|
|
12
|
-
throw new Error(`扩展名 ${key} 已被其他解析器占用`);
|
|
13
|
-
}
|
|
14
|
-
parserMap.set(key, Parser);
|
|
15
|
-
});
|
|
16
|
-
};
|
|
17
|
-
export function unregisterParser(Parser) {
|
|
18
|
-
Parser.exts.forEach((ext) => {
|
|
19
|
-
const key = normalizeExt(ext);
|
|
20
|
-
const exists = parserMap.get(key);
|
|
21
|
-
if (exists === Parser) {
|
|
22
|
-
parserMap.delete(key);
|
|
23
|
-
}
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
export function getParserByExt(ext) {
|
|
27
|
-
if (!ext)
|
|
28
|
-
return undefined;
|
|
29
|
-
return parserMap.get(normalizeExt(ext));
|
|
30
|
-
}
|
|
31
|
-
export async function parse(input, options = {}) {
|
|
32
|
-
var _a, _b, _c;
|
|
33
|
-
const extFromName = (_a = options.filename) === null || _a === void 0 ? void 0 : _a.split('.').pop();
|
|
34
|
-
const ext = (_b = options.ext) !== null && _b !== void 0 ? _b : extFromName;
|
|
35
|
-
const Parser = (_c = options.parser) !== null && _c !== void 0 ? _c : getParserByExt(ext);
|
|
36
|
-
if (!Parser) {
|
|
37
|
-
throw new Error(`未找到匹配的解析器,扩展名: ${ext !== null && ext !== void 0 ? ext : '未知'},已注册: ${[
|
|
38
|
-
...parserMap.keys()
|
|
39
|
-
].join(', ')}`);
|
|
40
|
-
}
|
|
41
|
-
const parser = new Parser();
|
|
42
|
-
return parser.encode(input);
|
|
43
|
-
}
|
|
44
|
-
// 便于测试或运行时可观测性
|
|
45
|
-
export function listRegisteredParsers() {
|
|
46
|
-
return [...parserMap.entries()].map(([ext, ctor]) => ({ ext, parser: ctor }));
|
|
47
|
-
}
|
|
48
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/register/index.ts"],"names":[],"mappings":"AAUA,MAAM,SAAS,GAA2C,IAAI,GAAG,EAAE,CAAA;AAEnE,MAAM,YAAY,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA;AAE1E,uBAAuB;AACvB,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,MAAiC,EAAE,EAAE;IAClE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5D,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAA;IACxC,CAAC;IACD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QAC1B,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,CAAA;QAC7B,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACjC,IAAI,MAAM,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,OAAO,GAAG,YAAY,CAAC,CAAA;QACzC,CAAC;QACD,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;IAC5B,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAiC;IAChE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QAC1B,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,CAAA;QAC7B,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACjC,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACtB,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QACvB,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,GAAY;IAEZ,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAA;IAC1B,OAAO,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAA;AACzC,CAAC;AAQD,MAAM,CAAC,KAAK,UAAU,KAAK,CACzB,KAAkB,EAClB,UAAwB,EAAE;;IAE1B,MAAM,WAAW,GAAG,MAAA,OAAO,CAAC,QAAQ,0CAAE,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,CAAA;IACtD,MAAM,GAAG,GAAG,MAAA,OAAO,CAAC,GAAG,mCAAI,WAAW,CAAA;IACtC,MAAM,MAAM,GAAG,MAAA,OAAO,CAAC,MAAM,mCAAI,cAAc,CAAC,GAAG,CAAC,CAAA;IAEpD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,kBAAkB,GAAG,aAAH,GAAG,cAAH,GAAG,GAAI,IAAI,SAAS;YACpC,GAAG,SAAS,CAAC,IAAI,EAAE;SACpB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACf,CAAA;IACH,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,MAAM,EAAE,CAAA;IAC3B,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AAC7B,CAAC;AAED,eAAe;AACf,MAAM,UAAU,qBAAqB;IACnC,OAAO,CAAC,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;AAC/E,CAAC"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { Number2 } from '@hamster-note/types';
|
|
2
|
-
export interface DocumentAnchorWithTextId {
|
|
3
|
-
pageId: string;
|
|
4
|
-
textId?: string;
|
|
5
|
-
}
|
|
6
|
-
export interface DocumentAnchorWithPosition {
|
|
7
|
-
pageId: string;
|
|
8
|
-
position: Number2;
|
|
9
|
-
}
|
|
10
|
-
export type DocumentAnchor = DocumentAnchorWithPosition | DocumentAnchorWithTextId;
|
|
11
|
-
//# sourceMappingURL=DocumentAnchor.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DocumentAnchor.d.ts","sourceRoot":"","sources":["../../src/types/DocumentAnchor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAE7C,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAGD,MAAM,WAAW,0BAA0B;IACzC,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,MAAM,cAAc,GACtB,0BAA0B,GAC1B,wBAAwB,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DocumentAnchor.js","sourceRoot":"","sources":["../../src/types/DocumentAnchor.ts"],"names":[],"mappings":""}
|