Skip to content

Commit

Permalink
Added ability to change size of page number label and value. (h/t @cf…
Browse files Browse the repository at this point in the history
…acello)
  • Loading branch information
jdugan committed Jan 3, 2018
1 parent d0409b4 commit fd0763e
Show file tree
Hide file tree
Showing 7 changed files with 96 additions and 19 deletions.
11 changes: 11 additions & 0 deletions CHANGELOG.md
@@ -1,3 +1,14 @@
#### v1.1.2

* Enhancements
* Added font size options for page numbers. (@cfacello)

#### v1.1.1

* Enhancements
* Added character styles. (@xerespm)


#### v1.1.0

* Enhancements
Expand Down
11 changes: 8 additions & 3 deletions README.md
Expand Up @@ -300,17 +300,22 @@ docx.page # starts a new page.

### Page Numbers

Page numbers can be added to the footer via the `page_numbers` method. The method accepts optional parameters for controlling the label and alignment of the text.
Page numbers can be added to the footer via the `page_numbers` method. The method accepts optional parameters for controlling the alignment, label and size of the text.

*Page numbers are turned off by default.*

```ruby
docx.page_numbers true do
label 'Page' # sets the text that will go to the left of the page number. Defaults to nil.
align :right # sets the alignment. accepts :left, :center, and :right.
align :right # sets the alignment. accepts :left, :center, and :right.
label 'Page' # sets the text that will go to the left of the page number. Defaults to nil.
size: 24 # sets the label and number size simultaneously. units in half points.
label_size: 24 # sets the label size only. units in half points.
number_size: 20 # sets the number size only. units in half points.
end
```

The `size` option and the `label_size` and `number_size` options are mutually exclusive.


### Fonts

Expand Down
28 changes: 24 additions & 4 deletions lib/caracal/core/models/page_number_model.rb
Expand Up @@ -21,13 +21,17 @@ class PageNumberModel < BaseModel
# accessors
attr_reader :page_number_align
attr_reader :page_number_label
attr_reader :page_number_label_size
attr_reader :page_number_number_size
attr_reader :page_number_show

# initialization
def initialize(options={}, &block)
@page_number_align = DEFAULT_PAGE_NUMBER_ALIGN
@page_number_label = nil
@page_number_show = DEFAULT_PAGE_NUMBER_SHOW
@page_number_align = DEFAULT_PAGE_NUMBER_ALIGN
@page_number_label = nil
@page_number_label_size = nil
@page_number_number_size = nil
@page_number_show = DEFAULT_PAGE_NUMBER_SHOW

super options, &block
end
Expand All @@ -47,10 +51,26 @@ def label(value)
@page_number_label = value.to_s.strip # renderer will enforce trailing space
end

def label_size(value)
v = value.to_i
@page_number_label_size = (v == 0) ? nil : v
end

def number_size(value)
v = value.to_i
@page_number_number_size = (v == 0) ? nil : v
end

def show(value)
@page_number_show = !!value
end

def size(value)
v = value.to_i
@page_number_label_size = (v == 0) ? nil : v
@page_number_number_size = (v == 0) ? nil : v
end


#=============== VALIDATION ===========================

Expand All @@ -65,7 +85,7 @@ def valid?
private

def option_keys
[:align, :label, :show]
[:align, :label, :label_size, :number_size, :show]
end

end
Expand Down
12 changes: 8 additions & 4 deletions lib/caracal/core/page_numbers.rb
Expand Up @@ -22,6 +22,8 @@ def self.included(base)
# accessors
attr_reader :page_number_align
attr_reader :page_number_label
attr_reader :page_number_label_size
attr_reader :page_number_number_size
attr_reader :page_number_show


Expand All @@ -34,13 +36,15 @@ def self.included(base)
#
def page_numbers(*args, &block)
options = Caracal::Utilities.extract_options!(args)
options.merge!({ show: !!args.first }) unless args.first.nil? # careful: falsey value
options.merge!({ show: !!args.first }) unless args.first.nil? # careful: just `args.first` is falsey

model = Caracal::Core::Models::PageNumberModel.new(options, &block)
if model.valid?
@page_number_align = model.page_number_align
@page_number_label = model.page_number_label
@page_number_show = model.page_number_show
@page_number_align = model.page_number_align
@page_number_label = model.page_number_label
@page_number_label_size = model.page_number_label_size
@page_number_number_size = model.page_number_number_size
@page_number_show = model.page_number_show
else
raise Caracal::Errors::InvalidModelError, 'page_numbers :align parameter must be :left, :center, or :right'
end
Expand Down
17 changes: 14 additions & 3 deletions lib/caracal/renderers/footer_renderer.rb
Expand Up @@ -26,16 +26,27 @@ def to_xml
xml['w'].r run_options do
xml['w'].rPr do
xml['w'].rStyle({ 'w:val' => 'PageNumber' })
unless document.page_number_label_size.nil?
xml['w'].sz({ 'w:val' => document.page_number_label_size })
end
end
xml['w'].t({ 'xml:space' => 'preserve' }) do
xml.text "#{ document.page_number_label } "
end
end
end
xml['w'].fldSimple({ 'w:dirty' => '0', 'w:instr' => 'PAGE', 'w:fldLock' => '0' }) do
xml['w'].r run_options do
xml['w'].rPr
xml['w'].r run_options do
xml['w'].rPr do
unless document.page_number_number_size.nil?
xml['w'].sz({ 'w:val' => document.page_number_number_size })
xml['w'].szCs({ 'w:val' => document.page_number_number_size })
end
end
xml['w'].fldChar({ 'w:fldCharType' => 'begin' })
xml['w'].instrText({ 'xml:space' => 'preserve' }) do
xml.text 'PAGE'
end
xml['w'].fldChar({ 'w:fldCharType' => 'end' })
end
xml['w'].r run_options do
xml['w'].rPr do
Expand Down
2 changes: 1 addition & 1 deletion lib/caracal/version.rb
@@ -1,3 +1,3 @@
module Caracal
VERSION = '1.1.1'
VERSION = '1.1.2'
end
34 changes: 30 additions & 4 deletions spec/lib/caracal/core/models/page_number_model_spec.rb
Expand Up @@ -3,9 +3,11 @@
describe Caracal::Core::Models::PageNumberModel do
subject do
described_class.new do
show true
align :right
label 'Page'
show true
align :right
label 'Page'
label_size 24
number_size 20
end
end

Expand All @@ -24,6 +26,8 @@
describe 'accessors' do
it { expect(subject.page_number_align).to eq :right }
it { expect(subject.page_number_label).to eq 'Page' }
it { expect(subject.page_number_label_size).to eq 24 }
it { expect(subject.page_number_number_size).to eq 20 }
it { expect(subject.page_number_show).to eq true }
end

Expand Down Expand Up @@ -52,13 +56,35 @@
it { expect(subject.page_number_label).to eq 'Page' }
end

# .label_size
describe '.label_size' do
before { subject.label_size(28) }

it { expect(subject.page_number_label_size).to eq 28 }
end

# .number_size
describe '.number_size' do
before { subject.number_size(28) }

it { expect(subject.page_number_number_size).to eq 28 }
end

# .show
describe '.show' do
before { subject.show(true) }

it { expect(subject.page_number_show).to eq true }
end

# .size
describe '.size' do
before { subject.size(32) }

it { expect(subject.page_number_label_size).to eq 32 }
it { expect(subject.page_number_number_size).to eq 32 }
end


#=============== VALIDATIONS ==========================

Expand Down Expand Up @@ -100,7 +126,7 @@
# .option_keys
describe '.option_keys' do
let(:actual) { subject.send(:option_keys).sort }
let(:expected) { [:align, :label, :show].sort }
let(:expected) { [:align, :label, :label_size, :number_size, :show].sort }

it { expect(actual).to eq expected }
end
Expand Down

0 comments on commit fd0763e

Please sign in to comment.