clbustos-rtf 0.3.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGES CHANGED
@@ -1,5 +1,8 @@
1
1
  == CHANGES
2
2
 
3
+ 0.3.1
4
+ * Added the #subscript helper to the CommandNode class [vjt]
5
+
3
6
  0.3.0
4
7
  * Resolve problems on Ruby 1.9.1 with ImageNode#read_source. Peter uses IO#getc, which returns a String on Ruby 1.9.1, not a Integer, so I replaced with getbyte. [clbustos]
5
8
  * Deleted duplicated definition of ImageNode#style= with attr_writer and def. [clbustos]
@@ -58,8 +58,6 @@ you are already familiar with the Ruby language. So, for a start, consider...
58
58
  require 'rubygems'
59
59
  require 'rtf'
60
60
 
61
- include RTF
62
-
63
61
  The first thing to look at here at the are the first two lines. The RTF library
64
62
  is provided as a Ruby gem and these two lines load the libraries functionality
65
63
  into the script. The third line of code includes the RTF module into the current
@@ -67,7 +65,7 @@ name space. This is a convenience mechanism that saves on specifically having
67
65
  to refer to the module when accessing the RTF library. Next we want to create
68
66
  an RTF document and that is done like this...
69
67
 
70
- document = Document.new(Font.new(Font::ROMAN, 'Times New Roman'))
68
+ document = RTF::Document.new(RTF::Font::ROMAN)
71
69
 
72
70
  This line of code creates a new Document object, specifying that the default
73
71
  font for the document will the the Times New Roman font. So we have a document,
@@ -93,74 +91,69 @@ some code into the document. We want the code to appear in the document slightly
93
91
  indented on the left hand side, in a non-proportionately space font and we want
94
92
  it in bold text. Heres the code that shows how to do that...
95
93
 
96
- 01 styles = {}
97
- 02 styles['PS_CODE'] = ParagraphStyle.new
98
- 03 styles['CS_CODE'] = CharacterStyle.new
99
- 04
100
- 05 styles['PS_CODE'].left_indent = 200
101
- 06 styles['CS_CODE'].font = Font.new(Font::MODERN, 'Courier')
102
- 07 styles['CS_CODE'].bold = true
103
- 08
104
- 09 document.paragraph(styles['PS_CODE']) do |n1|
105
- 10 n1.apply(styles['CS_CODE']) do |n2|
106
- 11 n2 << "count = 0"
107
- 12 n2.line_break
108
- 13 n2 << "File.open('file.txt', 'r') do |file|"
109
- 14 n2.line_break
110
- 15 n2 << " file.each_line {|line| count += 1}"
111
- 16 n2.line_break
112
- 17 n2 << "end"
113
- 18 n2.line_break
114
- 19 n2 << "puts \"File contains \#{count} lines.\""
115
- 20 end
116
- 21 end
94
+ 01 code_para = ParagraphStyle.new
95
+ 02 code_para.left_indent = 200
96
+ 03
97
+ 04 code_char = CharacterStyle.new
98
+ 05 code_char.font = RTF::Font::MODERN
99
+ 06 code_char.bold = true
100
+ 07
101
+ 08 document.paragraph(code_para) do |p|
102
+ 09 p.apply(code_char) do |c|
103
+ 10 c << "count = 0"
104
+ 11 c.line_break
105
+ 12 c << "File.open('file.txt', 'r') do |file|"
106
+ 13 c.line_break
107
+ 14 c << " file.each_line {|line| count += 1}"
108
+ 15 c.line_break
109
+ 16 c << "end"
110
+ 17 c.line_break
111
+ 18 c << "puts \"File contains \#{count} lines.\""
112
+ 19 end
113
+ 20 end
117
114
 
118
115
  This is a much larger piece of code and covers a number of topics that need to
119
116
  be addressed. I have included line numbers with code so that individual elements
120
- can be referenced. Lines 1 to 3 are the first new elements. Here we create a
121
- Hash and assign it to a variable called styles. On the next two lines we create
117
+ can be referenced. Lines 1 to 6 are the first new elements. Here we create
122
118
  two style objects, one that can be applied to paragraphs and one that applies
123
119
  to characters.
124
120
 
125
- On lines 5 to 7 we update settings on the style objects we've created. We set
126
- the left indentation value of the paragraph style to 200. The 200 in this case
127
- refers to a measurement of twips. A twip is a type setting measurement that
128
- equates to one twentieth of a point (about a fifty seventh of a millimetre or
129
- one seventy second of an inch). This is the measurement scale used by RTF
130
- documents so it is also employed in the library.
121
+ On line 2 we set the left indentation value of the paragraph style to 200 *twips*.
122
+ A twip is a type setting measurement that equates to one twentieth of a point
123
+ (about a fifty seventh of a millimetre or one seventy second of an inch). This is
124
+ the measurement scale used by RTF documents.
125
+
126
+ On lines 5 and 6 we update the character style to use a courier font and to
127
+ apply bold styling to the text.
131
128
 
132
- On lines 6 and 7 we update the character style to use a courier font and to
133
- apply bold styling to the text. On line 9 we start a new paragraph in our
134
- document. This differs from our previous use of this method in that we specify
135
- a style that will be applied to the paragraph created, the paragraph style we
136
- had prepared earlier.
129
+ On line 8 we start a new paragraph in our document. This differs from our previous
130
+ use of this method in that we specify a style that will be applied to the paragraph
131
+ using the one we prepared earlier.
137
132
 
138
133
  The block accompanying the paragraph method takes the single parameter that we
139
134
  have seen previously. At this point its probably a good idea to point out that
140
135
  the elements that make up an RTF document created with the library are all
141
- stored as nodes in a tree. We've named the one passed to the paragraph method as
142
- n1 to reflect this.
136
+ stored as nodes in a tree.
137
+
138
+ Within the block, the +apply+ method applies a character style, and we're using
139
+ the one we prepared earlier.
143
140
 
144
- Within the block we've called a method on the paragraph node called apply. This
145
- method applies a character style and we're using the one we prepared earlier.
146
141
  Like the call to the paragraph method, the apply method is passed a block. All
147
- text added to the blocks node (n2 in this case) will have the styling we've
148
- defined (bold courier font) applied to it.
142
+ text added to the blocks node will have the styling we've defined (bold courier
143
+ font) applied to it.
149
144
 
150
- Note, that within the apply block we could still use the n1 node. Any text we
151
- added to this would appear in the paragraph but wouldn't be styled and, it
152
- should be noted, will appear before any text added to n2 (as the n2 node only
153
- becomes part of the document when the apply block completes).
145
+ Note, that within the apply block we could still use the previous (p) node. Any
146
+ text we added to this would appear in the paragraph but wouldn't be styled and,
147
+ it should be noted, will appear before any text added to c, as the c node only
148
+ becomes part of the document when the apply block completes.
154
149
 
155
- Within the apply method block we add some lines of text to the n2 node. Note
150
+ Within the apply method block we add some lines of text to the c node. Note
156
151
  that, as this is all encompassed within the parapgraph block, all the text is
157
152
  part of a single paragraph. To get each of the lines of code to appear on a
158
153
  line of their own we have used the line_break method which inserts a carriage
159
154
  return into the document. Note you should use this method to insert line breaks
160
155
  rather than trying to add a string containing "\n". RTF is a text based standard
161
- and won't treat "\n" as you're expecting. You should note also that we've had to
162
- escape the '#' in one of the code lines to stop Ruby considering it as an
163
- interpolated value.
156
+ and won't treat "\n" as you're expecting.
164
157
 
165
158
  Okay, so we've seen have the basics of creating a document and adding elements
166
159
  to that document. How do we get what we've created to a file. Well thats
@@ -183,4 +176,4 @@ Chris O'Sullivan
183
176
  COPYRIGHT
184
177
  =========
185
178
 
186
- Copyright (c) 2009-2010 Peter Wood. See LICENSE for details.
179
+ Copyright (c) 2009-2010 Peter Wood. See LICENSE for details.
data/Rakefile CHANGED
@@ -1,3 +1,4 @@
1
+ $:.unshift(File.dirname(__FILE__))
1
2
  require 'rake'
2
3
 
3
4
  begin
@@ -1,5 +1,5 @@
1
1
  ---
2
2
  :major: 0
3
3
  :minor: 3
4
- :patch: 0
4
+ :patch: 1
5
5
  :build:
@@ -6,14 +6,10 @@ module RTF
6
6
  # This class represents an element within an RTF document. The class provides
7
7
  # a base class for more specific node types.
8
8
  class Node
9
- # Attribute accessor.
10
- attr_reader :parent
11
-
12
- # Attribute mutator.
13
- attr_writer :parent
14
-
15
-
16
- # This is the constructor for the Node class.
9
+ # Node parent.
10
+ attr_accessor :parent
11
+
12
+ # Constructor for the Node class.
17
13
  #
18
14
  # ==== Parameters
19
15
  # parent:: A reference to the Node that owns the new Node. May be nil
@@ -118,7 +114,13 @@ module RTF
118
114
  # This method generates the RTF equivalent for a TextNode object. This
119
115
  # method escapes any special sequences that appear in the text.
120
116
  def to_rtf
121
- @text == nil ? '' : @text.gsub("{", "\\{").gsub("}", "\\}").gsub("\\", "\\\\")
117
+ rtf=(@text == nil ? '' : @text.gsub("{", "\\{").gsub("}", "\\}").gsub("\\", "\\\\"))
118
+ # Encode as Unicode.
119
+ if RUBY_VERSION>"1.9.0"
120
+ rtf.encode("UTF-16LE").each_codepoint.map {|cp|
121
+ cp < 128 ? cp.chr : "\\u#{cp}\\'3f"
122
+ }.join("")
123
+ end
122
124
  end
123
125
  end # End of the TextNode class.
124
126
 
@@ -392,6 +394,21 @@ module RTF
392
394
  end
393
395
  end
394
396
 
397
+ # This method provides a short cut means of creating a subscript command
398
+ # node. The method accepts a block that will be passed a single parameter
399
+ # which will be a reference to the subscript node created. After the
400
+ # block is complete the subscript node is appended to the end of the
401
+ # child nodes on the object that the method is call against.
402
+ def subscript
403
+ style = CharacterStyle.new
404
+ style.subscript = true
405
+ if block_given?
406
+ apply(style) {|node| yield node}
407
+ else
408
+ apply(style)
409
+ end
410
+ end
411
+
395
412
  # This method provides a short cut means of creating a superscript command
396
413
  # node. The method accepts a block that will be passed a single parameter
397
414
  # which will be a reference to the superscript node created. After the
@@ -407,6 +424,21 @@ module RTF
407
424
  end
408
425
  end
409
426
 
427
+ # This method provides a short cut means of creating a strike command
428
+ # node. The method accepts a block that will be passed a single parameter
429
+ # which will be a reference to the strike node created. After the
430
+ # block is complete the strike node is appended to the end of the
431
+ # child nodes on the object that the method is call against.
432
+ def strike
433
+ style = CharacterStyle.new
434
+ style.strike = true
435
+ if block_given?
436
+ apply(style) {|node| yield node}
437
+ else
438
+ apply(style)
439
+ end
440
+ end
441
+
410
442
  # This method provides a short cut means of creating a font command node.
411
443
  # The method accepts a block that will be passed a single parameter which
412
444
  # will be a reference to the font node created. After the block is
@@ -1660,4 +1692,4 @@ module RTF
1660
1692
  text.string
1661
1693
  end
1662
1694
  end # End of the Document class.
1663
- end # End of the RTF module.
1695
+ end # End of the RTF module.
@@ -156,6 +156,16 @@ class CommandNodeTest < Test::Unit::TestCase
156
156
  assert(node.prefix == '\super')
157
157
  assert(node.suffix == nil)
158
158
  assert(node == root[-1])
159
+
160
+ node = root.subscript
161
+ assert(node.prefix == '\sub')
162
+ assert(node.suffix == nil)
163
+ assert(node == root[-1])
164
+
165
+ node = root.strike
166
+ assert(node.prefix == '\strike')
167
+ assert(node.suffix == nil)
168
+ assert(node == root[-1])
159
169
  end
160
170
 
161
171
  # Test text node addition.
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 3
8
- - 0
9
- version: 0.3.0
8
+ - 1
9
+ version: 0.3.1
10
10
  platform: ruby
11
11
  authors:
12
12
  - Peter Wood
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-05-03 00:00:00 -04:00
17
+ date: 2010-09-14 00:00:00 -04:00
18
18
  default_executable:
19
19
  dependencies: []
20
20
 
@@ -26,11 +26,11 @@ extensions: []
26
26
 
27
27
  extra_rdoc_files:
28
28
  - LICENSE
29
- - README
29
+ - README.rdoc
30
30
  files:
31
31
  - CHANGES
32
32
  - LICENSE
33
- - README
33
+ - README.rdoc
34
34
  - Rakefile
35
35
  - VERSION.yml
36
36
  - examples/example01.rb
@@ -106,28 +106,28 @@ signing_key:
106
106
  specification_version: 3
107
107
  summary: Ruby library to create rich text format documents.
108
108
  test_files:
109
- - test/table_row_node_test.rb
110
- - test/font_table_test.rb
109
+ - test/node_test.rb
110
+ - test/information_test.rb
111
+ - test/container_node_test.rb
112
+ - test/table_cell_node_test.rb
113
+ - test/character_style_test.rb
111
114
  - test/paragraph_style_test.rb
112
- - test/document_style_test.rb
113
115
  - test/font_test.rb
114
- - test/header_node_test.rb
115
- - test/node_test.rb
116
- - test/colour_table_test.rb
117
- - test/test_helper.rb
118
116
  - test/document_test.rb
119
- - test/footer_node_test.rb
120
- - test/command_node_test.rb
121
117
  - test/style_test.rb
122
- - test/character_style_test.rb
118
+ - test/font_table_test.rb
123
119
  - test/text_node_test.rb
120
+ - test/table_node_test.rb
121
+ - test/colour_table_test.rb
124
122
  - test/image_node_test.rb
123
+ - test/document_style_test.rb
124
+ - test/test_helper.rb
125
+ - test/footer_node_test.rb
126
+ - test/table_row_node_test.rb
125
127
  - test/colour_test.rb
126
- - test/container_node_test.rb
127
- - test/information_test.rb
128
- - test/table_node_test.rb
129
- - test/table_cell_node_test.rb
130
- - examples/example02.rb
128
+ - test/header_node_test.rb
129
+ - test/command_node_test.rb
131
130
  - examples/example01.rb
131
+ - examples/example02.rb
132
132
  - examples/example03.rb
133
133
  - examples/example04.rb