caracal 1.2.0 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5e775f349922d6591347d38de57b4211581c75d1b1b1fe08f67d887d68833a6b
4
- data.tar.gz: 635e787f52491c8f06ff3dcb32cd0d573a4abc7b44aa693dc8421a74108942e0
3
+ metadata.gz: 52dc6e582d7e47010ca9fc90d1e02f20944d55faa485548c881bec1091c45e96
4
+ data.tar.gz: b6f22eebb075a7852b0ea30ea595ca6ca89f7b98e40564ff3ab2b68c9f004039
5
5
  SHA512:
6
- metadata.gz: 20b0fd3d486e99180c7a871610ba7d619d75cefc2116cb54e3920ed8bf2c036a6d93789df6570dde608cc68ece8693e272da093ad5ac26dad8962804c35f2171
7
- data.tar.gz: d69653b8075ec87ab191cf07d4bc1090fb0822b3ae05a1f24d9edfd8ac3476efa2291c46a21c8194dca4d99505fee569cf1ddaf85a4f03dce7ae1de3857cc486
6
+ metadata.gz: 9651b63df3aa217d25c8ed1f9c3676a57071f3c4e7532053c76f0d07ead18e399c0dcc79c40427959bd275966c60e8be5b72ac0620f0bfd8853aff0ff1a1ddc4
7
+ data.tar.gz: 9b9bd2396372f9fe4334eccbeddee4bff14aa7f3b14acc595fe6dbdeba858f37017c3b64d38b28b9efd60f26b11351590122bff05d73f7fb3cffefa36c9dee3a
@@ -1,3 +1,9 @@
1
+ #### v1.3.0
2
+
3
+ * Enhancements
4
+ * Added proper text highlighting. Colors are limited so we left :bgcolor option. (@rmarone)
5
+ * Added bookmarks and internal links. (@rmarone)
6
+
1
7
  #### v1.2.0
2
8
 
3
9
  * Enhancements
data/README.md CHANGED
@@ -405,15 +405,16 @@ docx.p 'Sample text.'
405
405
  docx.p 'Sample text.', style: 'custom_style'
406
406
 
407
407
  docx.p 'Sample text.' do
408
- style 'custom_style' # sets the paragraph style. generally used at the exclusion of other attributes.
409
- align :left # sets the alignment. accepts :left, :center, :right, and :both.
410
- color '333333' # sets the font color.
411
- size 32 # sets the font size. units in 1/2 points.
412
- bold true # sets whether or not to render the text with a bold weight.
413
- italic false # sets whether or not render the text in italic style.
414
- underline false # sets whether or not to underline the text.
415
- bgcolor 'cccccc' # sets the background color.
416
- vertical_align 'superscript' # sets the vertical alignment.
408
+ style 'custom_style' # sets the paragraph style. generally used at the exclusion of other attributes.
409
+ align :left # sets the alignment. accepts :left, :center, :right, and :both.
410
+ color '333333' # sets the font color.
411
+ size 32 # sets the font size. units in 1/2 points.
412
+ bold true # sets whether or not to render the text with a bold weight.
413
+ italic false # sets whether or not render the text in italic style.
414
+ underline false # sets whether or not to underline the text.
415
+ bgcolor 'cccccc' # sets the background color.
416
+ highlight_color 'yellow' # sets the highlight color. only accepts OOXML enumerations. see http://www.datypic.com/sc/ooxml/t-w_ST_HighlightColor.html.
417
+ vertical_align 'superscript' # sets the vertical alignment.
417
418
  end
418
419
  ```
419
420
 
@@ -436,23 +437,50 @@ end
436
437
 
437
438
  Links can be added inside paragraphs using the `link` method. The method accepts several optional parameters for controlling the style and behavior of the rule.
438
439
 
439
- *At present, all links are assumed to be external.*
440
-
441
440
  ```ruby
442
441
  p do
443
442
  link 'Example Text', 'https://wwww.example.com' do
444
- font 'Courier New' # sets the font name to use. defaults to nil.
445
- color '0000ff' # sets the color of the text. defaults to 1155cc.
446
- size 24 # sets the font size. units in half-points. defaults to nil.
447
- bold false # sets whether or not the text will be bold. defaults to false.
448
- italic false # sets whether or not the text will be italic. defaults to false.
449
- underline true # sets whether or not the text will be underlined. defaults to true.
450
- bgcolor 'cccccc' # sets the background color.
443
+ internal false # sets whether or not the link references an external url. defaults to false.
444
+ font 'Courier New' # sets the font name to use. defaults to nil.
445
+ color '0000ff' # sets the color of the text. defaults to 1155cc.
446
+ size 24 # sets the font size. units in half-points. defaults to nil.
447
+ bold false # sets whether or not the text will be bold. defaults to false.
448
+ italic false # sets whether or not the text will be italic. defaults to false.
449
+ underline true # sets whether or not the text will be underlined. defaults to true.
450
+ bgcolor 'cccccc' # sets the background color.
451
+ highlight_color 'yellow' # sets the highlight color. only accepts OOXML enumerations. see http://www.datypic.com/sc/ooxml/t-w_ST_HighlightColor.html.
451
452
  end
452
453
  end
453
454
  ```
454
455
 
455
456
 
457
+ ### Bookmarks
458
+
459
+ Bookmarks can be added directly to the document or inside paragraph blocks using the `bookmark_start` and `bookmark_end`
460
+ methods. Bookmarks can be inserted at the document-level to describe section headings, etc. or inside
461
+ of a paragraph block for fine-grained linking.
462
+
463
+ ```ruby
464
+ # document-level bookmark
465
+ dox.bookmark_start id: 's1', name: 'section1'
466
+ docx.h2 'Section Heading'
467
+ docx.bookmark_end id: 's1'
468
+ docx.p 'Section content.'
469
+
470
+ # pargraph-level bookmark
471
+ docx.h2 'Section Heading'
472
+ docx.p do
473
+ text 'Pretend this paragraph has a lot of text and we want to bookmark '
474
+ bookmark_start id: 'p1', name: 'phrase1'
475
+ text 'a single phrase'
476
+ bookmark_end id: 'p1'
477
+ text ' inside the larger block.'
478
+ end
479
+ ```
480
+
481
+ Bookmarks work in conjunction with internal links. Please see above.
482
+
483
+
456
484
  ### Headings
457
485
 
458
486
  Headings can be added using the `h1`, `h2`, `h3`, `h4`, `h5`, and `h6` methods. Headings are simply paragraph commands with a specific style set, so anything you can do with a paragraph is available to a heading.
@@ -643,9 +671,9 @@ It is possible to merge cells vertically and horizontally using the `rowspan` an
643
671
 
644
672
  ```ruby
645
673
  docx.table [['11', '1213', '14'], ['21', '22', '23', '24']] do
646
- cell_style rows[0][0], rowspan: 2
647
- cell_style rows[0][1], colspan: 2
648
- cell_style rows[0][2], rowspan: 2
674
+ cell_style rows[0][0], rowspan: 2
675
+ cell_style rows[0][1], colspan: 2
676
+ cell_style rows[0][2], rowspan: 2
649
677
  end
650
678
  ```
651
679
 
@@ -659,10 +687,10 @@ If your table contains more complex data (multiple paragraphs, images, lists, et
659
687
  c1 = Caracal::Core::Models::TableCellModel.new do
660
688
  background 'cccccc' # sets the background color. defaults to 'ffffff'.
661
689
  margins do
662
- top # sets the top margin. defaults to 0. units in twips.
663
- bottom # sets the bottom margin. defaults to 0. units in twips.
664
- left # sets the left margin. defaults to 0. units in twips.
665
- right # sets the right margin. defaults to 0. units in twips.
690
+ top # sets the top margin. defaults to 100. units in twips.
691
+ bottom # sets the bottom margin. defaults to 100. units in twips.
692
+ left # sets the left margin. defaults to 100. units in twips.
693
+ right # sets the right margin. defaults to 100. units in twips.
666
694
  end
667
695
 
668
696
  p 'This is a sentence above an image.'
@@ -0,0 +1,52 @@
1
+ require 'caracal/core/models/bookmark_model'
2
+ require 'caracal/errors'
3
+
4
+
5
+ module Caracal
6
+ module Core
7
+
8
+ # This module encapsulates all the functionality related to adding
9
+ # bookmarks to the document.
10
+ #
11
+ module Bookmarks
12
+ def self.included(base)
13
+ base.class_eval do
14
+
15
+ #------------------------------------------------
16
+ # Public Methods
17
+ #------------------------------------------------
18
+
19
+ #========== BOOKMARKS ===========================
20
+
21
+ def bookmark_start(*args, &block)
22
+ options = Caracal::Utilities.extract_options!(args)
23
+ options.merge!({ start: true})
24
+
25
+ model = Caracal::Core::Models::BookmarkModel.new(options, &block)
26
+ if model.valid?
27
+ contents << model
28
+ else
29
+ raise Caracal::Errors::InvalidModelError, 'Bookmark starting tags require an id and a name.'
30
+ end
31
+ model
32
+ end
33
+
34
+ def bookmark_end(*args, &block)
35
+ options = Caracal::Utilities.extract_options!(args)
36
+ options.merge!({ start: false})
37
+
38
+ model = Caracal::Core::Models::BookmarkModel.new(options, &block)
39
+ if model.valid?
40
+ contents << model
41
+ else
42
+ raise Caracal::Errors::InvalidModelError, 'Bookmark ending tags require an id.'
43
+ end
44
+ model
45
+ end
46
+
47
+ end
48
+ end
49
+ end
50
+
51
+ end
52
+ end
@@ -0,0 +1,86 @@
1
+ require 'caracal/core/models/base_model'
2
+
3
+
4
+ module Caracal
5
+ module Core
6
+ module Models
7
+
8
+ # This class encapsulates the logic needed to store and manipulate
9
+ # bookmarks.
10
+ #
11
+ class BookmarkModel < BaseModel
12
+
13
+ #--------------------------------------------------
14
+ # Configuration
15
+ #--------------------------------------------------
16
+
17
+ # accessors
18
+ attr_reader :bookmark_start
19
+ attr_reader :bookmark_id
20
+ attr_reader :bookmark_name
21
+
22
+
23
+ #--------------------------------------------------
24
+ # Public Methods
25
+ #--------------------------------------------------
26
+
27
+ #========== GETTERS ===============================
28
+
29
+ # .run_attributes
30
+ def run_attributes
31
+ {
32
+ start: bookmark_start,
33
+ id: bookmark_id,
34
+ name: bookmark_name
35
+ }
36
+ end
37
+
38
+
39
+ #========== SETTERS ===============================
40
+
41
+ # booleans
42
+ [:start].each do |m|
43
+ define_method "#{ m }" do |value|
44
+ instance_variable_set("@bookmark_#{ m }", !!value)
45
+ end
46
+ end
47
+
48
+ # strings
49
+ [:id, :name].each do |m|
50
+ define_method "#{ m }" do |value|
51
+ instance_variable_set("@bookmark_#{ m }", value.to_s)
52
+ end
53
+ end
54
+
55
+
56
+ #========== STATE HELPERS =========================
57
+
58
+ def start?
59
+ !!bookmark_start
60
+ end
61
+
62
+
63
+ #========== VALIDATION ============================
64
+
65
+ def valid?
66
+ a = [:id]
67
+ a << :name if start?
68
+
69
+ a.map { |m| send("bookmark_#{ m }") }.compact.size == a.size
70
+ end
71
+
72
+
73
+ #--------------------------------------------------
74
+ # Private Methods
75
+ #--------------------------------------------------
76
+ private
77
+
78
+ def option_keys
79
+ [:id, :name, :start]
80
+ end
81
+
82
+ end
83
+
84
+ end
85
+ end
86
+ end
@@ -10,9 +10,9 @@ module Caracal
10
10
  #
11
11
  class LinkModel < TextModel
12
12
 
13
- #-------------------------------------------------------------
13
+ #--------------------------------------------------
14
14
  # Configuration
15
- #-------------------------------------------------------------
15
+ #--------------------------------------------------
16
16
 
17
17
  # constants
18
18
  const_set(:DEFAULT_LINK_COLOR, '1155cc')
@@ -21,14 +21,17 @@ module Caracal
21
21
  # readers (create aliases for superclass methods to conform
22
22
  # to expected naming convention.)
23
23
  attr_reader :link_href
24
- alias_method :link_content, :text_content
25
- alias_method :link_font, :text_font
26
- alias_method :link_color, :text_color
27
- alias_method :link_size, :text_size
28
- alias_method :link_bold, :text_bold
29
- alias_method :link_italic, :text_italic
30
- alias_method :link_underline, :text_underline
31
- alias_method :link_bgcolor, :text_bgcolor
24
+ attr_reader :link_internal
25
+ alias_method :link_content, :text_content
26
+ alias_method :link_font, :text_font
27
+ alias_method :link_color, :text_color
28
+ alias_method :link_size, :text_size
29
+ alias_method :link_bold, :text_bold
30
+ alias_method :link_italic, :text_italic
31
+ alias_method :link_underline, :text_underline
32
+ alias_method :link_bgcolor, :text_bgcolor
33
+ alias_method :link_highlight_color, :text_highlight_color
34
+ alias_method :link_vertical_align, :text_vertical_align
32
35
 
33
36
  # initialization
34
37
  def initialize(options={}, &block)
@@ -39,11 +42,18 @@ module Caracal
39
42
  end
40
43
 
41
44
 
42
- #-------------------------------------------------------------
45
+ #--------------------------------------------------
43
46
  # Public Instance Methods
44
- #-------------------------------------------------------------
47
+ #--------------------------------------------------
45
48
 
46
- #=============== SETTERS ==============================
49
+ #========== SETTERS ===============================
50
+
51
+ # booleans
52
+ [:internal].each do |m|
53
+ define_method "#{ m }" do |value|
54
+ instance_variable_set("@link_#{ m }", !!value)
55
+ end
56
+ end
47
57
 
48
58
  # strings
49
59
  [:href].each do |m|
@@ -53,7 +63,14 @@ module Caracal
53
63
  end
54
64
 
55
65
 
56
- #=============== VALIDATION ===========================
66
+ #========== STATE HELPERS =========================
67
+
68
+ def external?
69
+ !link_internal
70
+ end
71
+
72
+
73
+ #========== VALIDATION ============================
57
74
 
58
75
  def valid?
59
76
  a = [:content, :href]
@@ -61,13 +78,13 @@ module Caracal
61
78
  end
62
79
 
63
80
 
64
- #-------------------------------------------------------------
81
+ #--------------------------------------------------
65
82
  # Private Instance Methods
66
- #-------------------------------------------------------------
83
+ #--------------------------------------------------
67
84
  private
68
85
 
69
86
  def option_keys
70
- (super + [:href]).flatten
87
+ (super + [:internal, :href]).flatten
71
88
  end
72
89
 
73
90
  end
@@ -1,4 +1,5 @@
1
1
  require 'caracal/core/models/base_model'
2
+ require 'caracal/core/models/bookmark_model'
2
3
  require 'caracal/core/models/link_model'
3
4
  require 'caracal/core/models/text_model'
4
5
  require 'caracal/errors'
@@ -13,9 +14,9 @@ module Caracal
13
14
  #
14
15
  class ParagraphModel < BaseModel
15
16
 
16
- #-------------------------------------------------------------
17
+ #--------------------------------------------------
17
18
  # Configuration
18
- #-------------------------------------------------------------
19
+ #--------------------------------------------------
19
20
 
20
21
  # readers
21
22
  attr_reader :paragraph_style
@@ -35,11 +36,11 @@ module Caracal
35
36
  end
36
37
 
37
38
 
38
- #-------------------------------------------------------------
39
+ #--------------------------------------------------
39
40
  # Public Instance Methods
40
- #-------------------------------------------------------------
41
+ #--------------------------------------------------
41
42
 
42
- #=============== GETTERS ==============================
43
+ #========== GETTERS ===============================
43
44
 
44
45
  # .runs
45
46
  def runs
@@ -59,7 +60,7 @@ module Caracal
59
60
  end
60
61
 
61
62
 
62
- #=============== SETTERS ==============================
63
+ #========== SETTERS ===============================
63
64
 
64
65
  # booleans
65
66
  [:bold, :italic, :underline].each do |m|
@@ -90,7 +91,33 @@ module Caracal
90
91
  end
91
92
 
92
93
 
93
- #=============== SUB-METHODS ===========================
94
+ #========== SUB-METHODS ===========================
95
+
96
+ # .bookmarks
97
+ def bookmark_start(*args, &block)
98
+ options = Caracal::Utilities.extract_options!(args)
99
+ options.merge!({ start: true})
100
+
101
+ model = Caracal::Core::Models::BookmarkModel.new(options, &block)
102
+ if model.valid?
103
+ runs << model
104
+ else
105
+ raise Caracal::Errors::InvalidModelError, 'Bookmark starting tags require an id and a name.'
106
+ end
107
+ model
108
+ end
109
+ def bookmark_end(*args, &block)
110
+ options = Caracal::Utilities.extract_options!(args)
111
+ options.merge!({ start: false})
112
+
113
+ model = Caracal::Core::Models::BookmarkModel.new(options, &block)
114
+ if model.valid?
115
+ runs << model
116
+ else
117
+ raise Caracal::Errors::InvalidModelError, 'Bookmark ending tags require an id.'
118
+ end
119
+ model
120
+ end
94
121
 
95
122
  # .br
96
123
  def br
@@ -136,16 +163,16 @@ module Caracal
136
163
  end
137
164
 
138
165
 
139
- #=============== VALIDATION ===========================
166
+ #========== VALIDATION ============================
140
167
 
141
168
  def valid?
142
169
  runs.size > 0
143
170
  end
144
171
 
145
172
 
146
- #-------------------------------------------------------------
173
+ #--------------------------------------------------
147
174
  # Private Instance Methods
148
- #-------------------------------------------------------------
175
+ #--------------------------------------------------
149
176
  private
150
177
 
151
178
  def option_keys
@@ -24,6 +24,7 @@ module Caracal
24
24
  attr_reader :text_italic
25
25
  attr_reader :text_underline
26
26
  attr_reader :text_bgcolor
27
+ attr_reader :text_highlight_color
27
28
  attr_reader :text_vertical_align
28
29
 
29
30
 
@@ -37,15 +38,16 @@ module Caracal
37
38
  # .run_attributes
38
39
  def run_attributes
39
40
  {
40
- style: text_style,
41
- font: text_font,
42
- color: text_color,
43
- size: text_size,
44
- bold: text_bold,
45
- italic: text_italic,
46
- underline: text_underline,
47
- bgcolor: text_bgcolor,
48
- vertical_align: text_vertical_align
41
+ style: text_style,
42
+ font: text_font,
43
+ color: text_color,
44
+ size: text_size,
45
+ bold: text_bold,
46
+ italic: text_italic,
47
+ underline: text_underline,
48
+ bgcolor: text_bgcolor,
49
+ highlight_color: text_highlight_color,
50
+ vertical_align: text_vertical_align
49
51
  }
50
52
  end
51
53
 
@@ -67,7 +69,7 @@ module Caracal
67
69
  end
68
70
 
69
71
  # strings
70
- [:bgcolor, :color, :content, :font, :style].each do |m|
72
+ [:bgcolor, :color, :content, :font, :highlight_color, :style].each do |m|
71
73
  define_method "#{ m }" do |value|
72
74
  instance_variable_set("@text_#{ m }", value.to_s)
73
75
  end
@@ -95,7 +97,7 @@ module Caracal
95
97
  private
96
98
 
97
99
  def option_keys
98
- [:content, :style, :font, :color, :size, :bold, :italic, :underline, :bgcolor, :vertical_align]
100
+ [:content, :style, :font, :color, :size, :bold, :italic, :underline, :bgcolor, :highlight_color, :vertical_align]
99
101
  end
100
102
 
101
103
  def method_missing(method, *args, &block)
@@ -1,6 +1,7 @@
1
1
  require 'open-uri'
2
2
  require 'zip'
3
3
 
4
+ require 'caracal/core/bookmarks'
4
5
  require 'caracal/core/custom_properties'
5
6
  require 'caracal/core/file_name'
6
7
  require 'caracal/core/fonts'
@@ -53,6 +54,7 @@ module Caracal
53
54
  include Caracal::Core::Styles
54
55
  include Caracal::Core::ListStyles
55
56
 
57
+ include Caracal::Core::Bookmarks
56
58
  include Caracal::Core::IFrames
57
59
  include Caracal::Core::Images
58
60
  include Caracal::Core::Lists
@@ -41,4 +41,4 @@ module Caracal
41
41
 
42
42
  end
43
43
  end
44
- end
44
+ end
@@ -82,6 +82,7 @@ module Caracal
82
82
  xml['w'].i( { 'w:val' => (attrs[:italic] ? '1' : '0') }) unless attrs[:italic].nil?
83
83
  xml['w'].u( { 'w:val' => (attrs[:underline] ? 'single' : 'none') }) unless attrs[:underline].nil?
84
84
  xml['w'].shd( { 'w:fill' => attrs[:bgcolor], 'w:val' => 'clear' }) unless attrs[:bgcolor].nil?
85
+ xml['w'].highlight( { 'w:val' => attrs[:highlight_color] }) unless attrs[:highlight_color].nil?
85
86
  xml['w'].vertAlign( { 'w:val' => attrs[:vertical_align] }) unless attrs[:vertical_align].nil?
86
87
  unless attrs[:font].nil?
87
88
  f = attrs[:font]
@@ -97,6 +98,14 @@ module Caracal
97
98
 
98
99
  #============= MODEL RENDERERS ===========================
99
100
 
101
+ def render_bookmark(xml, model)
102
+ if model.start?
103
+ xml['w'].bookmarkStart({ 'w:id' => model.bookmark_id, 'w:name' => model.bookmark_name })
104
+ else
105
+ xml['w'].bookmarkEnd({ 'w:id' => model.bookmark_id })
106
+ end
107
+ end
108
+
100
109
  def render_iframe(xml, model)
101
110
  ::Zip::File.open(model.file) do |zip|
102
111
  a_href = 'http://schemas.openxmlformats.org/drawingml/2006/main'
@@ -195,9 +204,14 @@ module Caracal
195
204
  end
196
205
 
197
206
  def render_link(xml, model)
198
- rel = document.relationship({ target: model.link_href, type: :link })
207
+ if model.external?
208
+ rel = document.relationship({ target: model.link_href, type: :link })
209
+ hyperlink_options = { 'r:id' => rel.formatted_id }
210
+ else
211
+ hyperlink_options = { 'w:anchor' => model.link_href }
212
+ end
199
213
 
200
- xml['w'].hyperlink({ 'r:id' => rel.formatted_id }) do
214
+ xml['w'].hyperlink(hyperlink_options) do
201
215
  xml['w'].r run_options do
202
216
  render_run_attributes(xml, model, false)
203
217
  xml['w'].t({ 'xml:space' => 'preserve' }, model.link_content)
@@ -1,3 +1,3 @@
1
1
  module Caracal
2
- VERSION = '1.2.0'
2
+ VERSION = '1.3.0'
3
3
  end
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+
3
+ describe Caracal::Core::Bookmarks do
4
+ subject { Caracal::Document.new }
5
+
6
+
7
+ #-------------------------------------------------------------
8
+ # Public Methods
9
+ #-------------------------------------------------------------
10
+
11
+ describe 'public method tests' do
12
+
13
+ # .bookmark_start
14
+ describe '.bookmark_start' do
15
+ let!(:size) { subject.contents.size }
16
+
17
+ before { subject.send('bookmark_start', id: '123', name: 'abc') }
18
+
19
+ it { expect(subject.contents.size).to eq size + 1 }
20
+ it { expect(subject.contents.last).to be_a(Caracal::Core::Models::BookmarkModel) }
21
+ end
22
+
23
+ # .bookmark_end
24
+ describe '.bookmark_end' do
25
+ let!(:size) { subject.contents.size }
26
+
27
+ before { subject.send('bookmark_end', id: '123') }
28
+
29
+ it { expect(subject.contents.size).to eq size + 1 }
30
+ it { expect(subject.contents.last).to be_a(Caracal::Core::Models::BookmarkModel) }
31
+ end
32
+
33
+ end
34
+
35
+ end
@@ -0,0 +1,135 @@
1
+ require 'spec_helper'
2
+
3
+ describe Caracal::Core::Models::BookmarkModel do
4
+ subject do
5
+ described_class.new do
6
+ id '0'
7
+ name 'myAnchor'
8
+ start false
9
+ end
10
+ end
11
+
12
+ #-------------------------------------------------------------
13
+ # Configuration
14
+ #-------------------------------------------------------------
15
+
16
+ describe 'configuration tests' do
17
+
18
+ # accessors
19
+ describe 'accessors' do
20
+ it { expect(subject.bookmark_id).to eq '0' }
21
+ it { expect(subject.bookmark_name).to eq 'myAnchor' }
22
+ it { expect(subject.bookmark_start).to eq false }
23
+ end
24
+
25
+ end
26
+
27
+
28
+ #-------------------------------------------------------------
29
+ # Public Methods
30
+ #-------------------------------------------------------------
31
+
32
+ describe 'public method tests' do
33
+
34
+ #=============== GETTERS ==========================
35
+
36
+ # .run_attributes
37
+ describe '.run_attributes' do
38
+ let(:expected) { { id: '0', name: 'myAnchor', start: false} }
39
+
40
+ it { expect(subject.run_attributes).to eq expected }
41
+ end
42
+
43
+
44
+ #=============== SETTERS ==========================
45
+
46
+ # booleans
47
+ describe '.start' do
48
+ before { subject.start(true) }
49
+
50
+ it { expect(subject.bookmark_start).to eq true }
51
+ end
52
+
53
+ # strings
54
+ describe '.id' do
55
+ before { subject.id('dddddd') }
56
+
57
+ it { expect(subject.bookmark_id).to eq 'dddddd' }
58
+ end
59
+ describe '.name' do
60
+ before { subject.name('999999') }
61
+
62
+ it { expect(subject.bookmark_name).to eq '999999' }
63
+ end
64
+
65
+
66
+ #=============== STATE HELPERS ========================
67
+
68
+ describe '.start?' do
69
+ describe 'when start is true' do
70
+ before { subject.start(true) }
71
+
72
+ it { expect(subject.start?).to eq true }
73
+ end
74
+ describe 'when start is false' do
75
+ before { subject.start(false) }
76
+
77
+ it { expect(subject.start?).to eq false }
78
+ end
79
+ end
80
+
81
+
82
+ #=============== VALIDATION ===========================
83
+
84
+ describe '.valid?' do
85
+ describe 'when required attributes provided' do
86
+ it { expect(subject.valid?).to eq true }
87
+ end
88
+ describe 'when start is true' do
89
+ before { subject.start(true) }
90
+
91
+ [:id, :name].each do |prop|
92
+ describe "when #{ prop } is empty" do
93
+ before do
94
+ allow(subject).to receive("bookmark_#{ prop }").and_return(nil)
95
+ end
96
+
97
+ it { expect(subject.valid?).to eq false }
98
+ end
99
+ end
100
+ end
101
+ describe 'when start is false' do
102
+ before { subject.start(false) }
103
+
104
+ [:id].each do |prop|
105
+ describe "when #{ prop } is empty" do
106
+ before do
107
+ allow(subject).to receive("bookmark_#{ prop }").and_return(nil)
108
+ end
109
+
110
+ it { expect(subject.valid?).to eq false }
111
+ end
112
+ end
113
+ end
114
+ end
115
+
116
+ end
117
+
118
+
119
+ #-------------------------------------------------------------
120
+ # Private Methods
121
+ #-------------------------------------------------------------
122
+
123
+ describe 'private method tests' do
124
+
125
+ # .option_keys
126
+ describe '.option_keys' do
127
+ let(:actual) { subject.send(:option_keys).sort }
128
+ let(:expected) { [:id, :name, :start].sort }
129
+
130
+ it { expect(actual).to eq expected }
131
+ end
132
+
133
+ end
134
+
135
+ end
@@ -3,16 +3,18 @@ require 'spec_helper'
3
3
  describe Caracal::Core::Models::LinkModel do
4
4
  subject do
5
5
  described_class.new do
6
- content 'Link Text'
7
- href 'http://www.google.com'
8
- font 'Courier New'
9
- color '666666'
10
- size 20
11
- bold false
12
- italic false
13
- underline true
14
- bgcolor 'cccccc'
15
- vertical_align :top
6
+ content 'Link Text'
7
+ href 'http://www.google.com'
8
+ internal false
9
+ font 'Courier New'
10
+ color '666666'
11
+ size 20
12
+ bold false
13
+ italic false
14
+ underline true
15
+ bgcolor 'cccccc'
16
+ highlight_color 'yellow'
17
+ vertical_align :top
16
18
  end
17
19
  end
18
20
 
@@ -32,6 +34,7 @@ describe Caracal::Core::Models::LinkModel do
32
34
  describe 'accessors' do
33
35
  it { expect(subject.link_content).to eq 'Link Text' }
34
36
  it { expect(subject.link_href).to eq 'http://www.google.com' }
37
+ it { expect(subject.link_internal).to eq false }
35
38
  it { expect(subject.link_font).to eq 'Courier New' }
36
39
  it { expect(subject.link_color).to eq '666666' }
37
40
  it { expect(subject.link_size).to eq 20 }
@@ -39,6 +42,8 @@ describe Caracal::Core::Models::LinkModel do
39
42
  it { expect(subject.link_italic).to eq false }
40
43
  it { expect(subject.link_underline).to eq true }
41
44
  it { expect(subject.link_bgcolor).to eq 'cccccc' }
45
+ it { expect(subject.link_highlight_color).to eq 'yellow' }
46
+ it { expect(subject.link_vertical_align).to eq :top }
42
47
  end
43
48
 
44
49
  end
@@ -54,7 +59,7 @@ describe Caracal::Core::Models::LinkModel do
54
59
 
55
60
  # .run_attributes
56
61
  describe '.run_attributes' do
57
- let(:expected) { { style: nil, font: 'Courier New', color: '666666', size: 20, bold: false, italic: false, underline: true, bgcolor: 'cccccc', vertical_align: :top } }
62
+ let(:expected) { { style: nil, font: 'Courier New', color: '666666', size: 20, bold: false, italic: false, underline: true, bgcolor: 'cccccc', highlight_color: 'yellow', vertical_align: :top } }
58
63
 
59
64
  it { expect(subject.run_attributes).to eq expected }
60
65
  end
@@ -68,6 +73,11 @@ describe Caracal::Core::Models::LinkModel do
68
73
 
69
74
  it { expect(subject.link_bold).to eq true }
70
75
  end
76
+ describe '.internal' do
77
+ before { subject.internal(true) }
78
+
79
+ it { expect(subject.link_internal).to eq true }
80
+ end
71
81
  describe '.italic' do
72
82
  before { subject.italic(true) }
73
83
 
@@ -102,15 +112,31 @@ describe Caracal::Core::Models::LinkModel do
102
112
 
103
113
  it { expect(subject.link_content).to eq 'Something Else' }
104
114
  end
115
+ describe '.font' do
116
+ before { subject.font('Palantino') }
117
+
118
+ it { expect(subject.link_font).to eq 'Palantino' }
119
+ end
105
120
  describe '.href' do
106
121
  before { subject.href('http://www.google.com') }
107
122
 
108
123
  it { expect(subject.link_href).to eq 'http://www.google.com' }
109
124
  end
110
- describe '.font' do
111
- before { subject.font('Palantino') }
112
125
 
113
- it { expect(subject.link_font).to eq 'Palantino' }
126
+
127
+ #=============== STATE HELPERS ========================
128
+
129
+ describe '.external?' do
130
+ describe 'when internal is true' do
131
+ before { subject.internal(true) }
132
+
133
+ it { expect(subject.external?).to eq false }
134
+ end
135
+ describe 'when internal is false' do
136
+ before { subject.internal(false) }
137
+
138
+ it { expect(subject.external?).to eq true }
139
+ end
114
140
  end
115
141
 
116
142
 
@@ -143,7 +169,7 @@ describe Caracal::Core::Models::LinkModel do
143
169
  # .option_keys
144
170
  describe '.option_keys' do
145
171
  let(:actual) { subject.send(:option_keys).sort }
146
- let(:expected) { [:content, :href, :style, :font, :color, :size, :bold, :italic, :underline, :bgcolor, :vertical_align].sort }
172
+ let(:expected) { [:content, :href, :internal, :style, :font, :color, :size, :bold, :highlight_color, :italic, :underline, :bgcolor, :vertical_align].sort }
147
173
 
148
174
  it { expect(actual).to eq expected }
149
175
  end
@@ -137,6 +137,23 @@ describe Caracal::Core::Models::ParagraphModel do
137
137
  it { expect(subject.runs.size).to eq length + 1 }
138
138
  end
139
139
 
140
+ # .bookmark
141
+ describe '.bookmark_start' do
142
+ let!(:length) { subject.runs.length }
143
+
144
+ before { subject.bookmark_start(id:'1', name:'abc')}
145
+
146
+ it { expect(subject.runs.size).to eq length + 1 }
147
+ end
148
+
149
+ describe '.bookmark_end' do
150
+ let!(:length) { subject.runs.length }
151
+
152
+ before { subject.bookmark_end {id:'1'}}
153
+
154
+ it { expect(subject.runs.size).to eq length + 1 }
155
+ end
156
+
140
157
 
141
158
  #=============== VALIDATION ===========================
142
159
 
@@ -220,7 +220,7 @@ describe Caracal::Core::Models::TableCellModel do
220
220
  # .option_keys
221
221
  describe '.option_keys' do
222
222
  let(:actual) { subject.send(:option_keys).sort }
223
- let(:expected) { [:background, :width, :vertical_align, :margins].sort }
223
+ let(:expected) { [:background, :colspan, :rowspan, :width, :vertical_align, :margins].sort }
224
224
 
225
225
  it { expect(actual).to eq expected }
226
226
  end
@@ -12,6 +12,7 @@ describe Caracal::Core::Models::TextModel do
12
12
  underline true
13
13
  bgcolor 'cccccc'
14
14
  vertical_align :subscript
15
+ highlight_color 'yellow'
15
16
  end
16
17
  end
17
18
 
@@ -31,6 +32,7 @@ describe Caracal::Core::Models::TextModel do
31
32
  it { expect(subject.text_italic).to eq false }
32
33
  it { expect(subject.text_underline).to eq true }
33
34
  it { expect(subject.text_bgcolor).to eq 'cccccc' }
35
+ it { expect(subject.text_highlight_color).to eq 'yellow' }
34
36
  it { expect(subject.text_vertical_align).to eq :subscript }
35
37
  end
36
38
 
@@ -47,7 +49,7 @@ describe Caracal::Core::Models::TextModel do
47
49
 
48
50
  # .run_attributes
49
51
  describe '.run_attributes' do
50
- let(:expected) { { style: nil, font: 'Courier New', color: '666666', size: 20, bold: false, italic: false, underline: true, bgcolor: 'cccccc', vertical_align: :subscript } }
52
+ let(:expected) { { style: nil, font: 'Courier New', color: '666666', size: 20, bold: false, italic: false, underline: true, bgcolor: 'cccccc', highlight_color: 'yellow', vertical_align: :subscript } }
51
53
 
52
54
  it { expect(subject.run_attributes).to eq expected }
53
55
  end
@@ -81,9 +83,9 @@ describe Caracal::Core::Models::TextModel do
81
83
 
82
84
  # strings
83
85
  describe '.bgcolor' do
84
- before { subject.color('dddddd') }
86
+ before { subject.bgcolor('dddddd') }
85
87
 
86
- it { expect(subject.text_color).to eq 'dddddd' }
88
+ it { expect(subject.text_bgcolor).to eq 'dddddd' }
87
89
  end
88
90
  describe '.color' do
89
91
  before { subject.color('999999') }
@@ -100,6 +102,11 @@ describe Caracal::Core::Models::TextModel do
100
102
 
101
103
  it { expect(subject.text_font).to eq 'Palantino' }
102
104
  end
105
+ describe '.hightlight_color' do
106
+ before { subject.highlight_color('green') }
107
+
108
+ it { expect(subject.text_highlight_color).to eq 'green' }
109
+ end
103
110
 
104
111
  #symbols
105
112
  describe '.vertical_align' do
@@ -137,7 +144,7 @@ describe Caracal::Core::Models::TextModel do
137
144
  # .option_keys
138
145
  describe '.option_keys' do
139
146
  let(:actual) { subject.send(:option_keys).sort }
140
- let(:expected) { [:bgcolor, :bold, :color, :content, :font, :italic, :size, :style, :underline, :vertical_align].sort }
147
+ let(:expected) { [:bgcolor, :bold, :color, :content, :font, :highlight_color, :italic, :size, :style, :underline, :vertical_align].sort }
141
148
 
142
149
  it { expect(actual).to eq expected }
143
150
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: caracal
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Trade Infomatics
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2018-05-30 00:00:00.000000000 Z
12
+ date: 2018-08-28 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: nokogiri
@@ -112,6 +112,7 @@ files:
112
112
  - Rakefile
113
113
  - caracal.gemspec
114
114
  - lib/caracal.rb
115
+ - lib/caracal/core/bookmarks.rb
115
116
  - lib/caracal/core/custom_properties.rb
116
117
  - lib/caracal/core/file_name.rb
117
118
  - lib/caracal/core/fonts.rb
@@ -121,6 +122,7 @@ files:
121
122
  - lib/caracal/core/list_styles.rb
122
123
  - lib/caracal/core/lists.rb
123
124
  - lib/caracal/core/models/base_model.rb
125
+ - lib/caracal/core/models/bookmark_model.rb
124
126
  - lib/caracal/core/models/border_model.rb
125
127
  - lib/caracal/core/models/custom_property_model.rb
126
128
  - lib/caracal/core/models/font_model.rb
@@ -170,6 +172,7 @@ files:
170
172
  - lib/caracal/utilities.rb
171
173
  - lib/caracal/version.rb
172
174
  - lib/tilt/caracal.rb
175
+ - spec/lib/caracal/core/bookmarks_spec.rb
173
176
  - spec/lib/caracal/core/file_name_spec.rb
174
177
  - spec/lib/caracal/core/fonts_spec.rb
175
178
  - spec/lib/caracal/core/iframes_spec.rb
@@ -178,6 +181,7 @@ files:
178
181
  - spec/lib/caracal/core/list_styles_spec.rb
179
182
  - spec/lib/caracal/core/lists_spec.rb
180
183
  - spec/lib/caracal/core/models/base_model_spec.rb
184
+ - spec/lib/caracal/core/models/bookmark_model_spec.rb
181
185
  - spec/lib/caracal/core/models/border_model_spec.rb
182
186
  - spec/lib/caracal/core/models/font_model_spec.rb
183
187
  - spec/lib/caracal/core/models/iframe_model_spec.rb
@@ -236,6 +240,7 @@ signing_key:
236
240
  specification_version: 4
237
241
  summary: Fast, professional Microsoft Word (docx) writer for Ruby.
238
242
  test_files:
243
+ - spec/lib/caracal/core/bookmarks_spec.rb
239
244
  - spec/lib/caracal/core/file_name_spec.rb
240
245
  - spec/lib/caracal/core/fonts_spec.rb
241
246
  - spec/lib/caracal/core/iframes_spec.rb
@@ -244,6 +249,7 @@ test_files:
244
249
  - spec/lib/caracal/core/list_styles_spec.rb
245
250
  - spec/lib/caracal/core/lists_spec.rb
246
251
  - spec/lib/caracal/core/models/base_model_spec.rb
252
+ - spec/lib/caracal/core/models/bookmark_model_spec.rb
247
253
  - spec/lib/caracal/core/models/border_model_spec.rb
248
254
  - spec/lib/caracal/core/models/font_model_spec.rb
249
255
  - spec/lib/caracal/core/models/iframe_model_spec.rb