caracal 1.1.0 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +12 -2
- data/caracal.gemspec +2 -2
- data/lib/caracal/core/models/style_model.rb +40 -14
- data/lib/caracal/core/models/text_model.rb +15 -13
- data/lib/caracal/renderers/styles_renderer.rb +8 -8
- data/lib/caracal/version.rb +1 -1
- data/spec/lib/caracal/core/models/link_model_spec.rb +2 -2
- data/spec/lib/caracal/core/models/style_model_spec.rb +17 -1
- data/spec/lib/caracal/core/models/text_model_spec.rb +2 -2
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3d6531d588b6cb5bb6a5c48941029510fdfce000
|
4
|
+
data.tar.gz: b7d7136f8e1dc0b126599e6f14b92aae20a925f4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 125ebdcb4425c9283651a28deb626244eca27ac179889e7d5d93aaa55ef998182cb144727552040786cf73cd4b6eae94524f57466a70b7bc022332aa26b9b2e3
|
7
|
+
data.tar.gz: e3b1762168958781a93605fa12591229cfb1c24a0fe300394783da2e83cb4b6347197287a99fbf09d6ed882f8c7fb256f1268a44170d2e789ddb6148ea7520e3
|
data/README.md
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
# Caracal
|
2
2
|
|
3
|
-
[](https://travis-ci.org/trade-informatics/caracal)
|
4
3
|
[](https://rubygems.org/gems/caracal)
|
5
4
|
|
6
5
|
|
@@ -334,6 +333,7 @@ Paragraph style classes can be defined using the `style` method. The method acc
|
|
334
333
|
docx.style do
|
335
334
|
id 'Heading1' # sets the internal identifier for the style.
|
336
335
|
name 'heading 1' # sets the friendly name of the style.
|
336
|
+
type 'paragraph' # sets the style type. accepts `paragraph` or `character`
|
337
337
|
font 'Palantino' # sets the font family.
|
338
338
|
color '333333' # sets the text color. accepts hex RGB.
|
339
339
|
size 28 # sets the font size. units in half points.
|
@@ -363,6 +363,11 @@ Caracal establishes a standard set of default styles for every document. Default
|
|
363
363
|
* Heading5
|
364
364
|
* Heading6
|
365
365
|
|
366
|
+
Styles are declared as `paragraph` by default. If you need to adjust inline text styles repeatedly, you might
|
367
|
+
benefit from defining a `character` style. Paragraph styles affects all text runs within a paragraph; character styles
|
368
|
+
are used to style individual runs within a larger text block.
|
369
|
+
|
370
|
+
One-off inline text styling can also be accomplished by passing the `text` command override arguments (see below).
|
366
371
|
|
367
372
|
|
368
373
|
### Custom Properties
|
@@ -416,7 +421,7 @@ docx.p do
|
|
416
421
|
text ' to something awesome', font: 'Courier New', color: '555555', size: 32, bold: true, italic: true, underline: true, bgcolor: 'cccccc'
|
417
422
|
text '.'
|
418
423
|
br
|
419
|
-
text 'This text follows a line break.'
|
424
|
+
text 'This text follows a line break and uses a character style instead of overrides.', style: 'MyCharStyle'
|
420
425
|
page
|
421
426
|
end
|
422
427
|
```
|
@@ -715,6 +720,11 @@ Caracal includes [Tilt](https://github.com/rtomayko/tilt) integration to facilit
|
|
715
720
|
Rails integration can be added via the [Caracal-Rails](https://github.com/trade-informatics/caracal-rails) gem.
|
716
721
|
|
717
722
|
|
723
|
+
## Using Variables
|
724
|
+
|
725
|
+
Lexical scope is a pretty big challenge for Caracal and it often confuses new users. This [closed issue](https://github.com/trade-informatics/caracal/issues/71) covers the discussion both from the user and library persepctive.
|
726
|
+
|
727
|
+
|
718
728
|
## Filing an Issue
|
719
729
|
|
720
730
|
Caracal was written for and tested against Word 2010, 2013, and Office365. It should also open in LibreOffice
|
data/caracal.gemspec
CHANGED
@@ -8,8 +8,8 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.version = Caracal::VERSION
|
9
9
|
spec.authors = ['Trade Infomatics', 'John Dugan']
|
10
10
|
spec.email = ['jpdugan@gmail.com']
|
11
|
-
spec.summary = %q{ Fast, professional
|
12
|
-
spec.description = %q{ Caracal is a pure Ruby
|
11
|
+
spec.summary = %q{ Fast, professional Microsoft Word (docx) writer for Ruby. }
|
12
|
+
spec.description = %q{ Caracal is a pure Ruby Microsoft Word generation library that produces professional quality MSWord documents (docx) using a simple, HTML-style DSL. }
|
13
13
|
spec.homepage = 'https://github.com/trade-informatics/caracal'
|
14
14
|
spec.license = 'MIT'
|
15
15
|
|
@@ -10,11 +10,12 @@ module Caracal
|
|
10
10
|
#
|
11
11
|
class StyleModel < BaseModel
|
12
12
|
|
13
|
-
|
13
|
+
#--------------------------------------------------
|
14
14
|
# Configuration
|
15
|
-
|
15
|
+
#--------------------------------------------------
|
16
16
|
|
17
17
|
# constants
|
18
|
+
const_set(:DEFAULT_STYLE_TYPE, 'paragraph')
|
18
19
|
const_set(:DEFAULT_STYLE_COLOR, '333333')
|
19
20
|
const_set(:DEFAULT_STYLE_SIZE, 20)
|
20
21
|
const_set(:DEFAULT_STYLE_BOLD, false)
|
@@ -31,6 +32,7 @@ module Caracal
|
|
31
32
|
# accessors
|
32
33
|
attr_reader :style_default
|
33
34
|
attr_reader :style_id
|
35
|
+
attr_reader :style_type
|
34
36
|
attr_reader :style_name
|
35
37
|
attr_reader :style_color
|
36
38
|
attr_reader :style_font
|
@@ -52,6 +54,7 @@ module Caracal
|
|
52
54
|
# initialization
|
53
55
|
def initialize(options={}, &block)
|
54
56
|
@style_default = false
|
57
|
+
@style_type = DEFAULT_STYLE_TYPE
|
55
58
|
@style_base = DEFAULT_STYLE_BASE
|
56
59
|
@style_next = DEFAULT_STYLE_NEXT
|
57
60
|
|
@@ -73,11 +76,11 @@ module Caracal
|
|
73
76
|
end
|
74
77
|
|
75
78
|
|
76
|
-
|
77
|
-
# Public
|
78
|
-
|
79
|
+
#--------------------------------------------------
|
80
|
+
# Public Methods
|
81
|
+
#--------------------------------------------------
|
79
82
|
|
80
|
-
|
83
|
+
#========== SETTERS ===============================
|
81
84
|
|
82
85
|
# booleans
|
83
86
|
[:bold, :italic, :underline, :caps].each do |m|
|
@@ -94,7 +97,7 @@ module Caracal
|
|
94
97
|
end
|
95
98
|
|
96
99
|
# strings
|
97
|
-
[:id, :name, :color, :font].each do |m|
|
100
|
+
[:id, :type, :name, :color, :font].each do |m|
|
98
101
|
define_method "#{ m }" do |value|
|
99
102
|
instance_variable_set("@style_#{ m }", value.to_s)
|
100
103
|
end
|
@@ -107,29 +110,52 @@ module Caracal
|
|
107
110
|
end
|
108
111
|
end
|
109
112
|
|
113
|
+
# custom
|
114
|
+
def type(value)
|
115
|
+
allowed = ['character', 'paragraph']
|
116
|
+
given = value.to_s.downcase.strip
|
117
|
+
@style_type = allowed.include?(given) ? given : DEFAULT_STYLE_TYPE
|
118
|
+
end
|
119
|
+
|
110
120
|
|
111
|
-
|
121
|
+
#========== STATE =================================
|
112
122
|
|
113
123
|
def matches?(str)
|
114
124
|
style_id.downcase == str.to_s.downcase
|
115
125
|
end
|
116
126
|
|
117
127
|
|
118
|
-
|
128
|
+
#========== VALIDATION ============================
|
119
129
|
|
120
130
|
def valid?
|
121
|
-
a = [:id, :name]
|
131
|
+
a = [:id, :name, :type]
|
122
132
|
a.map { |m| send("style_#{ m }") }.compact.size == a.size
|
123
133
|
end
|
124
134
|
|
125
135
|
|
126
|
-
|
127
|
-
# Private
|
128
|
-
|
136
|
+
#--------------------------------------------------
|
137
|
+
# Private Methods
|
138
|
+
#--------------------------------------------------
|
129
139
|
private
|
130
140
|
|
131
141
|
def option_keys
|
132
|
-
[
|
142
|
+
[ :type,
|
143
|
+
:bold,
|
144
|
+
:italic,
|
145
|
+
:underline,
|
146
|
+
:caps,
|
147
|
+
:top,
|
148
|
+
:bottom,
|
149
|
+
:size,
|
150
|
+
:line,
|
151
|
+
:id,
|
152
|
+
:name,
|
153
|
+
:color,
|
154
|
+
:font,
|
155
|
+
:align,
|
156
|
+
:indent_left,
|
157
|
+
:indent_right,
|
158
|
+
:indent_first ]
|
133
159
|
end
|
134
160
|
|
135
161
|
end
|
@@ -10,12 +10,13 @@ module Caracal
|
|
10
10
|
#
|
11
11
|
class TextModel < BaseModel
|
12
12
|
|
13
|
-
|
13
|
+
#--------------------------------------------------
|
14
14
|
# Configuration
|
15
|
-
|
15
|
+
#--------------------------------------------------
|
16
16
|
|
17
17
|
# accessors
|
18
18
|
attr_reader :text_content
|
19
|
+
attr_reader :text_style
|
19
20
|
attr_reader :text_font
|
20
21
|
attr_reader :text_color
|
21
22
|
attr_reader :text_size
|
@@ -27,15 +28,16 @@ module Caracal
|
|
27
28
|
|
28
29
|
|
29
30
|
|
30
|
-
|
31
|
-
# Public
|
32
|
-
|
31
|
+
#--------------------------------------------------
|
32
|
+
# Public Methods
|
33
|
+
#--------------------------------------------------
|
33
34
|
|
34
|
-
|
35
|
+
#========== GETTERS ===============================
|
35
36
|
|
36
37
|
# .run_attributes
|
37
38
|
def run_attributes
|
38
39
|
{
|
40
|
+
style: text_style,
|
39
41
|
font: text_font,
|
40
42
|
color: text_color,
|
41
43
|
size: text_size,
|
@@ -48,7 +50,7 @@ module Caracal
|
|
48
50
|
end
|
49
51
|
|
50
52
|
|
51
|
-
|
53
|
+
#========== SETTERS ===============================
|
52
54
|
|
53
55
|
# booleans
|
54
56
|
[:bold, :italic, :underline].each do |m|
|
@@ -65,7 +67,7 @@ module Caracal
|
|
65
67
|
end
|
66
68
|
|
67
69
|
# strings
|
68
|
-
[:bgcolor, :color, :content, :font].each do |m|
|
70
|
+
[:bgcolor, :color, :content, :font, :style].each do |m|
|
69
71
|
define_method "#{ m }" do |value|
|
70
72
|
instance_variable_set("@text_#{ m }", value.to_s)
|
71
73
|
end
|
@@ -79,7 +81,7 @@ module Caracal
|
|
79
81
|
end
|
80
82
|
|
81
83
|
|
82
|
-
|
84
|
+
#========== VALIDATION ============================
|
83
85
|
|
84
86
|
def valid?
|
85
87
|
a = [:content]
|
@@ -87,13 +89,13 @@ module Caracal
|
|
87
89
|
end
|
88
90
|
|
89
91
|
|
90
|
-
|
91
|
-
# Private
|
92
|
-
|
92
|
+
#--------------------------------------------------
|
93
|
+
# Private Methods
|
94
|
+
#--------------------------------------------------
|
93
95
|
private
|
94
96
|
|
95
97
|
def option_keys
|
96
|
-
[:content, :font, :color, :size, :bold, :italic, :underline, :bgcolor, :vertical_align]
|
98
|
+
[:content, :style, :font, :color, :size, :bold, :italic, :underline, :bgcolor, :vertical_align]
|
97
99
|
end
|
98
100
|
|
99
101
|
def method_missing(method, *args, &block)
|
@@ -8,9 +8,9 @@ module Caracal
|
|
8
8
|
module Renderers
|
9
9
|
class StylesRenderer < XmlRenderer
|
10
10
|
|
11
|
-
|
11
|
+
#----------------------------------------------------
|
12
12
|
# Public Methods
|
13
|
-
|
13
|
+
#----------------------------------------------------
|
14
14
|
|
15
15
|
# This method produces the xml required for the `word/styles.xml`
|
16
16
|
# sub-document.
|
@@ -19,7 +19,7 @@ module Caracal
|
|
19
19
|
builder = ::Nokogiri::XML::Builder.with(declaration_xml) do |xml|
|
20
20
|
xml['w'].styles root_options do
|
21
21
|
|
22
|
-
|
22
|
+
#========== DEFAULT STYLES ====================
|
23
23
|
|
24
24
|
unless s = document.default_style
|
25
25
|
raise Caracal::Errors::NoDefaultStyleError 'Document must declare a default paragraph style.'
|
@@ -62,10 +62,10 @@ module Caracal
|
|
62
62
|
default_id = s.style_id
|
63
63
|
|
64
64
|
|
65
|
-
|
65
|
+
#========== PARA/CHAR STYLES ==================
|
66
66
|
|
67
67
|
document.styles.reject { |s| s.style_id == default_id }.each do |s|
|
68
|
-
xml['w'].style({ 'w:styleId' => s.style_id, 'w:type' =>
|
68
|
+
xml['w'].style({ 'w:styleId' => s.style_id, 'w:type' => s.style_type }) do
|
69
69
|
xml['w'].name({ 'w:val' => s.style_name })
|
70
70
|
xml['w'].basedOn({ 'w:val' => s.style_base })
|
71
71
|
xml['w'].next({ 'w:val' => s.style_next })
|
@@ -90,7 +90,7 @@ module Caracal
|
|
90
90
|
end
|
91
91
|
end
|
92
92
|
|
93
|
-
|
93
|
+
#========== TABLE STYLES ======================
|
94
94
|
|
95
95
|
xml['w'].style({ 'w:styleId' => 'DefaultTable', 'w:type' => 'table' }) do
|
96
96
|
xml['w'].basedOn({ 'w:val' => 'TableNormal' })
|
@@ -116,9 +116,9 @@ module Caracal
|
|
116
116
|
|
117
117
|
|
118
118
|
|
119
|
-
|
119
|
+
#----------------------------------------------------
|
120
120
|
# Private Methods
|
121
|
-
|
121
|
+
#----------------------------------------------------
|
122
122
|
private
|
123
123
|
|
124
124
|
def font_options(style)
|
data/lib/caracal/version.rb
CHANGED
@@ -54,7 +54,7 @@ describe Caracal::Core::Models::LinkModel do
|
|
54
54
|
|
55
55
|
# .run_attributes
|
56
56
|
describe '.run_attributes' do
|
57
|
-
let(:expected) { { font: 'Courier New', color: '666666', size: 20, bold: false, italic: false, underline: true, bgcolor: 'cccccc', vertical_align: :top } }
|
57
|
+
let(:expected) { { style: nil, font: 'Courier New', color: '666666', size: 20, bold: false, italic: false, underline: true, bgcolor: 'cccccc', vertical_align: :top } }
|
58
58
|
|
59
59
|
it { expect(subject.run_attributes).to eq expected }
|
60
60
|
end
|
@@ -143,7 +143,7 @@ describe Caracal::Core::Models::LinkModel do
|
|
143
143
|
# .option_keys
|
144
144
|
describe '.option_keys' do
|
145
145
|
let(:actual) { subject.send(:option_keys).sort }
|
146
|
-
let(:expected) { [:content, :href, :font, :color, :size, :bold, :italic, :underline, :bgcolor, :vertical_align].sort }
|
146
|
+
let(:expected) { [:content, :href, :style, :font, :color, :size, :bold, :italic, :underline, :bgcolor, :vertical_align].sort }
|
147
147
|
|
148
148
|
it { expect(actual).to eq expected }
|
149
149
|
end
|
@@ -19,6 +19,7 @@ describe Caracal::Core::Models::StyleModel do
|
|
19
19
|
|
20
20
|
# constants
|
21
21
|
describe 'constants' do
|
22
|
+
it { expect(described_class::DEFAULT_STYLE_TYPE).to eq 'paragraph' }
|
22
23
|
it { expect(described_class::DEFAULT_STYLE_COLOR).to eq '333333' }
|
23
24
|
it { expect(described_class::DEFAULT_STYLE_SIZE).to eq 20 }
|
24
25
|
it { expect(described_class::DEFAULT_STYLE_BOLD).to eq false }
|
@@ -38,6 +39,7 @@ describe Caracal::Core::Models::StyleModel do
|
|
38
39
|
it { expect(subject.style_default).to eq true }
|
39
40
|
it { expect(subject.style_id).to eq 'Normal' }
|
40
41
|
it { expect(subject.style_name).to eq 'normal' }
|
42
|
+
it { expect(subject.style_type).to eq 'paragraph' }
|
41
43
|
it { expect(subject.style_color).to eq '333333' }
|
42
44
|
it { expect(subject.style_font).to eq 'Arial' }
|
43
45
|
it { expect(subject.style_size).to eq 20 }
|
@@ -152,6 +154,20 @@ describe Caracal::Core::Models::StyleModel do
|
|
152
154
|
it { expect(subject.style_align).to eq :right }
|
153
155
|
end
|
154
156
|
|
157
|
+
# custom
|
158
|
+
describe '.type' do
|
159
|
+
describe 'when valid' do
|
160
|
+
before { subject.type 'character'}
|
161
|
+
|
162
|
+
it { expect(subject.style_type).to eq 'character' }
|
163
|
+
end
|
164
|
+
describe 'when invalid' do
|
165
|
+
before { subject.type 'bogus'}
|
166
|
+
|
167
|
+
it { expect(subject.style_type).to eq 'paragraph' }
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
155
171
|
|
156
172
|
#=================== STATE ===============================
|
157
173
|
|
@@ -199,7 +215,7 @@ describe Caracal::Core::Models::StyleModel do
|
|
199
215
|
# .option_keys
|
200
216
|
describe '.option_keys' do
|
201
217
|
let(:actual) { subject.send(:option_keys).sort }
|
202
|
-
let(:expected) { [:bold, :italic, :underline, :caps, :top, :bottom, :size, :line, :id, :name, :color, :font, :align, :indent_left, :indent_right, :indent_first].sort }
|
218
|
+
let(:expected) { [:type, :bold, :italic, :underline, :caps, :top, :bottom, :size, :line, :id, :name, :color, :font, :align, :indent_left, :indent_right, :indent_first].sort }
|
203
219
|
|
204
220
|
it { expect(actual).to eq expected }
|
205
221
|
end
|
@@ -47,7 +47,7 @@ describe Caracal::Core::Models::TextModel do
|
|
47
47
|
|
48
48
|
# .run_attributes
|
49
49
|
describe '.run_attributes' do
|
50
|
-
let(:expected) { { font: 'Courier New', color: '666666', size: 20, bold: false, italic: false, underline: true, bgcolor: 'cccccc', vertical_align: :subscript } }
|
50
|
+
let(:expected) { { style: nil, font: 'Courier New', color: '666666', size: 20, bold: false, italic: false, underline: true, bgcolor: 'cccccc', vertical_align: :subscript } }
|
51
51
|
|
52
52
|
it { expect(subject.run_attributes).to eq expected }
|
53
53
|
end
|
@@ -137,7 +137,7 @@ describe Caracal::Core::Models::TextModel do
|
|
137
137
|
# .option_keys
|
138
138
|
describe '.option_keys' do
|
139
139
|
let(:actual) { subject.send(:option_keys).sort }
|
140
|
-
let(:expected) { [:bgcolor, :bold, :color, :content, :font, :italic, :size, :underline, :vertical_align].sort }
|
140
|
+
let(:expected) { [:bgcolor, :bold, :color, :content, :font, :italic, :size, :style, :underline, :vertical_align].sort }
|
141
141
|
|
142
142
|
it { expect(actual).to eq expected }
|
143
143
|
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.1.
|
4
|
+
version: 1.1.1
|
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:
|
12
|
+
date: 2018-01-03 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: nokogiri
|
@@ -95,8 +95,8 @@ dependencies:
|
|
95
95
|
- - "~>"
|
96
96
|
- !ruby/object:Gem::Version
|
97
97
|
version: '3.0'
|
98
|
-
description: " Caracal is a pure Ruby
|
99
|
-
quality
|
98
|
+
description: " Caracal is a pure Ruby Microsoft Word generation library that produces
|
99
|
+
professional quality MSWord documents (docx) using a simple, HTML-style DSL. "
|
100
100
|
email:
|
101
101
|
- jpdugan@gmail.com
|
102
102
|
executables: []
|
@@ -231,10 +231,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
231
231
|
version: '0'
|
232
232
|
requirements: []
|
233
233
|
rubyforge_project:
|
234
|
-
rubygems_version: 2.6.
|
234
|
+
rubygems_version: 2.6.14
|
235
235
|
signing_key:
|
236
236
|
specification_version: 4
|
237
|
-
summary: Fast, professional
|
237
|
+
summary: Fast, professional Microsoft Word (docx) writer for Ruby.
|
238
238
|
test_files:
|
239
239
|
- spec/lib/caracal/core/file_name_spec.rb
|
240
240
|
- spec/lib/caracal/core/fonts_spec.rb
|