diff --git a/packages/parser/src/inline.ts b/packages/parser/src/inline.ts index 39928dd..d559d2a 100644 --- a/packages/parser/src/inline.ts +++ b/packages/parser/src/inline.ts @@ -1,4 +1,6 @@ import { readFileSync } from 'fs' +import { cwd } from 'process' +import path from 'path' import type { IImageOptions, IRunOptions, ParagraphChild } from 'docx' import { ImageRun, Paragraph, TextRun } from 'docx' import type Token from 'markdown-it/lib/token' @@ -9,17 +11,18 @@ export function parseInline(props: { tokens: Token[]; style?: StyleId }): Paragr // Variables. const { tokens, style = StyleId.normal } = props const { children: childrenTokens } = tokens[0] - const { length } = childrenTokens || [] + if (!childrenTokens) + return new Paragraph({}) const children: ParagraphChild[] = [] let pos = 0 // Parse inline children. - while (pos < length) { - const { tokens: paragraphChild, offset: nextPos } = sliceInlineText(tokens.slice(pos)) + while (pos < childrenTokens.length) { + const { tokens: paragraphChild, offset: nextPos } = sliceInlineText(childrenTokens.slice(pos)) if (paragraphChild[0].tag === 'img') children.push(parseImage(paragraphChild)) else children.push(parseText(paragraphChild)) - pos = nextPos + pos += nextPos } return new Paragraph({ style, @@ -73,22 +76,24 @@ export function parseText(tokens: Token[]): TextRun { } export function parseImage(tokens: Token[]): ImageRun | TextRun { - const { attrGet, content } = tokens[0] - const src = attrGet('src') + const { attrs, content } = tokens[0] + const src = new Map(attrs).get('src') + const [name, resolution] = content.split('#') + const [x = 100, y = 100] = resolution.split('*') if (!src) { return new TextRun({ - text: `[MD Report]: Image ${content} is not found.`, + text: `[MD Report]: Image ${name} is not found.`, bold: true, color: 'red', highlight: 'yellow', }) } const options: IImageOptions = { - data: readFileSync(src).toString('base64'), + data: readFileSync(path.resolve(cwd(), src)).toString('base64'), // TODO: Replace width and height with config in image url. transformation: { - width: 100, - height: 100, + width: Number(x), + height: Number(y), }, } return new ImageRun(options) diff --git a/packages/parser/src/paragraph.ts b/packages/parser/src/paragraph.ts index 2d67c93..78a3a1f 100644 --- a/packages/parser/src/paragraph.ts +++ b/packages/parser/src/paragraph.ts @@ -1,15 +1,16 @@ import type Token from 'markdown-it/lib/token' -import { Paragraph, Table, TableCell, TableRow } from 'docx' +import { Paragraph, Table, TableCell, TableRow, TextRun } from 'docx' import { StyleId } from '@md-report/types' import { sliceTableRow } from './utils' import { parseInline } from './inline' export function parseFence(tokens: Token[]): Paragraph { // Variables. - const { content: text } = tokens[0] + const { content } = tokens[0] + const children = content.split('\n').filter(item => item !== '').map((item, index) => new TextRun({ text: item, break: index ? 1 : 0 })) return new Paragraph({ - style: 'fence', - text, + style: StyleId.code, + children, }) } @@ -43,9 +44,13 @@ export function parseTableRow(tokens: Token[]): TableRow { export function parseParagraph(tokens: Token[]): Paragraph { const inline = tokens.filter(token => token.type === 'inline') + let style = StyleId.normal + if (inline[0].children?.length === 1 && inline[0].children[0].tag === 'img') + style = StyleId.image + return parseInline({ tokens: inline, - style: StyleId.normal, + style, }) }