Preserve QWord internal hyperlinks in DOCX
This commit is contained in:
@@ -104,16 +104,18 @@ describe("wordOffice helpers", () => {
|
||||
|
||||
it("сохраняет HTML-гиперссылки как inline runs", () => {
|
||||
const blocks = htmlToWordBlocks(`
|
||||
<p>Откройте <a href="https://example.com/report"><strong>отчет</strong></a> и <a href="javascript:alert(1)">небезопасную ссылку</a>.</p>
|
||||
<p>Откройте <a href="https://example.com/report"><strong>отчет</strong></a>, <a href="#Section1">раздел</a> и <a href="javascript:alert(1)">небезопасную ссылку</a>.</p>
|
||||
`);
|
||||
|
||||
expect(blocks).toEqual([
|
||||
{
|
||||
type: "paragraph",
|
||||
text: "Откройте отчет и небезопасную ссылку.",
|
||||
text: "Откройте отчет, раздел и небезопасную ссылку.",
|
||||
runs: [
|
||||
{ text: "Откройте " },
|
||||
{ text: "отчет", bold: true, href: "https://example.com/report" },
|
||||
{ text: ", " },
|
||||
{ text: "раздел", href: "#Section1" },
|
||||
{ text: " и небезопасную ссылку." }
|
||||
]
|
||||
}
|
||||
@@ -224,6 +226,17 @@ describe("wordOffice helpers", () => {
|
||||
expect(relationshipsXml).not.toContain("javascript:alert");
|
||||
});
|
||||
|
||||
it("записывает внутренние HTML-гиперссылки как w:hyperlink anchor без внешних relationships", async () => {
|
||||
const blob = await exportDocxBlob("Внутренняя ссылка.docx", '<p>См. <a href="#Section1">раздел</a>.</p>');
|
||||
const zip = await JSZip.loadAsync(await blob.arrayBuffer());
|
||||
const documentXml = await zip.file("word/document.xml")?.async("string");
|
||||
const relationshipsXml = await zip.file("word/_rels/document.xml.rels")?.async("string");
|
||||
|
||||
expect(documentXml).toMatch(/<w:hyperlink\b[^>]*w:anchor="Section1"[^>]*>/);
|
||||
expect(documentXml).toContain('w:rStyle w:val="Hyperlink"');
|
||||
expect(relationshipsXml).not.toContain('Target="#Section1"');
|
||||
});
|
||||
|
||||
it("записывает data URI изображения в DOCX media relationships", async () => {
|
||||
const blob = await exportDocxBlob("Изображение.docx", `<p>Логотип</p><img src="${tinyPngDataUri}" alt="Логотип" width="32" height="32">`);
|
||||
const zip = await JSZip.loadAsync(await blob.arrayBuffer());
|
||||
|
||||
Reference in New Issue
Block a user