From 980192253fb7f1e8d84254cd4f80d59fc16e789d Mon Sep 17 00:00:00 2001 From: mathias234 Date: Tue, 2 Dec 2025 11:43:25 +0100 Subject: [PATCH] Add support for images --- CLAUDE.md | 49 ++++++++ ezdoc.gemspec | 1 + lib/ezdoc.rb | 2 + lib/ezdoc/builder.rb | 15 +++ lib/ezdoc/document.rb | 22 ++++ lib/ezdoc/image_dimensions.rb | 55 +++++++++ lib/ezdoc/nodes/image.rb | 38 ++++++ lib/ezdoc/package.rb | 14 ++- lib/ezdoc/xml/content_types.rb | 18 ++- lib/ezdoc/xml/document_xml.rb | 53 ++++++++- lib/ezdoc/xml/relationships.rb | 12 +- test/fixtures/test.jpg | Bin 0 -> 8531 bytes test/fixtures/test.png | Bin 0 -> 72787 bytes test/image_test.rb | 204 +++++++++++++++++++++++++++++++++ test/test_helper.rb | 4 +- 15 files changed, 481 insertions(+), 6 deletions(-) create mode 100644 CLAUDE.md create mode 100644 lib/ezdoc/image_dimensions.rb create mode 100644 lib/ezdoc/nodes/image.rb create mode 100644 test/fixtures/test.jpg create mode 100644 test/fixtures/test.png create mode 100644 test/image_test.rb diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..a91a8fb --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,49 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Build and Test Commands + +```bash +bundle install # Install dependencies +bundle exec rake test # Run tests +bundle exec rake rubocop # Run linter +bundle exec rake # Run both tests and linter + +# Run a single test file +bundle exec ruby -Ilib:test test/paragraph_test.rb + +# Run a specific test by name +bundle exec ruby -Ilib:test test/paragraph_test.rb -n test_paragraph_with_text +``` + +## Architecture + +Ezdoc is a Ruby gem for creating .docx files using a DSL. The gem generates valid Office Open XML (OOXML) documents. + +### Core Components + +- **Document** (`lib/ezdoc/document.rb`): Entry point via `Document.create`. Includes the Builder module and maintains a collection of nodes. + +- **Builder** (`lib/ezdoc/builder.rb`): DSL methods (`p`, `text`, `b`, `i`, `u`, `ul`, `ol`, `li`, `table`, `tr`, `td`). Uses a format stack for nested formatting and target tracking for content placement. + +- **Nodes** (`lib/ezdoc/nodes/`): Document element representations (Paragraph, Run, List, ListItem, Table, TableRow, TableCell). All inherit from `Nodes::Base`. + +- **Package** (`lib/ezdoc/package.rb`): Assembles the docx ZIP structure using rubyzip. Coordinates XML generation. + +- **XML generators** (`lib/ezdoc/xml/`): Generate OOXML-compliant XML: + - `DocumentXml`: Main content with paragraphs, lists, tables + - `ContentTypes`: [Content_Types].xml + - `Relationships`: .rels files + - `Numbering`: numbering.xml for lists + +### Data Flow + +1. User calls DSL methods on Document +2. Builder creates Node objects, pushed to Document's `@nodes` array +3. On save, Package creates ZIP with XML generators producing each required file +4. XML generators use Nokogiri to build OOXML with proper namespaces + +### Testing + +Tests use Minitest. `EzdocTestHelpers` module provides helpers that create temp documents and extract XML for assertions. diff --git a/ezdoc.gemspec b/ezdoc.gemspec index ed2dd56..77c4f8c 100644 --- a/ezdoc.gemspec +++ b/ezdoc.gemspec @@ -15,6 +15,7 @@ Gem::Specification.new do |spec| spec.files = Dir.glob("{lib}/**/*") + %w[README.md LICENSE.txt] spec.require_paths = ["lib"] + spec.add_dependency "fastimage", "~> 2.4" spec.add_dependency "nokogiri", "~> 1.18" spec.add_dependency "rubyzip", "~> 2.3" diff --git a/lib/ezdoc.rb b/lib/ezdoc.rb index 129deb6..4ec96f5 100644 --- a/lib/ezdoc.rb +++ b/lib/ezdoc.rb @@ -5,12 +5,14 @@ require "nokogiri" require_relative "ezdoc/version" require_relative "ezdoc/nodes/base" require_relative "ezdoc/nodes/run" +require_relative "ezdoc/nodes/image" require_relative "ezdoc/nodes/paragraph" require_relative "ezdoc/nodes/list" require_relative "ezdoc/nodes/list_item" require_relative "ezdoc/nodes/table" require_relative "ezdoc/nodes/table_row" require_relative "ezdoc/nodes/table_cell" +require_relative "ezdoc/image_dimensions" require_relative "ezdoc/xml/content_types" require_relative "ezdoc/xml/relationships" require_relative "ezdoc/xml/document_xml" diff --git a/lib/ezdoc/builder.rb b/lib/ezdoc/builder.rb index d3a8aea..4c81506 100644 --- a/lib/ezdoc/builder.rb +++ b/lib/ezdoc/builder.rb @@ -16,6 +16,12 @@ module Ezdoc @current_target.add_run(Nodes::Run.new(value, **current_formatting)) end + def image(path, width: nil, height: nil) + validate_image_path!(path) + img = register_image(path, width: width, height: height) + @current_target.add_run(img) + end + def b(&block) with_format(:bold, &block) end @@ -110,5 +116,14 @@ module Ezdoc underline: @format_stack.include?(:underline) } end + + def validate_image_path!(path) + raise ArgumentError, "Image file not found: #{path}" unless File.exist?(path) + + ext = File.extname(path).downcase + return if %w[.png .jpg .jpeg].include?(ext) + + raise ArgumentError, "Unsupported image format: #{ext}. Use PNG or JPEG." + end end end diff --git a/lib/ezdoc/document.rb b/lib/ezdoc/document.rb index 6fffd1b..d6a3dda 100644 --- a/lib/ezdoc/document.rb +++ b/lib/ezdoc/document.rb @@ -21,6 +21,7 @@ module Ezdoc @current_table = nil @current_row = nil @num_id_counter = 0 + @images = {} end def save(path) @@ -30,5 +31,26 @@ module Ezdoc def lists @nodes.select { |n| n.is_a?(Nodes::List) } end + + def images + @images.values + end + + def register_image(path, width: nil, height: nil) + return @images[path] if @images[path] + + rid = next_image_rid + width_emu, height_emu = ImageDimensions.calculate_emus(path, width: width, height: height) + image = Nodes::Image.new(path, rid: rid, width_emu: width_emu, height_emu: height_emu) + @images[path] = image + image + end + + private + + def next_image_rid + base = lists.any? ? 2 : 1 + "rId#{base + @images.size}" + end end end diff --git a/lib/ezdoc/image_dimensions.rb b/lib/ezdoc/image_dimensions.rb new file mode 100644 index 0000000..42faae7 --- /dev/null +++ b/lib/ezdoc/image_dimensions.rb @@ -0,0 +1,55 @@ +# frozen_string_literal: true + +require "fastimage" + +module Ezdoc + class ImageDimensions + EMUS_PER_INCH = 914_400 + DEFAULT_DPI = 96 + + def self.read(path) + FastImage.size(path) || raise(ArgumentError, "Could not read image dimensions: #{path}") + end + + def self.calculate_emus(path, width: nil, height: nil) + native_width, native_height = read(path) + calculate_dimensions_emu(native_width, native_height, width, height) + end + + def self.calculate_dimensions_emu(native_width, native_height, width, height) + if width && height + [parse_dimension(width), parse_dimension(height)] + elsif width + w = parse_dimension(width) + ratio = native_height.to_f / native_width + [w, (w * ratio).to_i] + elsif height + h = parse_dimension(height) + ratio = native_width.to_f / native_height + [(h * ratio).to_i, h] + else + pixels_to_emus(native_width, native_height) + end + end + + def self.parse_dimension(value) + case value + when Integer + pixels_to_emus(value, 0).first + when /\A(\d+(?:\.\d+)?)\s*in\z/i + (::Regexp.last_match(1).to_f * EMUS_PER_INCH).to_i + when /\A(\d+(?:\.\d+)?)\s*cm\z/i + (::Regexp.last_match(1).to_f * 360_000).to_i + when /\A(\d+(?:\.\d+)?)\s*px\z/i, /\A(\d+)\z/ + pixels_to_emus(::Regexp.last_match(1).to_i, 0).first + else + raise ArgumentError, "Invalid dimension format: #{value}. Use '2in', '5cm', '100px', or integer pixels." + end + end + + def self.pixels_to_emus(width_px, height_px) + emu_per_pixel = EMUS_PER_INCH / DEFAULT_DPI + [(width_px * emu_per_pixel).to_i, (height_px * emu_per_pixel).to_i] + end + end +end diff --git a/lib/ezdoc/nodes/image.rb b/lib/ezdoc/nodes/image.rb new file mode 100644 index 0000000..78ca2e7 --- /dev/null +++ b/lib/ezdoc/nodes/image.rb @@ -0,0 +1,38 @@ +# frozen_string_literal: true + +module Ezdoc + module Nodes + class Image < Base + attr_reader :path, :width_emu, :height_emu, :rid, :filename + + EMUS_PER_INCH = 914_400 + EMUS_PER_CM = 360_000 + DEFAULT_DPI = 96 + + def initialize(path, rid:, width_emu:, height_emu:) + super() + @path = path + @rid = rid + @width_emu = width_emu + @height_emu = height_emu + @filename = "image#{rid.delete_prefix("rId")}.#{extension}" + end + + def extension + case File.extname(@path).downcase + when ".png" then "png" + when ".jpg", ".jpeg" then "jpeg" + else raise ArgumentError, "Unsupported image format: #{File.extname(@path)}" + end + end + + def content_type + extension == "png" ? "image/png" : "image/jpeg" + end + + def doc_pr_id + rid.delete_prefix("rId").to_i + end + end + end +end diff --git a/lib/ezdoc/package.rb b/lib/ezdoc/package.rb index f5af348..cef8547 100644 --- a/lib/ezdoc/package.rb +++ b/lib/ezdoc/package.rb @@ -16,6 +16,12 @@ module Ezdoc zipfile.get_output_stream("word/document.xml") { |f| f.write(document_xml) } zipfile.get_output_stream("word/numbering.xml") { |f| f.write(numbering_xml) } if lists? + + images.each do |image| + zipfile.get_output_stream("word/media/#{image.filename}") do |f| + f.write(File.binread(image.path)) + end + end end end @@ -25,8 +31,12 @@ module Ezdoc @document.lists.any? end + def images + @document.images + end + def content_types_xml - Xml::ContentTypes.new(has_numbering: lists?).to_xml + Xml::ContentTypes.new(has_numbering: lists?, images: images).to_xml end def relationships_xml @@ -34,7 +44,7 @@ module Ezdoc end def document_relationships_xml - Xml::DocumentRelationships.new(has_numbering: lists?).to_xml + Xml::DocumentRelationships.new(has_numbering: lists?, images: images).to_xml end def document_xml diff --git a/lib/ezdoc/xml/content_types.rb b/lib/ezdoc/xml/content_types.rb index d7e429c..f04fa34 100644 --- a/lib/ezdoc/xml/content_types.rb +++ b/lib/ezdoc/xml/content_types.rb @@ -5,8 +5,9 @@ module Ezdoc class ContentTypes NAMESPACE = "http://schemas.openxmlformats.org/package/2006/content-types" - def initialize(has_numbering: false) + def initialize(has_numbering: false, images: []) @has_numbering = has_numbering + @images = images end def to_xml @@ -14,6 +15,11 @@ module Ezdoc xml.Types(xmlns: NAMESPACE) do xml.Default(Extension: "rels", ContentType: "application/vnd.openxmlformats-package.relationships+xml") xml.Default(Extension: "xml", ContentType: "application/xml") + + image_extensions.each do |ext, content_type| + xml.Default(Extension: ext, ContentType: content_type) + end + xml.Override( PartName: "/word/document.xml", ContentType: "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml" @@ -28,6 +34,16 @@ module Ezdoc end builder.to_xml end + + private + + def image_extensions + extensions = {} + @images.each do |image| + extensions[image.extension] ||= image.content_type + end + extensions + end end end end diff --git a/lib/ezdoc/xml/document_xml.rb b/lib/ezdoc/xml/document_xml.rb index cb053dc..f67e2b5 100644 --- a/lib/ezdoc/xml/document_xml.rb +++ b/lib/ezdoc/xml/document_xml.rb @@ -5,7 +5,10 @@ module Ezdoc class DocumentXml NAMESPACES = { "xmlns:w" => "http://schemas.openxmlformats.org/wordprocessingml/2006/main", - "xmlns:r" => "http://schemas.openxmlformats.org/officeDocument/2006/relationships" + "xmlns:r" => "http://schemas.openxmlformats.org/officeDocument/2006/relationships", + "xmlns:wp" => "http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing", + "xmlns:a" => "http://schemas.openxmlformats.org/drawingml/2006/main", + "xmlns:pic" => "http://schemas.openxmlformats.org/drawingml/2006/picture" }.freeze def initialize(nodes) @@ -60,6 +63,15 @@ module Ezdoc end def render_run(xml, run) + case run + when Nodes::Image + render_image(xml, run) + when Nodes::Run + render_text_run(xml, run) + end + end + + def render_text_run(xml, run) xml["w"].r do if run.bold || run.italic || run.underline xml["w"].rPr do @@ -72,6 +84,45 @@ module Ezdoc end end + def render_image(xml, image) + xml["w"].r do + xml["w"].drawing do + xml["wp"].inline(distT: "0", distB: "0", distL: "0", distR: "0") do + xml["wp"].extent(cx: image.width_emu.to_s, cy: image.height_emu.to_s) + xml["wp"].docPr(id: image.doc_pr_id.to_s, name: image.filename) + xml["wp"].cNvGraphicFramePr do + xml["a"].graphicFrameLocks(noChangeAspect: "1") + end + xml["a"].graphic do + xml["a"].graphicData(uri: "http://schemas.openxmlformats.org/drawingml/2006/picture") do + xml["pic"].pic do + xml["pic"].nvPicPr do + xml["pic"].cNvPr(id: "0", name: image.filename) + xml["pic"].cNvPicPr + end + xml["pic"].blipFill do + xml["a"].blip("r:embed" => image.rid) + xml["a"].stretch do + xml["a"].fillRect + end + end + xml["pic"].spPr do + xml["a"].xfrm do + xml["a"].off(x: "0", y: "0") + xml["a"].ext(cx: image.width_emu.to_s, cy: image.height_emu.to_s) + end + xml["a"].prstGeom(prst: "rect") do + xml["a"].avLst + end + end + end + end + end + end + end + end + end + def render_table(xml, table) xml["w"].tbl do xml["w"].tblPr do diff --git a/lib/ezdoc/xml/relationships.rb b/lib/ezdoc/xml/relationships.rb index 521cb1f..68b5dfa 100644 --- a/lib/ezdoc/xml/relationships.rb +++ b/lib/ezdoc/xml/relationships.rb @@ -21,9 +21,11 @@ module Ezdoc class DocumentRelationships NAMESPACE = "http://schemas.openxmlformats.org/package/2006/relationships" + IMAGE_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" - def initialize(has_numbering: false) + def initialize(has_numbering: false, images: []) @has_numbering = has_numbering + @images = images end def to_xml @@ -36,6 +38,14 @@ module Ezdoc Target: "numbering.xml" ) end + + @images.each do |image| + xml.Relationship( + Id: image.rid, + Type: IMAGE_TYPE, + Target: "media/#{image.filename}" + ) + end end end builder.to_xml diff --git a/test/fixtures/test.jpg b/test/fixtures/test.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e1d578e9624d74a07c91f57b599979a818cf3fab GIT binary patch literal 8531 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 literal 0 HcmV?d00001 diff --git a/test/fixtures/test.png b/test/fixtures/test.png new file mode 100644 index 0000000000000000000000000000000000000000..a4a812fe17db589b810691dffd565ac2454fd414 GIT binary patch literal 72787 zcmZ^~2|QHq-#024FW|!0)cjcqUbpgC|D5$TDS!QX=Z>x z!gq4W7MFkvqpmi_ZpOxPATaO;H%O4<9}ov{_V0dzAFMBtj{NK$8*#B+k|2^`6Kq)*RE}%qF38l!9`rqdqKnstb@_>YZ@{hm{ zdig&#C`Cn%m;c@R!2t-w`SQP8{|uP?^M9QGTjh$Sp0P1-yyk%q4E7N>Mr(?zX{h*$ zE3E^C+|E}G(V&BWe_l2frvW9rcZ_TUL7>Be|Lz=LX_0$Cp;VB*O^}OIkgFy>z!f-v zloXXz&Y_gfDJoq@DQYUKYARkhtEi}{s3<>S*YUq9`1rYaxZV5zuiy|jbq}Z@`=2`m zdHA>n208iM`M>L+{^us0>TT*ko#X%3alPx|rm5%W?H6Eq#|iHWQdLn=R#6TE`2q&w z|A&Fk9Y0@J-=IJ}KVLTw_uv4hAP+xZkb;7O=h`b5!1maGZ1sT_&E4DrU4uXu@<;JT}~ z4H|e>-~Vb!Nl_6Uw146Mwz2(RHsfJpx`2()f7-zXx(4X^`2fuX{dZ5-{I;6}EQJ4K zVXNn?7jVrl(Bt0+_V9HFp~?iJ@qh`3Ux3+lj=}uUEMN$LjL}!F-<=3&yQjGtKRpF5 zDM{@;9eiR1nwomyDb5O4Kn{zRzOCaTtPOHpJ%duJu2M>*WzxpEOL)my!dHcI)bH(o zckR5+jJbDr`j$9LvR#VMwa!|>DdR5RA3%j~bo?&z2%*qcS66qMs>doF8BErEke#qA zxHb7G2#cZ6D&%_&1x~-p_!&;EYx^!&n4l~5%YTXT%AHHUqiMZ5<>z$obIfzx$ff%m zys7&u6hDKp^Uv3#b}ILOPEAccZ`ms@dix|fxrv$GZ{XG2HxOG@gY#$#ji84yEI?4b zph?!(+lZ&_JUl$n;emmAXk_7fH4i!{A|e<2)$Sy|g#3LuMB)+rOg)ic^3J})>|rK#EM&UfQm$MncTmo}T7Vso+-Oj+K1 zM;X7_Sajh8#&^zoF)7*J>KIy7bunKNB>^w=uAO8Y8i`@j^UR*r$tzS^b!K=dvsaU& z8mYeY=J4IMY{yMj_K=2`kA*eA;6H}HT9bku49y(IOl7Lc6}?sA2SWuh9aEJDQ|FUV zGBPr~(`!5Hv(cCG2FpiKoy`nNMdFZhH8WDw&`lcQc2i!6{Y7wyM=bmuow4XyWmirf zIFzSLz=-H~#+}AS1vSbidbZFR7mJD9LouOg^Z6%tjjMIaw|qjw!^4Aus_Y!jx#Px` z#} z##o~NhOcPcP%;LI$KaQOR1ZCl7!&jqdb{X>OGkCW+tj!8otUiU$QB%ivr@xj7?vBL;7lMDslbc>XrC6{2Pg;eaJ+$)9wL* zoo{Lb29`spbv~4ezyXPeqbH#Hf9B?7&!5BNz#LGSv~ERyWWdd^*G66^@c{$>{9T>D zGO2EF0)|=g8xxGKJrPLO-rX)J@eQG#OU)W|k5y?+9-eo3Zv)5wP~ZCfv9A*zd=O(e z(BLl`FS`u_;cyzWSYq{f-|gQySCJA3P<#83G6+mK{9BQK;Nr7KMw2{P3>Q%aS#@|a zOVC&%)k+#Y%g(^c^?m}H;DK_GNQlG5@VHkz(eptkVhp*U@u(+lbM}!@=qqT>RB}aT zp;s8z2pv3fyS#}B(m{iC_*l(qoe(IL6Qo>B!eUYz#LgswlojEH$B|E#nq&&S#}(xy zYA}86-W! z#cA~LP0i4#kbc8WdXNw0CLPr48Qer$sW^YW1bfoU$O~j5Z-Mr*w89aG;%?P=WOWB= zHZ?RDqYzUe)go~mAacb&pu%shzXU<5**=&YEDVa~{0NU>P6|!zpo(6S)+TRwxmAk< z2KaJ)gdkE&N~Isc^)%IO_9zF72d*0{Zq-nzzNSBRV!*Asf|369^&7Fr@V0=4n$aJ? zR#pLXa`M5vWrQ(u5H+21q8EZ458bkpgJLno!>7U zfp*NTJ0^e;;9~NNhW41lu@*%cHibMZBE~5>$#_ilPOEd|mtb1+;$pXV3%wu!CalU{aLD=n=U}kJXmC@5?G3L$k(B3Y*o4e= zEvNFx&||v$-=05z-gha}1SDCQ@ibt7Bbop&edP|7<+}lUOc)p(tgRD=h4UdjkDvnh z&VbW;um~+Od7{&qOlq&?f4+48A2!%S$ zKy>#RRu`bthx$b`MW9J2yR$=bP?2wS-*6T-J_Q2MkKY&O{&JDFkSfDFQ-5^?{<*E3 zJFwo5G@W<&t5x(F&$xCCdB&wi&{PtVas8G^_`4z^s8gBNA2axYir5KUMKi2TT9r+;OuI5 z+?z$RFEylvei9FQDVt!=_O7Sq%M!ni+LZ?%jk=o9)Z3OfN^UcWV*T5n>!kUrl6F&$NG)3b=UMQMZ>SKK8|XLLIL=`9@jkLQdiY*8p~yoQd@t=PvP1DPWNW!duBYnD z=X{X97ng|^SVBV8wBU*noaKuSN_fNQD&ie|7Wr4-0x3CbPqg5&oC=`}t0)qbPCz1v zAgp;-+rn+pE|_x=2bZmS?8|PFtF0>TdlG@9-Z@7NaVJ`wz^|cpAi$)b=>&W-{an|` zb^7S?T5JM-O-r#jUlx+00XhuwC{I^H?Lu_HujG3n4+(z)w0JBdc|Zedv6=ec3vVSD zW4;FKVY-h*Zam1WZB6VgZS9&5fQn3vcm_4U=+gzCcWe&dUy_o&tgRloF~^=Y&kJWR zAJaW0qOVv5dJPf0t&~us!YSv3a8;C+!j2uYoa^V#E|ShKl5b=hIN{)h{M^v<>(ga& zJ_Mbsab2{QkRdef79Y)6Fh;I+n$r)DZst(6(rJ-nSk<13UpV zns6ciHB677@3Gb&kE%jr#Xn*2eA9NV;6pNHP>PpmumWD*V+Bfe@@IV#P-qE7{VSMMtHc;7 z=*^oq6Yk(fCMn}Vbu{0Sk`)#Q_-Jyn*3Mpa-u{M+SmQx!kkXZC*crn-?1WFc*)3Lt0tin;N)^;%7Z%p!)VvxVg$|4j8xw!+?S#25ai=+mE6Ibj*Z5GnU=P8AR|#AOk=Po&5MS4p^qV%nIer$ z3T=OPcXx8Wsp?HV^^{CQD1$^8T|AOnWmimsT;tMWZ>%N?p9kI1%q@hiA1WrT;f;_j zGGoC$<;KW(ql!~$IwtSb)#2nN^zO%`u!UZ%IGgbb^uO# zIR0JxPiiLcSY-?Y5%zCh;Rj|lI zy02Q7jGIMjkYtUmWQ*8MV=xw?E&qznzwRUg5lB5@a)np$0o$-IC+`Tt?XMoXGxCdFAVy>wgFGcFDthXa zq1$Xz;L-S$>jUFBT27w!_j*b*BOU8%VJ4lHti3GiuP*`@IcB#{wpTR=-FIjfgk`LK%R%=N-{X zQz_OyzLn^V%;~!4FmCxp5BiZd#TTdZZu=ZPdbB95Ly^C?tsq%zcW$*f&n&CEW4eQB z-a_{sH8^YR9~}4(;h^o{?|J1M)<$>zQ$%~J4s1$sgI{+-Qw+X3851|WlV9d3E@&k2 zxY_IAr$FSvu(@^OaYJu(qMWrWdWxH}7xy`C3_j z@|a^)_)sg3pkzx4cY^k(meWI5fCm+Oe8uDb#@x`(&W?H1?l7<|E-sFE;+{!C>wL~4 z);pG3W7fyRxj_zNOg2ayha1_HEc_N4gX(arzO2bT?Y|IR*yeK)u^!FZxh3SXQ!z1i=kO?b}j&lHk=RsKl%=cNJddOB+URzvumgC-gC z7pOo>^T$rNskF!z_DVK=g|#v>BYns`1EXhXXc+7u?D`KxCXMWInpW21TR&N^CfO== zy6gRDk^C~eAlV;ITl))7-D1&NfB7f)3bVVryQylG3O8G(<|->I{d|4Vf5Z-cF`Bp6 zdIe55(SupSgD>{ifFiYn?ZJ;wgtmGMWB1j`FiF(tv*3{nINRsZ+do@lJd|1EgZmu; z4L^MA?Z&I*a|0u^H`srVwp#SvV4RVG8;apKChL7DG+%l-O6O&>SYp1hMNie&9)%g6 zhkxUuHY&B)OKBC0k*lFm6d&gLPIz#z11|keU-nVX+mf*)uJty31R~eE79tHXvzX;c z84Gp3$Fp+_hig;hVq_O}ccfrTXpFYGo~p9ml0`CP=g-n)ShCie?0K1FMnQgdZ|Qv{ zCk7&rTE|-`@Q?V9hvvMU{^;xLJ3ksy@<9;g*Pjt@R1jF4)lPPozx}#qC-}1jS5kYQ z_|wFaAE-hS+QdL?2M|KDfo7b!H{$F9}+A<8s3>|TUJ|KTx>cFq*IL% ztP{|~r4JLIPWe`QvRc&-4)zcBD#gOLw>LI6{@z(*My-zpJM2gpCro(W7{38Qm$m`9 z{VX$-(*Mu;9Sy&V%E{(P{ex}usDnL+YF_f-lZgoCRL45$sd@7%m-Wn<3-!{ci$zx`1QU`ex$u^D&{Q z?K+=`jiPs2+c9nb6xJ|(;g8!_TVr?}BQ}3K?ypzo27=y@gg6RoMy=32`6kGY4A33@197vc`#6B(VJT!JX+7EOV{ozdl`b~{$=ji62@w8%= z!;SP>1Z|mGrQp6kAFg$HGT7nlr-4o1C8CA3@bk)>O#xa~rh$KVSIC~WnAnpSAG|q^s=CTy43cQyo{SNAp&hnbAH`(q z+eYkl8?JXaE9J5~9QQ|j>uX1!;imQAY#S?Ai)RJvXqcr^-CUQ%L1)}8pHsRQ>VmWo zSZWeNHacy*=1ronx8LaENdL&f0tN~%pKOjOPq#7xKLl~Lr$XOUWCdXJrJ+u@bYL)! zTgGG`Y7T47Al<^Dd^55-*F@S5i8ndzexI>OHq)|asvW6*@5bJeyL?Y6chD3E^gtBw z5gq|=1}Rm_^g&b7{)RUgA(xq940gDdaB9l|t0jsjz_Z-PLB-S*BuQ*jY=;LL`Vb{j zh`HXXCx626?Q0?Hz3-AxGZo|>4pMzZ&gJ#Lo1s@@A*oLVVn-ylYv@9qyAYbd?mV)DrpOIe{9BQVv@BcLt_r_FZ6pAv^F@2^2B0c2406GJj>k^ zHIVDO{T*Fmmo>GtBG=ez^r!>&(61a2kWG5jQa(82XnDIjF^yx_U<`|0|0_QH@>=KLGTN+OT zfV@{8StSbklG?TNH6n%?{X#q4qrnjo5f0B>iQYa9w56V^qgwrLfra0~oA(x&E#K?Z z=zCk#BS6WQM3JY-T_5NLwoDz6=)Y`P6IsITZ8&bH}^9aH1g z?hWTJYH7L6SXbVRxV*Eqy?uRAMcKwHULM>5@A7YKQ|1s?KaW6oh<1I-$bVB-d#^Mq zF4mdbBa-02`#SXROU{=$Kgw${7GUTDsiLB?N4Hz($y$V4;9oy~-m0}r)$ur&4~mwP z2V2+OW&C1)T$q{J-RZ5L$YReJoc%I%QJZ9NaW;Cly$mKem?+)&TvL(hd40B4t__4@9pr6E_67%88_Wqp8=xYzke0i?K3zmpe01^I0)kL zWYR#~rPN0djM_ z>yG=u%;5gE`ThlzR@iRMGPj%JL<$z=PjvPkGMRB5_pV(_n1oavE|TwUZ@i@b;X@-D0sRRJw9II; zKz11G@_}C02Bmp@T)`}h9Vf6AF&i`1dApQH?P$S8^-H@`z2~)A zd+Uab7QZqd=`>pNsa)&VzP_WF`JM1)dM!X*4DakTfM3JvX_^E|b7VoSs$EO?Dndg$ zd%(BCI@m(+RzfPMb|^=^hzpa1+!!c^TV&?TCsvKxok`Wyx+wJIp4LbCdx}`0&DHMt zuDnaqh1uOTjEfH6$Gttvn#hs=$d0`BEgFVTjdW}(ey9#(#{TMZ+}{@1|LHioNi@;8 zahko)IDlSzf9cXrxA}p%^l`+wXEJpe3P+!$BSTofrWflm)Xk76#$I379mbxC?Z{C! z#6Zc@|HB(;R|b!`#wFVoD!aSscfGLi%g=N9i?ju|YQKx7F6q+cnNmtJGwp)v$Q!a= zk0F-=m9s~Nkty8y%g(g+=~Jg`STr6+lUO)^ z{4u;Xd8n(Z1V5G7d-xe->L=c>{8XoeQI6PY69J+1g0^7l0$Hf=a*V*=!Tc?3pQAyT#S&65skL_4u zOiWt=-c&C31D&A<#-xF|U@(bS?LT>6$(P-cOLU$vAvfz4CaENd7s4M8P$YIyyNa16 zO-u)Ep%E^l?0hcqLK1iLeHPH)m-EbOt$al}08((xt=i$Vs8z5s(HHLEtU5ZHmhf9W z(`tZ~F|~KgKPbSZCxE(wb1E$w4`%PMc@EYb*+b@$YnF_!)6`yf^Sp%5z*IOEd`@m{ zXv}ndYhi8ItybMeK^TZLfZVn#FJgbkTZvXjEgsChT{~|Np3Ix%Z_BV9)Whu1ZF0XY(Wt!BeLyCp7f;|h9P!edyNd8=ldW;HMNRF#zME_YCO z!Xrce-L^Vr^A7r>*p*|}!g*TzE}D5yey3oUSnL4QNS5m2azKN;_v%LXu^X^tF>Ro! zWwHHVK;$9X#Qgi}>+bw;u^-+38?KgYw;aNXphj%B#_8L7;vw&AI-ci6`MA?{a<28Px@Fc*KsRB1dTQxc%*d|W*h=xb@##o#F*av-scBzV0~o*(nJ@Ao|UGU72r$?2*H5G>I_Q}E%|8f1cM~Q`!bEs|K4{`XlK2vJvOdC+R6V`~q{?SBLw|busx~n*EkU4x2F~VVl*)) z>HGcXfuImb*bTG$xuK5BHzPJjtOdlh$`<9+1wLcioJaY4$C>8M3YEYpQ;VEC>=Ow% zVT@PA2lY!pV7s%YPY*R6zOIi%dDq{V`JUY7thpHHJ9cC_WVQ>W6MOC|KJAX6FYV)} z7lkM9JA5~gW<};@_ZNB8)Q#GenvMl8{EAC{>;yNABYc``5^gOi2`HZakr5}6){RC> z56{;vy7#sXY8^nMPjK_RuBSvOXA(ZIt`4=fDs|XcPpfZK&)2-GV`zHy#U-B}G3}6$ zenROl64N|%x4PMazzU&~Mn*Pk7b$9$jxG1to}%34-@-L(JA;-hX!SWy(W?bsCEUC=e11!lJd6;b{@HpI4o?3fvg|bJ6)A&22dZ$)dm6VJNFqkabr|k#j@rVLe69V zZ=Gl}wqiR;mxz+O0mHl{dlJB07AbSjUdthHw4jILfSA|kBG zE*7G7Z?8K!a-+a~@I|@RS^PHuBFYV<&}Qa-igO?Aj$AFr;l>3f!|qm-R|ooM){8u5 zs`aV0%oSRq#NPDafgt30uaty{PZ<*YZQXs)y}F}$akqIfPODHouOITWBhfvLEKO=* zXCLg&EPLs0?|0Yxv~WCS&CbU0B#u?yG+j{Y__9o0cB3(KM?I^@C7+-Q;g H5THt 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 literal 0 HcmV?d00001 diff --git a/test/image_test.rb b/test/image_test.rb new file mode 100644 index 0000000..9ca7906 --- /dev/null +++ b/test/image_test.rb @@ -0,0 +1,204 @@ +# frozen_string_literal: true + +require "test_helper" + +class ImageTest < Minitest::Test + include EzdocTestHelpers + + def setup + @png_path = File.expand_path("fixtures/test.png", __dir__) + @jpeg_path = File.expand_path("fixtures/test.jpg", __dir__) + end + + def test_image_in_paragraph + xml = create_doc_and_read_xml do |doc| + doc.p do + doc.image @png_path + end + end + + assert_includes xml, "" + assert_includes xml, "" + assert_includes xml, 'r:embed="rId' + end + + def test_image_in_table_cell + xml = create_doc_and_read_xml do |doc| + doc.table do + doc.tr do + doc.td do + doc.image @png_path + end + end + end + end + + assert_includes xml, "" + assert_includes xml, "" + end + + def test_image_in_list_item + xml = create_doc_and_read_xml do |doc| + doc.ul do + doc.li do + doc.image @png_path + end + end + end + + assert_includes xml, "" + assert_includes xml, "" + end + + def test_image_with_explicit_dimensions_inches + xml = create_doc_and_read_xml do |doc| + doc.p do + doc.image @png_path, width: "2in", height: "1in" + end + end + + # 2 inches = 1828800 EMUs + assert_includes xml, 'cx="1828800"' + # 1 inch = 914400 EMUs + assert_includes xml, 'cy="914400"' + end + + def test_image_with_explicit_dimensions_cm + xml = create_doc_and_read_xml do |doc| + doc.p do + doc.image @png_path, width: "5cm", height: "3cm" + end + end + + # 5 cm = 1800000 EMUs + assert_includes xml, 'cx="1800000"' + # 3 cm = 1080000 EMUs + assert_includes xml, 'cy="1080000"' + end + + def test_image_file_embedded_in_docx + files = nil + Tempfile.create(["test", ".docx"]) do |file| + Ezdoc::Document.create(file.path) do |doc| + doc.p { doc.image @png_path } + end + Zip::File.open(file.path) do |zip| + files = zip.entries.map(&:name) + end + end + + assert(files.any? { |f| f.start_with?("word/media/image") }) + end + + def test_image_relationships_generated + xml_files = create_doc_and_read_all_xml do |doc| + doc.p { doc.image @png_path } + end + + rels = xml_files["word/_rels/document.xml.rels"] + assert_includes rels, "relationships/image" + assert_includes rels, "media/image" + end + + def test_image_content_type_registered + xml_files = create_doc_and_read_all_xml do |doc| + doc.p { doc.image @png_path } + end + + content_types = xml_files["[Content_Types].xml"] + assert_includes content_types, 'Extension="png"' + assert_includes content_types, "image/png" + end + + def test_jpeg_content_type_registered + xml_files = create_doc_and_read_all_xml do |doc| + doc.p { doc.image @jpeg_path } + end + + content_types = xml_files["[Content_Types].xml"] + assert_includes content_types, 'Extension="jpeg"' + assert_includes content_types, "image/jpeg" + end + + def test_invalid_image_path_raises_error + assert_raises(ArgumentError) do + Tempfile.create(["test", ".docx"]) do |file| + Ezdoc::Document.create(file.path) do |doc| + doc.p { doc.image "/nonexistent/image.png" } + end + end + end + end + + def test_unsupported_format_raises_error + Tempfile.create(["test", ".gif"]) do |gif_file| + gif_file.write("GIF89a") + gif_file.flush + + assert_raises(ArgumentError) do + Tempfile.create(["test", ".docx"]) do |docx_file| + Ezdoc::Document.create(docx_file.path) do |doc| + doc.p { doc.image gif_file.path } + end + end + end + end + end + + def test_same_image_used_multiple_times_deduplication + files = nil + Tempfile.create(["test", ".docx"]) do |file| + Ezdoc::Document.create(file.path) do |doc| + doc.p { doc.image @png_path } + doc.p { doc.image @png_path } + doc.p { doc.image @png_path } + end + Zip::File.open(file.path) do |zip| + files = zip.entries.map(&:name).select { |f| f.start_with?("word/media/") } + end + end + + # Should only have one image file despite being used 3 times + assert_equal 1, files.size + end + + def test_multiple_different_images + files = nil + Tempfile.create(["test", ".docx"]) do |file| + Ezdoc::Document.create(file.path) do |doc| + doc.p { doc.image @png_path } + doc.p { doc.image @jpeg_path } + end + Zip::File.open(file.path) do |zip| + files = zip.entries.map(&:name).select { |f| f.start_with?("word/media/") } + end + end + + assert_equal 2, files.size + end + + def test_image_with_text_in_same_paragraph + xml = create_doc_and_read_xml do |doc| + doc.p do + doc.text "Before image: " + doc.image @png_path + doc.text " After image" + end + end + + assert_includes xml, "Before image: " + assert_includes xml, "After image" + assert_includes xml, "" + end + + def test_image_dimensions_read_from_file + xml = create_doc_and_read_xml do |doc| + doc.p { doc.image @png_path } + end + + # 200x200 pixels at 96 DPI = 200 * (914400 / 96) = 1905000 EMUs + assert_includes xml, 'cx="1905000"' + assert_includes xml, 'cy="1905000"' + end +end diff --git a/test/test_helper.rb b/test/test_helper.rb index 80dd0c0..ff07b73 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -26,7 +26,9 @@ module EzdocTestHelpers Ezdoc::Document.create(file.path, &block) Zip::File.open(file.path) do |zip| zip.each do |entry| - result[entry.name] = zip.read(entry.name).force_encoding("UTF-8") if entry.name.end_with?(".xml") + if entry.name.end_with?(".xml") || entry.name.end_with?(".rels") + result[entry.name] = zip.read(entry.name).force_encoding("UTF-8") + end end end end