@wordinweb/agent 0.2.5 → 0.2.6

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.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../core/src/render/wmf.ts"],"sourcesContent":["import * as WmfModule from \"wmf\";\n\nconst WMF = (WmfModule.default ?? WmfModule) as typeof WmfModule.default;\n\nconst META_EOF = 0x0000;\nconst META_SETBKCOLOR = 0x0201;\nconst META_SETTEXTALIGN = 0x012e;\nconst META_MOVETO = 0x0214;\nconst META_LINETO = 0x0213;\nconst META_POLYLINE = 0x0325;\nconst META_ESCAPE = 0x0626;\nconst META_EXTTEXTOUT = 0x0a32;\nconst PLACEABLE_KEY = 0x9ac6cdd7;\n\nconst SYMBOL_TEXT: Record<string, string> = {\n p: \"π\",\n \"¥\": \"∞\",\n \"¶\": \"∂\",\n å: \"∑\",\n D: \"Δ\",\n};\n\nexport function decodeWmfText(text: string, family: string): { text: string; family: string } {\n if (family === \"Symbol\") {\n return { text: [...text].map((char) => SYMBOL_TEXT[char] ?? char).join(\"\"), family };\n }\n if (family === \"ËÎÌå\") {\n return { text: text.replace(/£¨/g, \"(\").replace(/£©/g, \")\"), family: \"SimSun\" };\n }\n return { text, family };\n}\n\nfunction record(fn: number, params: Uint8Array): Uint8Array {\n const length = 6 + params.length + (params.length & 1);\n const out = new Uint8Array(length);\n const view = new DataView(out.buffer);\n view.setUint32(0, length / 2, true);\n view.setUint16(4, fn, true);\n out.set(params, 6);\n return out;\n}\n\nfunction polyline(from: [number, number], to: [number, number]): Uint8Array {\n const params = new Uint8Array(10);\n const view = new DataView(params.buffer);\n view.setUint16(0, 2, true);\n view.setInt16(2, from[0], true);\n view.setInt16(4, from[1], true);\n view.setInt16(6, to[0], true);\n view.setInt16(8, to[1], true);\n return record(META_POLYLINE, params);\n}\n\nfunction textRecord(char: number, x: number, y: number, advance: number): Uint8Array {\n const params = new Uint8Array(12);\n const view = new DataView(params.buffer);\n view.setInt16(0, y, true);\n view.setInt16(2, x, true);\n view.setUint16(4, 1, true);\n params[8] = char;\n view.setInt16(10, advance, true);\n return record(META_EXTTEXTOUT, params);\n}\n\nfunction isMathTypeEscape(bytes: Uint8Array, offset: number, length: number): boolean {\n if (length < 18) return false;\n const name = [0x4d, 0x61, 0x74, 0x68, 0x54, 0x79, 0x70, 0x65];\n return name.every((value, i) => bytes[offset + 10 + i] === value);\n}\n\nfunction hasMathTypeEscapes(bytes: Uint8Array): boolean {\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n let offset = 18;\n while (offset + 6 <= bytes.length) {\n const length = view.getUint32(offset, true) * 2;\n if (length < 6 || offset + length > bytes.length) return false;\n const fn = view.getUint16(offset + 4, true);\n if (fn === META_ESCAPE && isMathTypeEscape(bytes, offset, length)) return true;\n offset += length;\n if (fn === META_EOF) break;\n }\n return false;\n}\n\n/**\n * Make MathType's legacy WMF records consumable by the small `wmf` renderer.\n * MathType positions text through TA_UPDATECP + MOVETO and draws fraction bars\n * with LINETO. The dependency does not implement those records, so translate\n * them to the equivalent absolute EXTTEXTOUT and POLYLINE records first.\n */\nexport function prepareWmf(input: Uint8Array): Uint8Array | null {\n let bytes = input;\n if (bytes.length >= 22 && new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength).getUint32(0, true) === PLACEABLE_KEY) {\n bytes = bytes.subarray(22);\n }\n if (bytes.length < 18) return null;\n\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const mathType = hasMathTypeEscapes(bytes);\n const parts: Uint8Array[] = [bytes.slice(0, 18)];\n let offset = 18;\n let textAlign = 0;\n let current: [number, number] = [0, 0];\n let maxRecordWords = 0;\n\n const append = (part: Uint8Array) => {\n parts.push(part);\n maxRecordWords = Math.max(maxRecordWords, part.length / 2);\n };\n\n while (offset + 6 <= bytes.length) {\n const length = view.getUint32(offset, true) * 2;\n if (length < 6 || offset + length > bytes.length) return null;\n const fn = view.getUint16(offset + 4, true);\n const params = offset + 6;\n\n if (fn === META_SETTEXTALIGN) {\n textAlign = view.getUint16(params, true);\n append(bytes.slice(offset, offset + length));\n } else if (fn === META_MOVETO) {\n current = [view.getInt16(params + 2, true), view.getInt16(params, true)];\n } else if (fn === META_LINETO) {\n const next: [number, number] = [view.getInt16(params + 2, true), view.getInt16(params, true)];\n append(polyline(current, next));\n current = next;\n } else if (fn === META_EXTTEXTOUT) {\n const y = view.getInt16(params, true);\n const x = view.getInt16(params + 2, true);\n const count = view.getUint16(params + 4, true);\n const options = view.getUint16(params + 6, true);\n let charsAt = params + 8 + (options & 6 ? 8 : 0);\n const advancesAt = charsAt + count + (count & 1);\n const hasAdvances = options === 0 && advancesAt + count * 2 <= offset + length;\n\n if (hasAdvances) {\n let position: [number, number] = textAlign & 1 ? current : [x, y];\n for (let i = 0; i < count; i++) {\n const advance = view.getInt16(advancesAt + i * 2, true);\n append(textRecord(bytes[charsAt + i], position[0], position[1], advance));\n position = [position[0] + advance, position[1]];\n }\n if (textAlign & 1) current = position;\n } else {\n const copy = bytes.slice(offset, offset + length);\n if (textAlign & 1) {\n const copyView = new DataView(copy.buffer, copy.byteOffset, copy.byteLength);\n copyView.setInt16(6, current[1], true);\n copyView.setInt16(8, current[0], true);\n }\n append(copy);\n }\n } else if (fn === META_ESCAPE && mathType) {\n // MathType metadata is not a drawing command. The dependency otherwise\n // mistakes it for an embedded EMF comment and rejects the whole image.\n } else if (fn !== META_SETBKCOLOR) {\n append(bytes.slice(offset, offset + length));\n }\n\n offset += length;\n if (fn === META_EOF) break;\n }\n\n const total = parts.reduce((sum, part) => sum + part.length, 0);\n const out = new Uint8Array(total);\n let at = 0;\n for (const part of parts) {\n out.set(part, at);\n at += part.length;\n }\n const outView = new DataView(out.buffer);\n outView.setUint32(6, total / 2, true);\n outView.setUint32(12, maxRecordWords, true);\n return out;\n}\n\nexport function renderWmf(bytes: Uint8Array, width: number, height: number): string | null {\n try {\n const prepared = prepareWmf(bytes);\n if (!prepared) return null;\n const [rawWidth, rawHeight] = WMF.image_size(prepared).map(Math.abs);\n if (!rawWidth || !rawHeight) return null;\n\n const scale = Math.max(1, window.devicePixelRatio || 1);\n const canvas = document.createElement(\"canvas\");\n canvas.width = Math.max(1, Math.round(width * scale));\n canvas.height = Math.max(1, Math.round(height * scale));\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return null;\n ctx.fillStyle = \"#fff\";\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n ctx.fillStyle = \"#000\";\n ctx.scale(canvas.width / rawWidth, canvas.height / rawHeight);\n\n const actions = WMF.get_actions(prepared);\n for (const action of actions) {\n if (!action.s) continue;\n delete action.s.Extent;\n if (action.t === \"text\" && action.v !== undefined && action.s.Font) {\n const decoded = decodeWmfText(action.v, action.s.Font.Name);\n action.v = decoded.text;\n action.s.Font.Name = decoded.family;\n }\n if (action.t === \"poly\") {\n action.s.Pen ??= { Style: 0, Width: 1, Color: 0 };\n action.s.Brush ??= { Style: 1, Color: 0 };\n }\n }\n WMF.render_canvas(actions, canvas);\n return canvas.toDataURL(\"image/png\");\n } catch {\n return null;\n }\n}\n"],"mappings":"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","names":[]}