From 90de4c1bd20f0ac3e69a4213db67d90cb43b6e4e Mon Sep 17 00:00:00 2001 From: Tatsuya Sato Date: Mon, 30 Oct 2023 00:38:39 +0900 Subject: [PATCH 1/2] Reproduce the error reported #142 --- spec/docx/document_spec.rb | 9 +++++++++ spec/fixtures/internal-links.docx | Bin 0 -> 9849 bytes 2 files changed, 9 insertions(+) create mode 100644 spec/fixtures/internal-links.docx diff --git a/spec/docx/document_spec.rb b/spec/docx/document_spec.rb index 28db70f..980327a 100755 --- a/spec/docx/document_spec.rb +++ b/spec/docx/document_spec.rb @@ -522,4 +522,13 @@ end end + describe '#to_html' do + before do + @doc = Docx::Document.open(@fixtures_path + '/internal-links.docx') + end + + it 'should not raise error' do + expect { @doc.to_html }.to_not raise_error + end + end end diff --git a/spec/fixtures/internal-links.docx b/spec/fixtures/internal-links.docx new file mode 100644 index 0000000000000000000000000000000000000000..31a7153b47e9a44fb33073524ee94e206d204b1c GIT binary patch literal 9849 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 literal 0 HcmV?d00001 From c042502b4dc7777e22e19432ed1c64641bf7d053 Mon Sep 17 00:00:00 2001 From: Tatsuya Sato Date: Mon, 30 Oct 2023 02:01:11 +0900 Subject: [PATCH 2/2] Surrounding html content with anchor only when it is an external link --- lib/docx/containers/text_run.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/docx/containers/text_run.rb b/lib/docx/containers/text_run.rb index 59be9d3..1bc717f 100755 --- a/lib/docx/containers/text_run.rb +++ b/lib/docx/containers/text_run.rb @@ -95,7 +95,11 @@ def underlined? end def hyperlink? - @node.name == 'hyperlink' + @node.name == 'hyperlink' && external_link? + end + + def external_link? + !@node.attributes['id'].nil? end def href