UNPKG

@xwordly/xword-parser

Version:

Fast, type-safe TypeScript library for parsing crossword puzzles (PUZ, iPUZ, JPZ, XD)

1 lines 28.9 kB
{"version":3,"sources":["../src/jpz.ts"],"names":[],"mappings":"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","file":"chunk-KP7U2ZYG.mjs","sourcesContent":["/**\n * Parser for JPZ crossword format (Crossword Compiler)\n * JPZ is an XML-based format\n */\n\nimport { XMLParser } from 'fast-xml-parser';\nimport { UnsupportedPuzzleTypeError, JpzParseError } from './errors';\nimport type { Puzzle, Grid, Cell as UnifiedCell, Clues, ParseOptions } from './types';\nimport { ErrorCode } from './types';\nimport { MAX_GRID_WIDTH, MAX_GRID_HEIGHT } from './constants';\n\n// Type definitions for XML parser output\ninterface JpzXmlNode {\n [key: string]: unknown;\n '@_width'?: string;\n '@_height'?: string;\n '@_x'?: string;\n '@_y'?: string;\n '@_type'?: string;\n '@_solution'?: string;\n '@_letter'?: string;\n '@_number'?: string;\n '@_background-shape'?: string;\n '@_background-color'?: string;\n '@_top-bar'?: string;\n '@_bottom-bar'?: string;\n '@_left-bar'?: string;\n '@_right-bar'?: string;\n '@_title'?: string;\n '@_format'?: string;\n '@_text'?: string;\n '@_word'?: string;\n '@_id'?: string;\n '#text'?: string;\n cell?: JpzXmlNode | JpzXmlNode[];\n cells?: { cell?: JpzXmlNode | JpzXmlNode[] };\n title?: string | { b?: string; '#text'?: string };\n creator?: string;\n author?: string;\n copyright?: string;\n description?: string;\n publisher?: string;\n identifier?: string;\n clue?: JpzXmlNode | JpzXmlNode[];\n text?: string;\n number?: string;\n word?: JpzXmlNode | JpzXmlNode[];\n // Additional properties found in parsing\n 'rectangular-puzzle'?: JpzXmlNode;\n puzzle?: JpzXmlNode;\n crossword?: JpzXmlNode;\n coded?: unknown;\n sudoku?: unknown;\n kakuro?: unknown;\n 'word-search'?: unknown;\n wordsearch?: unknown;\n metadata?: JpzXmlNode;\n grid?: JpzXmlNode;\n Grid?: JpzXmlNode;\n clues?: JpzXmlNode | JpzXmlNode[];\n Clues?: JpzXmlNode | JpzXmlNode[];\n words?: JpzXmlNode;\n Words?: JpzXmlNode;\n}\n\ninterface JpzXmlRoot {\n 'crossword-compiler-applet'?: JpzXmlNode;\n 'crossword-compiler'?: JpzXmlNode;\n puzzle?: JpzXmlNode;\n crossword?: JpzXmlNode;\n}\n\n// Type guards\nfunction isJpzXmlNode(value: unknown): value is JpzXmlNode {\n return typeof value === 'object' && value !== null;\n}\n\nfunction isString(value: unknown): value is string {\n return typeof value === 'string';\n}\n\nfunction parseStringAttribute(value: unknown): string | undefined {\n return isString(value) ? value : undefined;\n}\n\nfunction parseIntAttribute(value: unknown): number | undefined {\n if (isString(value)) {\n const parsed = Number.parseInt(value, 10);\n return Number.isNaN(parsed) ? undefined : parsed;\n }\n return undefined;\n}\n\nexport interface JpzMetadata {\n title?: string;\n creator?: string;\n copyright?: string;\n description?: string;\n publisher?: string;\n identifier?: string;\n}\n\nexport interface JpzCell {\n x: number;\n y: number;\n solution?: string;\n number?: number;\n type?: 'block' | 'cell';\n isCircled?: boolean;\n backgroundColor?: string;\n barTop?: boolean;\n barBottom?: boolean;\n barLeft?: boolean;\n barRight?: boolean;\n}\n\nexport interface JpzClue {\n number: string | number;\n text: string;\n format?: string;\n}\n\nexport interface JpzWord {\n id: string;\n cells: Array<{ x: number; y: number }>;\n}\n\nexport interface JpzPuzzle {\n width: number;\n height: number;\n metadata: JpzMetadata;\n grid: JpzCell[][];\n across: JpzClue[];\n down: JpzClue[];\n words?: JpzWord[];\n}\n\nfunction parseMetadata(metadataNode: unknown): JpzMetadata {\n if (!isJpzXmlNode(metadataNode)) return {};\n\n return {\n title: parseStringAttribute(metadataNode.title),\n creator:\n parseStringAttribute(metadataNode.creator) || parseStringAttribute(metadataNode.author),\n copyright: parseStringAttribute(metadataNode.copyright),\n description: parseStringAttribute(metadataNode.description),\n publisher: parseStringAttribute(metadataNode.publisher),\n identifier: parseStringAttribute(metadataNode.identifier),\n };\n}\n\nfunction parseCells(\n gridNode: unknown,\n options?: ParseOptions,\n): {\n cells: Map<string, JpzCell>;\n width: number;\n height: number;\n} {\n const cells = new Map<string, JpzCell>();\n\n if (!isJpzXmlNode(gridNode)) {\n throw new JpzParseError('Missing or invalid grid element', ErrorCode.JPZ_MISSING_GRID);\n }\n\n const width = parseIntAttribute(gridNode['@_width']);\n const height = parseIntAttribute(gridNode['@_height']);\n\n if (width === undefined || height === undefined) {\n throw new JpzParseError(\n 'Grid dimensions (width and height) are required',\n ErrorCode.JPZ_INVALID_GRID,\n );\n }\n\n // Validate grid dimensions to prevent excessive memory usage\n const maxWidth = options?.maxGridSize?.width ?? MAX_GRID_WIDTH;\n const maxHeight = options?.maxGridSize?.height ?? MAX_GRID_HEIGHT;\n\n if (width <= 0 || width > maxWidth || height <= 0 || height > maxHeight) {\n throw new JpzParseError(\n `Invalid grid dimensions: ${width}x${height}. Maximum supported size is ${maxWidth}x${maxHeight}`,\n ErrorCode.JPZ_INVALID_GRID,\n { details: { width, height } },\n );\n }\n\n // Handle cells - can be a single cell or array\n const cellNodes = gridNode.cell;\n if (cellNodes) {\n const cellArray = Array.isArray(cellNodes) ? cellNodes : [cellNodes];\n\n for (const cellNode of cellArray) {\n if (!isJpzXmlNode(cellNode)) continue;\n\n const x = parseIntAttribute(cellNode['@_x']);\n const y = parseIntAttribute(cellNode['@_y']);\n\n if (x === undefined || y === undefined) continue;\n\n const key = `${x},${y}`;\n\n const jpzCell: JpzCell = {\n x,\n y,\n type: parseStringAttribute(cellNode['@_type']) === 'block' ? 'block' : 'cell',\n solution:\n parseStringAttribute(cellNode['@_solution']) ||\n parseStringAttribute(cellNode['@_letter']),\n number: parseIntAttribute(cellNode['@_number']),\n isCircled: parseStringAttribute(cellNode['@_background-shape']) === 'circle',\n backgroundColor: parseStringAttribute(cellNode['@_background-color']),\n barTop: parseStringAttribute(cellNode['@_top-bar']) === 'true',\n barBottom: parseStringAttribute(cellNode['@_bottom-bar']) === 'true',\n barLeft: parseStringAttribute(cellNode['@_left-bar']) === 'true',\n barRight: parseStringAttribute(cellNode['@_right-bar']) === 'true',\n };\n\n cells.set(key, jpzCell);\n }\n }\n\n return { cells, width, height };\n}\n\nfunction buildGrid(cells: Map<string, JpzCell>, width: number, height: number): JpzCell[][] {\n const grid: JpzCell[][] = [];\n\n // JPZ uses 1-based indexing\n for (let y = 1; y <= height; y++) {\n const row: JpzCell[] = [];\n for (let x = 1; x <= width; x++) {\n const key = `${x},${y}`;\n const cell = cells.get(key);\n\n if (cell) {\n row.push(cell);\n } else {\n // Default empty cell\n row.push({\n x,\n y,\n type: 'cell',\n });\n }\n }\n grid.push(row);\n }\n\n return grid;\n}\n\nfunction parseClues(cluesNode: unknown): { across: JpzClue[]; down: JpzClue[] } {\n const across: JpzClue[] = [];\n const down: JpzClue[] = [];\n\n if (!isJpzXmlNode(cluesNode)) {\n return { across, down };\n }\n\n // Handle different clue structures\n const clueArrays = Array.isArray(cluesNode) ? cluesNode : [cluesNode];\n\n for (const clueSet of clueArrays) {\n if (!isJpzXmlNode(clueSet)) continue;\n\n // Get title/direction - might be nested object with text content\n let titleStr = '';\n if (isString(clueSet.title)) {\n titleStr = clueSet.title;\n } else if (isJpzXmlNode(clueSet.title)) {\n // Handle nested elements like <title><b>Across</b></title>\n const titleNode = clueSet.title;\n titleStr =\n parseStringAttribute(titleNode.b) ||\n parseStringAttribute(titleNode['#text']) ||\n JSON.stringify(titleNode);\n } else if (parseStringAttribute(clueSet['@_title'])) {\n titleStr = parseStringAttribute(clueSet['@_title']) || '';\n }\n\n const isAcross = titleStr.toLowerCase().includes('across');\n const targetArray = isAcross ? across : down;\n\n // Get clues\n const clueNodes = clueSet.clue;\n if (clueNodes) {\n const clues = Array.isArray(clueNodes) ? clueNodes : [clueNodes];\n\n for (const clue of clues) {\n if (isString(clue)) {\n // Simple string clue with number prefix\n const match = clue.match(/^(\\d+)\\.\\s*(.+)$/);\n if (match) {\n targetArray.push({\n number: match[1] || '',\n text: match[2] || '',\n });\n }\n } else if (isJpzXmlNode(clue)) {\n // Structured clue\n const clueObj: JpzClue = {\n number:\n parseStringAttribute(clue['@_number']) || parseStringAttribute(clue.number) || '',\n text:\n parseStringAttribute(clue['#text']) ||\n parseStringAttribute(clue.text) ||\n parseStringAttribute(clue['@_text']) ||\n '',\n format: parseStringAttribute(clue['@_format']),\n };\n\n // Handle word reference\n const wordRef = parseStringAttribute(clue['@_word']);\n if (wordRef) {\n clueObj.number = wordRef;\n }\n\n targetArray.push(clueObj);\n }\n }\n }\n }\n\n return { across, down };\n}\n\nfunction parseWords(wordsNode: unknown): JpzWord[] {\n const words: JpzWord[] = [];\n\n if (!isJpzXmlNode(wordsNode) || !wordsNode.word) {\n return words;\n }\n\n const wordNodes = Array.isArray(wordsNode.word) ? wordsNode.word : [wordsNode.word];\n\n for (const word of wordNodes) {\n if (!isJpzXmlNode(word)) continue;\n\n const jpzWord: JpzWord = {\n id: parseStringAttribute(word['@_id']) || '',\n cells: [],\n };\n\n // Parse cells\n if (isJpzXmlNode(word.cells)) {\n const cellList = word.cells.cell;\n if (cellList) {\n const cells = Array.isArray(cellList) ? cellList : [cellList];\n for (const cell of cells) {\n if (!isJpzXmlNode(cell)) continue;\n\n const x = parseIntAttribute(cell['@_x']);\n const y = parseIntAttribute(cell['@_y']);\n\n if (x !== undefined && y !== undefined) {\n jpzWord.cells.push({ x, y });\n }\n }\n }\n }\n\n words.push(jpzWord);\n }\n\n return words;\n}\n\n/**\n * Parse a JPZ format crossword puzzle.\n *\n * @param content - The JPZ XML data as string\n * @param options - Optional parsing options\n * @param options.maxGridSize - Maximum allowed grid dimensions\n * @returns A JpzPuzzle object containing all puzzle data\n * @throws {JpzParseError} When the content is not valid JPZ format\n * @throws {UnsupportedPuzzleTypeError} When the puzzle is not a crossword\n *\n * @example\n * ```typescript\n * import { parseJpz } from 'xword-parser';\n * const jpzData = '<?xml version=\"1.0\"?><crossword-compiler-applet>...';\n * const puzzle = parseJpz(jpzData);\n * ```\n */\nexport function parseJpz(content: string, options?: ParseOptions): JpzPuzzle {\n const parser = new XMLParser({\n ignoreAttributes: false,\n attributeNamePrefix: '@_',\n textNodeName: '#text',\n parseAttributeValue: false,\n });\n\n let doc: JpzXmlRoot;\n try {\n doc = parser.parse(content) as JpzXmlRoot;\n } catch (e) {\n throw new JpzParseError(\n `Invalid XML: ${e instanceof Error ? e.message : 'Unknown error'}`,\n ErrorCode.JPZ_INVALID_XML,\n undefined,\n e,\n );\n }\n\n // Handle different JPZ root elements\n const puzzleRoot =\n doc['crossword-compiler-applet'] || doc['crossword-compiler'] || doc.puzzle || doc.crossword;\n\n if (!isJpzXmlNode(puzzleRoot)) {\n throw new JpzParseError('no recognized root element', ErrorCode.JPZ_INVALID_XML);\n }\n\n // Find the puzzle data - might be nested\n let rectangularPuzzle = puzzleRoot['rectangular-puzzle'];\n if (!isJpzXmlNode(rectangularPuzzle) && isJpzXmlNode(puzzleRoot.puzzle)) {\n const puzzleChild = puzzleRoot.puzzle;\n if (isJpzXmlNode(puzzleChild)) {\n rectangularPuzzle = puzzleChild['rectangular-puzzle'];\n }\n }\n if (!isJpzXmlNode(rectangularPuzzle)) {\n rectangularPuzzle = puzzleRoot;\n }\n\n // Check if this is a non-crossword puzzle type we don't support\n if (rectangularPuzzle.coded) {\n throw new UnsupportedPuzzleTypeError('Coded/cipher crosswords (Kaidoku)');\n }\n if (rectangularPuzzle.sudoku || rectangularPuzzle.kakuro) {\n throw new UnsupportedPuzzleTypeError('Number puzzles');\n }\n if (rectangularPuzzle['word-search'] || rectangularPuzzle.wordsearch) {\n throw new UnsupportedPuzzleTypeError('Word search');\n }\n\n // Extract components\n const metadata = parseMetadata(rectangularPuzzle.metadata);\n\n // Find grid and clues - should be in crossword section for standard crosswords\n const crosswordNode =\n rectangularPuzzle.crossword || rectangularPuzzle.puzzle || rectangularPuzzle;\n\n let gridNode: unknown = undefined;\n if (isJpzXmlNode(crosswordNode)) {\n gridNode = crosswordNode.grid || crosswordNode.Grid;\n }\n if (!gridNode && isJpzXmlNode(rectangularPuzzle)) {\n gridNode = rectangularPuzzle.grid;\n }\n\n if (!gridNode) {\n throw new JpzParseError('no grid found', ErrorCode.JPZ_INVALID_XML);\n }\n\n // Parse cells and build grid\n const { cells, width, height } = parseCells(gridNode, options);\n const grid = buildGrid(cells, width, height);\n\n // Parse clues - might be in different locations\n let cluesNode: unknown = undefined;\n if (isJpzXmlNode(crosswordNode)) {\n cluesNode = crosswordNode.clues || crosswordNode.Clues;\n }\n if (!cluesNode && isJpzXmlNode(rectangularPuzzle)) {\n cluesNode = rectangularPuzzle.clues || rectangularPuzzle.Clues;\n }\n\n const { across, down } = parseClues(cluesNode);\n\n // Parse words if present\n let wordsNode: unknown = undefined;\n if (isJpzXmlNode(crosswordNode)) {\n wordsNode = crosswordNode.words || crosswordNode.Words;\n }\n const words = wordsNode ? parseWords(wordsNode) : undefined;\n\n return {\n width,\n height,\n metadata,\n grid,\n across,\n down,\n words,\n };\n}\n\n/**\n * Convert a JPZ puzzle to the unified Puzzle format.\n *\n * @param puzzle - The JpzPuzzle object to convert\n * @returns A unified Puzzle object\n *\n * @example\n * ```typescript\n * import { parseJpz, convertJpzToUnified } from 'xword-parser';\n * const jpzPuzzle = parseJpz(jpzData);\n * const unifiedPuzzle = convertJpzToUnified(jpzPuzzle);\n * ```\n */\nexport function convertJpzToUnified(puzzle: JpzPuzzle): Puzzle {\n const grid: Grid = {\n width: puzzle.width,\n height: puzzle.height,\n cells: [],\n };\n\n // Convert grid\n for (const row of puzzle.grid) {\n const cellRow: UnifiedCell[] = [];\n for (const cell of row) {\n const unifiedCell: UnifiedCell = {\n solution: cell.solution,\n number: cell.number,\n isBlack: cell.type === 'block',\n isCircled: cell.isCircled,\n };\n\n // Add cell-specific metadata if present\n if (cell.backgroundColor || cell.barTop || cell.barBottom || cell.barLeft || cell.barRight) {\n unifiedCell.additionalProperties = {};\n if (cell.backgroundColor) {\n unifiedCell.additionalProperties.backgroundColor = cell.backgroundColor;\n }\n if (cell.barTop) unifiedCell.additionalProperties.barTop = cell.barTop;\n if (cell.barBottom) unifiedCell.additionalProperties.barBottom = cell.barBottom;\n if (cell.barLeft) unifiedCell.additionalProperties.barLeft = cell.barLeft;\n if (cell.barRight) unifiedCell.additionalProperties.barRight = cell.barRight;\n }\n\n cellRow.push(unifiedCell);\n }\n grid.cells.push(cellRow);\n }\n\n // Convert clues\n const clues: Clues = {\n across: puzzle.across.map((c) => ({\n number: typeof c.number === 'string' ? parseInt(c.number) : c.number,\n text: c.text,\n })),\n down: puzzle.down.map((c) => ({\n number: typeof c.number === 'string' ? parseInt(c.number) : c.number,\n text: c.text,\n })),\n };\n\n const result: Puzzle = {\n title: puzzle.metadata.title,\n author: puzzle.metadata.creator,\n copyright: puzzle.metadata.copyright,\n grid,\n clues,\n };\n\n // Add puzzle-level metadata if present\n const additionalProps: Record<string, unknown> = {};\n\n if (puzzle.metadata.description) additionalProps.description = puzzle.metadata.description;\n if (puzzle.metadata.publisher) additionalProps.publisher = puzzle.metadata.publisher;\n if (puzzle.metadata.identifier) additionalProps.identifier = puzzle.metadata.identifier;\n\n // Add words information if present\n if (puzzle.words && puzzle.words.length > 0) {\n additionalProps.words = puzzle.words;\n }\n\n if (Object.keys(additionalProps).length > 0) {\n result.additionalProperties = additionalProps;\n }\n\n return result;\n}\n"]}