Class: Uniword::Builder::DocumentBuilder
- Inherits:
-
BaseBuilder
- Object
- BaseBuilder
- Uniword::Builder::DocumentBuilder
- Defined in:
- lib/uniword/builder/document_builder.rb
Overview
Builds and configures DocumentRoot objects.
Top-level builder for creating Word documents.
Instance Attribute Summary
Attributes inherited from BaseBuilder
Class Method Summary collapse
- .default_model_class ⇒ Object
-
.from_file(path) ⇒ DocumentBuilder
Load a document from file for manipulation.
Instance Method Summary collapse
-
#<<(element) ⇒ self
Append a top-level element (paragraph or table).
-
#apply_styleset(name, strategy: :keep_existing) ⇒ self
Apply a bundled styleset to the document.
- #author(value) ⇒ Object
-
#bibliography(style: "APA") {|BibliographyBuilder| ... } ⇒ BibliographyBuilder
Create and configure bibliography sources.
-
#bibliography_placeholder ⇒ self
Insert a bibliography placeholder (SDT content control).
-
#bookmark(name) {|ParagraphBuilder| ... } ⇒ ParagraphBuilder
Create a bookmark wrapping the next content.
-
#bullet_list {|ListBuilder| ... } ⇒ ListBuilder
Shorthand: create a bullet list.
-
#chart(type: :bar, width: nil, height: nil) {|ChartBuilder| ... } ⇒ ChartBuilder
Insert a chart into the document.
-
#comment(author:, text: nil, initials: nil) {|CommentBuilder| ... } ⇒ Comment
Create a comment and store it in the document’s comments collection.
-
#content_control(tag: nil, alias_name: nil, placeholder_text: nil) ⇒ SdtBuilder
Create a text content control paragraph.
- #created(value) ⇒ Object
-
#date_field(format: "M/d/yyyy") ⇒ self
Insert a date paragraph.
-
#define_style(name, base_on: "Normal") {|StyleBuilder| ... } ⇒ StyleBuilder
Define a paragraph style.
- #description(value) ⇒ Object
-
#endnote(text = nil) {|ParagraphBuilder| ... } ⇒ Wordprocessingml::Run
Create an endnote and return a Run with an endnoteReference.
-
#floating_image(path, width: nil, height: nil, alt_text: nil, align: nil, vertical_align: nil, wrap: :square, behind_text: false) ⇒ self
Insert a floating image paragraph.
-
#footer(type: "default") {|HeaderFooterBuilder| ... } ⇒ HeaderFooterBuilder
Configure a footer.
-
#footnote(text = nil) {|ParagraphBuilder| ... } ⇒ Wordprocessingml::Run
Create a footnote and return a Run with a footnoteReference.
-
#header(type: "default") {|HeaderFooterBuilder| ... } ⇒ HeaderFooterBuilder
Configure a header.
-
#heading(text, level: 1) {|ParagraphBuilder| ... } ⇒ ParagraphBuilder
Create and add a heading paragraph.
-
#horizontal_rule(style: "single", color: "auto", size: 6) ⇒ self
Insert a horizontal rule (paragraph with bottom border).
-
#image(path, width: nil, height: nil, alt_text: nil) ⇒ self
Insert an inline image paragraph.
-
#initialize(model = nil) ⇒ DocumentBuilder
constructor
A new instance of DocumentBuilder.
- #keywords(value) ⇒ Object
-
#list(type: :bullet) {|ListBuilder| ... } ⇒ ListBuilder
Create a list (bulleted or numbered).
- #modified(value) ⇒ Object
-
#numbered_list {|ListBuilder| ... } ⇒ ListBuilder
Shorthand: create a numbered list.
-
#page_break ⇒ self
Insert a page break.
-
#page_number ⇒ self
Insert a page number paragraph.
-
#paragraph(text = nil) {|ParagraphBuilder| ... } ⇒ ParagraphBuilder
Create and add a paragraph to the document.
-
#save(path) ⇒ Object
Save document to file.
-
#section(type: "nextPage") {|SectionBuilder| ... } ⇒ SectionBuilder
Configure section properties.
- #subject(value) ⇒ Object
-
#table {|TableBuilder| ... } ⇒ TableBuilder
Create and add a table to the document.
-
#theme(name = nil) {|ThemeBuilder| ... } ⇒ ThemeBuilder
Apply or configure a document theme.
-
#time_field(format: "h:mm:ss am/pm") ⇒ self
Insert a time paragraph.
- #title(value) ⇒ Object
-
#toc(title: "Table of Contents", styles: nil) ⇒ self
Insert a Table of Contents.
-
#total_pages ⇒ self
Insert a total pages paragraph.
-
#watermark(text, font: "Calibri", size: 60, color: nil, opacity: "0.3", angle: -45)) ⇒ self
Add a watermark to the document header.
Methods inherited from BaseBuilder
Constructor Details
#initialize(model = nil) ⇒ DocumentBuilder
Returns a new instance of DocumentBuilder.
36 37 38 39 40 41 |
# File 'lib/uniword/builder/document_builder.rb', line 36 def initialize(model = nil) super @bookmark_counter = 0 @footnote_builder = FootnoteBuilder.new(self) @comment_counter = 0 end |
Class Method Details
.default_model_class ⇒ Object
32 33 34 |
# File 'lib/uniword/builder/document_builder.rb', line 32 def self.default_model_class Wordprocessingml::DocumentRoot end |
.from_file(path) ⇒ DocumentBuilder
Load a document from file for manipulation
47 48 49 |
# File 'lib/uniword/builder/document_builder.rb', line 47 def self.from_file(path) new(Uniword.load(path)) end |
Instance Method Details
#<<(element) ⇒ self
Append a top-level element (paragraph or table)
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
# File 'lib/uniword/builder/document_builder.rb', line 55 def <<(element) case element when Wordprocessingml::Paragraph @model.body.paragraphs << element when Wordprocessingml::Table @model.body.tables << element when ParagraphBuilder @model.body.paragraphs << element.build when TableBuilder @model.body.tables << element.build else raise ArgumentError, "Cannot add #{element.class} to document" end self end |
#apply_styleset(name, strategy: :keep_existing) ⇒ self
Apply a bundled styleset to the document
297 298 299 300 |
# File 'lib/uniword/builder/document_builder.rb', line 297 def apply_styleset(name, strategy: :keep_existing) @model.apply_styleset(name, strategy: strategy) self end |
#author(value) ⇒ Object
262 263 264 265 |
# File 'lib/uniword/builder/document_builder.rb', line 262 def (value) @model.core_properties.creator = value self end |
#bibliography(style: "APA") {|BibliographyBuilder| ... } ⇒ BibliographyBuilder
Create and configure bibliography sources
426 427 428 429 430 431 |
# File 'lib/uniword/builder/document_builder.rb', line 426 def bibliography(style: "APA", &block) bib = BibliographyBuilder.new(style: style) block.call(bib) if block_given? bib.attach(self) bib end |
#bibliography_placeholder ⇒ self
Insert a bibliography placeholder (SDT content control)
436 437 438 439 440 441 442 |
# File 'lib/uniword/builder/document_builder.rb', line 436 def bibliography_placeholder sdt = SdtBuilder.bibliography.build para = Wordprocessingml::Paragraph.new para.sdts << sdt @model.body.paragraphs << para self end |
#bookmark(name) {|ParagraphBuilder| ... } ⇒ ParagraphBuilder
Create a bookmark wrapping the next content
200 201 202 203 204 205 206 207 208 209 210 211 212 |
# File 'lib/uniword/builder/document_builder.rb', line 200 def bookmark(name, &block) @bookmark_counter += 1 id = @bookmark_counter.to_s para = ParagraphBuilder.new para.model.bookmark_starts << Wordprocessingml::BookmarkStart.new(id: id, name: name) block.call(para) if block_given? para.model.bookmark_ends << Wordprocessingml::BookmarkEnd.new(id: id) @model.body.paragraphs << para.build para end |
#bullet_list {|ListBuilder| ... } ⇒ ListBuilder
Shorthand: create a bullet list
191 192 193 |
# File 'lib/uniword/builder/document_builder.rb', line 191 def bullet_list(&) list(type: :bullet, &) end |
#chart(type: :bar, width: nil, height: nil) {|ChartBuilder| ... } ⇒ ChartBuilder
Insert a chart into the document
451 452 453 454 455 456 457 458 459 460 461 462 463 |
# File 'lib/uniword/builder/document_builder.rb', line 451 def chart(type: :bar, width: nil, height: nil, &block) cb = ChartBuilder.new(chart_type: type) cb.dimensions(width: width, height: height) if width || height block.call(cb) if block_given? drawing = cb.build_drawing(self) run = Wordprocessingml::Run.new run.drawings << drawing para = Wordprocessingml::Paragraph.new para.runs << run @model.body.paragraphs << para cb end |
#comment(author:, text: nil, initials: nil) {|CommentBuilder| ... } ⇒ Comment
Create a comment and store it in the document’s comments collection.
391 392 393 394 395 396 397 398 399 400 401 402 403 404 |
# File 'lib/uniword/builder/document_builder.rb', line 391 def comment(author:, text: nil, initials: nil, &block) @comment_counter += 1 cb = CommentBuilder.new( author: , comment_id: @comment_counter.to_s, initials: initials ) cb << text if text block.call(cb) if block_given? comment_obj = cb.build @model.comments ||= [] @model.comments << comment_obj comment_obj end |
#content_control(tag: nil, alias_name: nil, placeholder_text: nil) ⇒ SdtBuilder
Create a text content control paragraph
412 413 414 415 416 417 418 419 |
# File 'lib/uniword/builder/document_builder.rb', line 412 def content_control(tag: nil, alias_name: nil, placeholder_text: nil) sdt = SdtBuilder.text( tag: tag, alias_name: alias_name, placeholder_text: placeholder_text ) @model.body.paragraphs.last&.sdts&.<<(sdt.build) sdt end |
#created(value) ⇒ Object
282 283 284 285 |
# File 'lib/uniword/builder/document_builder.rb', line 282 def created(value) @model.core_properties.created = value self end |
#date_field(format: "M/d/yyyy") ⇒ self
Insert a date paragraph
485 486 487 488 |
# File 'lib/uniword/builder/document_builder.rb', line 485 def date_field(format: "M/d/yyyy") @model.body.paragraphs << Builder.date_field(format: format) self end |
#define_style(name, base_on: "Normal") {|StyleBuilder| ... } ⇒ StyleBuilder
Define a paragraph style
250 251 252 253 254 255 |
# File 'lib/uniword/builder/document_builder.rb', line 250 def define_style(name, base_on: "Normal", &block) style = StyleBuilder.new(name, base_on: base_on) block.call(style) if block_given? @model.styles_configuration.add_style(style.build) style end |
#description(value) ⇒ Object
267 268 269 270 |
# File 'lib/uniword/builder/document_builder.rb', line 267 def description(value) @model.core_properties.description = value self end |
#endnote(text = nil) {|ParagraphBuilder| ... } ⇒ Wordprocessingml::Run
Create an endnote and return a Run with an endnoteReference.
228 229 230 |
# File 'lib/uniword/builder/document_builder.rb', line 228 def endnote(text = nil, &) @footnote_builder.endnote(text, &) end |
#floating_image(path, width: nil, height: nil, alt_text: nil, align: nil, vertical_align: nil, wrap: :square, behind_text: false) ⇒ self
Insert a floating image paragraph
345 346 347 348 349 350 351 352 353 354 355 |
# File 'lib/uniword/builder/document_builder.rb', line 345 def floating_image(path, width: nil, height: nil, alt_text: nil, align: nil, vertical_align: nil, wrap: :square, behind_text: false) para = Wordprocessingml::Paragraph.new para.runs << ImageBuilder.create_floating_run( self, path, width: width, height: height, alt_text: alt_text, align: align, wrap: wrap, behind_text: behind_text ) @model.body.paragraphs << para self end |
#footer(type: "default") {|HeaderFooterBuilder| ... } ⇒ HeaderFooterBuilder
Configure a footer
149 150 151 152 153 154 |
# File 'lib/uniword/builder/document_builder.rb', line 149 def (type: "default", &block) hf = HeaderFooterBuilder.new(:footer, type: type) block.call(hf) if block_given? (@model. ||= {})[type] = hf.build hf end |
#footnote(text = nil) {|ParagraphBuilder| ... } ⇒ Wordprocessingml::Run
Create a footnote and return a Run with a footnoteReference.
219 220 221 |
# File 'lib/uniword/builder/document_builder.rb', line 219 def footnote(text = nil, &) @footnote_builder.footnote(text, &) end |
#header(type: "default") {|HeaderFooterBuilder| ... } ⇒ HeaderFooterBuilder
Configure a header
137 138 139 140 141 142 |
# File 'lib/uniword/builder/document_builder.rb', line 137 def header(type: "default", &block) hf = HeaderFooterBuilder.new(:header, type: type) block.call(hf) if block_given? (@model.headers ||= {})[type] = hf.build hf end |
#heading(text, level: 1) {|ParagraphBuilder| ... } ⇒ ParagraphBuilder
Create and add a heading paragraph
90 91 92 93 94 95 96 |
# File 'lib/uniword/builder/document_builder.rb', line 90 def heading(text, level: 1) para = ParagraphBuilder.new para.style = "Heading#{level}" para << text @model.body.paragraphs << para.build para end |
#horizontal_rule(style: "single", color: "auto", size: 6) ⇒ self
Insert a horizontal rule (paragraph with bottom border)
308 309 310 311 312 313 314 315 316 |
# File 'lib/uniword/builder/document_builder.rb', line 308 def horizontal_rule(style: "single", color: "auto", size: 6) para = ParagraphBuilder.new para.borders( bottom: { style: style, color: color, size: size } ) para.spacing(after: 0) @model.body.paragraphs << para.build self end |
#image(path, width: nil, height: nil, alt_text: nil) ⇒ self
Insert an inline image paragraph
325 326 327 328 329 330 331 332 |
# File 'lib/uniword/builder/document_builder.rb', line 325 def image(path, width: nil, height: nil, alt_text: nil) para = Wordprocessingml::Paragraph.new para.runs << ImageBuilder.create_run( self, path, width: width, height: height, alt_text: alt_text ) @model.body.paragraphs << para self end |
#keywords(value) ⇒ Object
277 278 279 280 |
# File 'lib/uniword/builder/document_builder.rb', line 277 def keywords(value) @model.core_properties.keywords = value self end |
#list(type: :bullet) {|ListBuilder| ... } ⇒ ListBuilder
Create a list (bulleted or numbered)
173 174 175 176 177 |
# File 'lib/uniword/builder/document_builder.rb', line 173 def list(type: :bullet, &block) lb = ListBuilder.new(self, type: type) block.call(lb) if block_given? lb end |
#modified(value) ⇒ Object
287 288 289 290 |
# File 'lib/uniword/builder/document_builder.rb', line 287 def modified(value) @model.core_properties.modified = value self end |
#numbered_list {|ListBuilder| ... } ⇒ ListBuilder
Shorthand: create a numbered list
183 184 185 |
# File 'lib/uniword/builder/document_builder.rb', line 183 def numbered_list(&) list(type: :decimal, &) end |
#page_break ⇒ self
Insert a page break
101 102 103 104 105 106 |
# File 'lib/uniword/builder/document_builder.rb', line 101 def page_break @model.body.paragraphs << Wordprocessingml::Paragraph.new( runs: [Builder.page_break] ) self end |
#page_number ⇒ self
Insert a page number paragraph
468 469 470 471 |
# File 'lib/uniword/builder/document_builder.rb', line 468 def page_number @model.body.paragraphs << Builder.page_number_field self end |
#paragraph(text = nil) {|ParagraphBuilder| ... } ⇒ ParagraphBuilder
Create and add a paragraph to the document
76 77 78 79 80 81 82 |
# File 'lib/uniword/builder/document_builder.rb', line 76 def paragraph(text = nil, &block) para = ParagraphBuilder.new para << text if text block.call(para) if block_given? @model.body.paragraphs << para.build para end |
#save(path) ⇒ Object
Save document to file
502 503 504 |
# File 'lib/uniword/builder/document_builder.rb', line 502 def save(path) @model.to_file(path) end |
#section(type: "nextPage") {|SectionBuilder| ... } ⇒ SectionBuilder
Configure section properties
124 125 126 127 128 129 130 |
# File 'lib/uniword/builder/document_builder.rb', line 124 def section(type: "nextPage", &block) sec = SectionBuilder.new sec.type = type block.call(sec) if block_given? @model.body.section_properties ||= sec.build sec end |
#subject(value) ⇒ Object
272 273 274 275 |
# File 'lib/uniword/builder/document_builder.rb', line 272 def subject(value) @model.core_properties.subject = value self end |
#table {|TableBuilder| ... } ⇒ TableBuilder
Create and add a table to the document
112 113 114 115 116 117 |
# File 'lib/uniword/builder/document_builder.rb', line 112 def table(&block) tbl = TableBuilder.new block.call(tbl) if block_given? @model.body.tables << tbl.build tbl end |
#theme(name = nil) {|ThemeBuilder| ... } ⇒ ThemeBuilder
Apply or configure a document theme
237 238 239 240 241 242 |
# File 'lib/uniword/builder/document_builder.rb', line 237 def theme(name = nil, &block) tb = ThemeBuilder.new(self) tb.apply(name) if name block.call(tb) if block_given? tb end |
#time_field(format: "h:mm:ss am/pm") ⇒ self
Insert a time paragraph
494 495 496 497 |
# File 'lib/uniword/builder/document_builder.rb', line 494 def time_field(format: "h:mm:ss am/pm") @model.body.paragraphs << Builder.time_field(format: format) self end |
#title(value) ⇒ Object
257 258 259 260 |
# File 'lib/uniword/builder/document_builder.rb', line 257 def title(value) @model.core_properties.title = value self end |
#toc(title: "Table of Contents", styles: nil) ⇒ self
Insert a Table of Contents
161 162 163 164 165 166 |
# File 'lib/uniword/builder/document_builder.rb', line 161 def toc(title: "Table of Contents", styles: nil) TocBuilder.build(title: title, styles: styles).each do |para| @model.body.paragraphs << para end self end |
#total_pages ⇒ self
Insert a total pages paragraph
476 477 478 479 |
# File 'lib/uniword/builder/document_builder.rb', line 476 def total_pages @model.body.paragraphs << Builder.total_pages_field self end |
#watermark(text, font: "Calibri", size: 60, color: nil, opacity: "0.3", angle: -45)) ⇒ self
Add a watermark to the document header
366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 |
# File 'lib/uniword/builder/document_builder.rb', line 366 def watermark(text, font: "Calibri", size: 60, color: nil, opacity: "0.3", angle: -45) if text.nil? (@model.headers ||= {}).delete("default") return self end para = WatermarkBuilder.build_paragraph( text, font: font, size: size, color: color, opacity: opacity, angle: angle ) header = Wordprocessingml::Header.new header.paragraphs << para (@model.headers ||= {})["default"] = header self end |