prawnpdf/prawn

View on GitHub
manual/repeatable_content/repeater.rb

Summary

Maintainability
A
0 mins
Test Coverage
# frozen_string_literal: true

require 'prawn/manual_builder'

Prawn::ManualBuilder::Chapter.new do
  title 'Repeater'

  text do
    prose <<~TEXT
      The <code>repeat</code> method is quite versatile when it comes to define
      the intervals at which the content block should repeat.

      The interval may be a symbol (<code>:all</code>, <code>:odd</code>,
      <code>:even</code>), an array listing the pages, a range or a
      <code>Proc</code> that receives the page number as an argument and should
      return true if the content is to be repeated on the given page.

      You may also pass an option <code>:dynamic</code> to reevaluate the code
      block on every call which is useful when the content changes based on the
      page number.

      It is also important to say that no matter where you define the repeater
      it will be applied to all matching pages.
    TEXT
  end

  example eval: false do
    repeat(:all) do
      draw_text 'All pages', at: bounds.top_left
    end

    repeat(:odd) do
      draw_text 'Only odd pages', at: [0, 0]
    end

    repeat(:even) do
      draw_text 'Only even pages', at: [0, 0]
    end

    repeat([1, 3, 7]) do
      draw_text 'Only on pages 1, 3 and 7', at: [100, 0]
    end

    repeat(2..4) do
      draw_text 'From the 2nd to the 4th page', at: [300, 0]
    end

    repeat(->(pg) { (pg % 3).zero? }) do
      draw_text 'Every third page', at: [250, 20]
    end

    repeat(:all, dynamic: true) do
      draw_text page_number, at: [500, 0]
    end

    10.times do
      start_new_page
      draw_text 'A wonderful page', at: [400, 400]
    end
  end
end