clbustos-rtf 0.4.2 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. data/.gemtest +0 -0
  2. data/History.txt +53 -0
  3. data/{LICENSE → LICENSE.txt} +0 -0
  4. data/Manifest.txt +52 -0
  5. data/README.rdoc +60 -63
  6. data/README.txt +201 -0
  7. data/Rakefile +18 -34
  8. data/examples/example01.rb +5 -1
  9. data/examples/example02.rb +1 -0
  10. data/examples/example03.rb +1 -0
  11. data/examples/example03.rtf +0 -0
  12. data/examples/example04.rb +1 -0
  13. data/examples/rubyrtf.bmp +0 -0
  14. data/examples/rubyrtf.jpg +0 -0
  15. data/examples/rubyrtf.png +0 -0
  16. data/ifad-rtf.gemspec +120 -0
  17. data/lib/rtf.rb +1 -0
  18. data/lib/rtf/colour.rb +0 -0
  19. data/lib/rtf/converters.rb +5 -0
  20. data/lib/rtf/converters/html.rb +123 -0
  21. data/lib/rtf/font.rb +0 -0
  22. data/lib/rtf/information.rb +0 -0
  23. data/lib/rtf/node.rb +136 -109
  24. data/lib/rtf/paper.rb +0 -0
  25. data/lib/rtf/style.rb +0 -0
  26. data/test/fixtures/bitmap1.bmp +0 -0
  27. data/test/fixtures/bitmap2.bmp +0 -0
  28. data/test/fixtures/jpeg1.jpg +0 -0
  29. data/test/fixtures/jpeg2.jpg +0 -0
  30. data/test/fixtures/png1.png +0 -0
  31. data/test/fixtures/png2.png +0 -0
  32. data/test/{test_helper.rb → helper_tests.rb} +1 -0
  33. data/test/{character_style_test.rb → test_character_style.rb} +1 -1
  34. data/test/{colour_test.rb → test_colour.rb} +2 -2
  35. data/test/{colour_table_test.rb → test_colour_table.rb} +2 -2
  36. data/test/{command_node_test.rb → test_command_node.rb} +1 -1
  37. data/test/{container_node_test.rb → test_container_node.rb} +2 -1
  38. data/test/{document_test.rb → test_document.rb} +1 -1
  39. data/test/{document_style_test.rb → test_document_style.rb} +1 -1
  40. data/test/{font_test.rb → test_font.rb} +2 -2
  41. data/test/{font_table_test.rb → test_font_table.rb} +2 -2
  42. data/test/{footer_node_test.rb → test_footer_node.rb} +1 -1
  43. data/test/{header_node_test.rb → test_header_node.rb} +1 -1
  44. data/test/{image_node_test.rb → test_image_node.rb} +10 -3
  45. data/test/{information_test.rb → test_information.rb} +1 -1
  46. data/test/{node_test.rb → test_node.rb} +1 -1
  47. data/test/{paragraph_style_test.rb → test_paragraph_style.rb} +1 -1
  48. data/test/{style_test.rb → test_style.rb} +1 -1
  49. data/test/{table_cell_node_test.rb → test_table_cell_node.rb} +1 -1
  50. data/test/{table_node_test.rb → test_table_node.rb} +2 -1
  51. data/test/{table_row_node_test.rb → test_table_row_node.rb} +1 -1
  52. data/test/text_node_test.rb +35 -10
  53. metadata +137 -97
  54. data/CHANGES +0 -23
  55. data/VERSION.yml +0 -5
File without changes
@@ -0,0 +1,53 @@
1
+ === 0.5.0 / 2012-01-05
2
+
3
+ * Added test for utf8. Test load implementation of rtf library on same path first [Claudio Bustos]
4
+ * Cleanup: remove executable bit [Marcello Barnaba]
5
+ * Converters: HTML: add H4 support [Marcello Barnaba]
6
+ * Converters: HTML: add tidy cleaning (and the tidy dependency of course) [Marcello Barnaba]
7
+ * Converters: HTML: carriage returns are not spaces in RTF [Marcello Barnaba]
8
+ * Converters: HTML: fix excess space bug [Marcello Barnaba]
9
+ * Converters: HTML: fixed a traversing bug [Marcello Barnaba]
10
+ * Converters: HTML: imported @panmind source previously published on gist:583061 [Marcello Barnaba]
11
+ * Converters: HTML: reduce headings font sizes - should be parametrized [Marcello Barnaba]
12
+ * Converters: HTML: rewrote without polluting nokogiri [Marcello Barnaba]
13
+ * Converters: HTML: whitespace [Marcello Barnaba]
14
+ * Converters: require them via require "rtf/converters" [Marcello Barnaba]
15
+ * Fix gemspec to reflect correct homepage [Chris O'Sullivan]
16
+ * Fixing rtf files to work with tempfiles opened from s3 [Dan Herrera]
17
+ * Gem: add nokogiri dependency (sucks, I know) [Marcello Barnaba]
18
+ * Gem: changed name and generated gemspec [Marcello Barnaba]
19
+ * Gem: update authors list [Marcello Barnaba]
20
+ * Rename README to have rdoc extension so it looks pretty on github [Chris O'Sullivan]
21
+ * Some pictures are not properly scaled without \picwgoal and \pichgoal [Marcin Urbanski]
22
+ * Update readme to reflect correct copyright [Chris O'Sullivan]
23
+ * Updated CHANGES with new version details [Chris O'Sullivan]
24
+ * Updated README; Use name-spaced class invocations instead of including RTF module; Open file with 'w'I thought adding the 'w' to your `File.open` was a bit [Jay Hayes]e doing it exactly as you've shown will
25
+ * Updated test file names [clbustos]
26
+ * add '\lastrow' tag to the lastrow. It's a fix for iOS. [Samuel Mullen]
27
+ * block syntax for ImageNode#open_file [Cygnus]
28
+ * improve speed and memory use of ImageNode#to_rtf [Cygnus]
29
+ * refactor to close and open ImageNode file only when needed [Cygnus]
30
+ * refactor to use a Constant for ImageNode dimensions reading rather than passing values around [Cygnus]
31
+ * usually fail since in all likelihood the user doesn't have an empty file by that name in their current dir. [Jay Hayes]
32
+
33
+ === 0.4.2
34
+ * Fix bug causing TextNode.to_rtf to return nil under 1.8.7[Jason Langenauer]
35
+ * Tests run under Ruby 1.9.2 and later [clbustos]
36
+ === 0.4.1
37
+ * Links: implemented hyperlinks[Marcello Barnaba]
38
+ * Lists: add a newline before every new list[Marcello Barnaba]
39
+ === 0.4.0
40
+ * Lists: Decimal: quick&dirty implementation of sequential numbering[Marcello Barnaba]
41
+ * Lists: Decimal: fixed marker name generation: it must contain the dot[Marcello Barnaba]
42
+ * Lists: removed last StringIO occurrences in new code[Marcello Barnaba]
43
+ * Lists: wrote minimal object model test[Marcello Barnaba]
44
+ * Lists: refactored and cleaned up the API a bit[Marcello Barnaba]
45
+ * Lists: wrote the API bridge between Nodes and Lists[Marcello Barnaba]
46
+ * Lists: initial implementation of listtable header generation[Marcello Barnaba]
47
+ * Node: cleaned up the generic to_rtf, added the .wrap option to the constructor[Marcello Barnaba]
48
+ * Node: stubbed out paragraph generation into a new ParagraphNode[Marcello Barnaba]
49
+ === 0.3.1
50
+ * Added the #subscript helper to the CommandNode class [vjt]
51
+ === 0.3.0
52
+ * 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]
53
+ * Deleted duplicated definition of ImageNode#style= with attr_writer and def. [clbustos]
File without changes
@@ -0,0 +1,52 @@
1
+ History.txt
2
+ LICENSE.txt
3
+ Manifest.txt
4
+ README.rdoc
5
+ README.txt
6
+ Rakefile
7
+ examples/example01.rb
8
+ examples/example02.rb
9
+ examples/example03.rb
10
+ examples/example03.rtf
11
+ examples/example04.rb
12
+ examples/rubyrtf.bmp
13
+ examples/rubyrtf.jpg
14
+ examples/rubyrtf.png
15
+ ifad-rtf.gemspec
16
+ lib/rtf.rb
17
+ lib/rtf/colour.rb
18
+ lib/rtf/converters.rb
19
+ lib/rtf/converters/html.rb
20
+ lib/rtf/font.rb
21
+ lib/rtf/information.rb
22
+ lib/rtf/list.rb
23
+ lib/rtf/node.rb
24
+ lib/rtf/paper.rb
25
+ lib/rtf/style.rb
26
+ test/fixtures/bitmap1.bmp
27
+ test/fixtures/bitmap2.bmp
28
+ test/fixtures/jpeg1.jpg
29
+ test/fixtures/jpeg2.jpg
30
+ test/fixtures/png1.png
31
+ test/fixtures/png2.png
32
+ test/helper_tests.rb
33
+ test/test_character_style.rb
34
+ test/test_colour.rb
35
+ test/test_colour_table.rb
36
+ test/test_command_node.rb
37
+ test/test_container_node.rb
38
+ test/test_document.rb
39
+ test/test_document_style.rb
40
+ test/test_font.rb
41
+ test/test_font_table.rb
42
+ test/test_footer_node.rb
43
+ test/test_header_node.rb
44
+ test/test_image_node.rb
45
+ test/test_information.rb
46
+ test/test_node.rb
47
+ test/test_paragraph_style.rb
48
+ test/test_style.rb
49
+ test/test_table_cell_node.rb
50
+ test/test_table_node.rb
51
+ test/test_table_row_node.rb
52
+ test/text_node_test.rb
@@ -1,15 +1,3 @@
1
- == Purpose of this fork
2
-
3
- * [DONE] Add support for ordered and unordered lists
4
- * [DONE] Add support for hyperlinks
5
- * [TODO] Write comprehensive tests for OL and UL
6
- * [TODO] Clean up the API
7
- * [TODO] DRY the code
8
-
9
- Please, please, please: if you come along this library and would lend me an
10
- hand to complete tests, please help. Thank you!
11
-
12
-
13
1
  == Ruby Rich Text Format (RTF) Library
14
2
  The RTF library provides a pure Ruby set of functionality that can be used to
15
3
  programmatically create RTF documents. The main aim in developing this library
@@ -59,7 +47,6 @@ the code.
59
47
 
60
48
  * Check into RTF image handling with a view to adding support for the insertion
61
49
  of images into a Document.
62
-
63
50
  * Provide a complete implementation for the headers and footers.
64
51
 
65
52
  === Some Examples
@@ -103,69 +90,74 @@ some code into the document. We want the code to appear in the document slightly
103
90
  indented on the left hand side, in a non-proportionately space font and we want
104
91
  it in bold text. Heres the code that shows how to do that...
105
92
 
106
- 01 code_para = ParagraphStyle.new
107
- 02 code_para.left_indent = 200
108
- 03
109
- 04 code_char = CharacterStyle.new
110
- 05 code_char.font = RTF::Font::MODERN
111
- 06 code_char.bold = true
112
- 07
113
- 08 document.paragraph(code_para) do |p|
114
- 09 p.apply(code_char) do |c|
115
- 10 c << "count = 0"
116
- 11 c.line_break
117
- 12 c << "File.open('file.txt', 'r') do |file|"
118
- 13 c.line_break
119
- 14 c << " file.each_line {|line| count += 1}"
120
- 15 c.line_break
121
- 16 c << "end"
122
- 17 c.line_break
123
- 18 c << "puts \"File contains \#{count} lines.\""
124
- 19 end
125
- 20 end
93
+ 01 styles = {}
94
+ 02 styles['PS_CODE'] = ParagraphStyle.new
95
+ 03 styles['CS_CODE'] = CharacterStyle.new
96
+ 04
97
+ 05 styles['PS_CODE'].left_indent = 200
98
+ 06 styles['CS_CODE'].font = Font.new(Font::MODERN, 'Courier')
99
+ 07 styles['CS_CODE'].bold = true
100
+ 08
101
+ 09 document.paragraph(styles['PS_CODE']) do |n1|
102
+ 10 n1.apply(styles['CS_CODE']) do |n2|
103
+ 11 n2 << "count = 0"
104
+ 12 n2.line_break
105
+ 13 n2 << "File.open('file.txt', 'r') do |file|"
106
+ 14 n2.line_break
107
+ 15 n2 << " file.each_line {|line| count += 1}"
108
+ 16 n2.line_break
109
+ 17 n2 << "end"
110
+ 18 n2.line_break
111
+ 19 n2 << "puts \"File contains \#{count} lines.\""
112
+ 20 end
113
+ 21 end
126
114
 
127
115
  This is a much larger piece of code and covers a number of topics that need to
128
116
  be addressed. I have included line numbers with code so that individual elements
129
- can be referenced. Lines 1 to 6 are the first new elements. Here we create
117
+ can be referenced. Lines 1 to 3 are the first new elements. Here we create a
118
+ Hash and assign it to a variable called styles. On the next two lines we create
130
119
  two style objects, one that can be applied to paragraphs and one that applies
131
120
  to characters.
132
121
 
133
- On line 2 we set the left indentation value of the paragraph style to 200 *twips*.
134
- A twip is a type setting measurement that equates to one twentieth of a point
135
- (about a fifty seventh of a millimetre or one seventy second of an inch). This is
136
- the measurement scale used by RTF documents.
122
+ On lines 5 to 7 we update settings on the style objects we've created. We set
123
+ the left indentation value of the paragraph style to 200. The 200 in this case
124
+ refers to a measurement of twips. A twip is a type setting measurement that
125
+ equates to one twentieth of a point (about a fifty seventh of a millimetre or
126
+ one seventy second of an inch). This is the measurement scale used by RTF
127
+ documents so it is also employed in the library.
137
128
 
138
- On lines 5 and 6 we update the character style to use a courier font and to
139
- apply bold styling to the text.
140
-
141
- On line 8 we start a new paragraph in our document. This differs from our previous
142
- use of this method in that we specify a style that will be applied to the paragraph
143
- using the one we prepared earlier.
129
+ On lines 6 and 7 we update the character style to use a courier font and to
130
+ apply bold styling to the text. On line 9 we start a new paragraph in our
131
+ document. This differs from our previous use of this method in that we specify
132
+ a style that will be applied to the paragraph created, the paragraph style we
133
+ had prepared earlier.
144
134
 
145
135
  The block accompanying the paragraph method takes the single parameter that we
146
136
  have seen previously. At this point its probably a good idea to point out that
147
137
  the elements that make up an RTF document created with the library are all
148
- stored as nodes in a tree.
149
-
150
- Within the block, the +apply+ method applies a character style, and we're using
151
- the one we prepared earlier.
138
+ stored as nodes in a tree. We've named the one passed to the paragraph method as
139
+ n1 to reflect this.
152
140
 
141
+ Within the block we've called a method on the paragraph node called apply. This
142
+ method applies a character style and we're using the one we prepared earlier.
153
143
  Like the call to the paragraph method, the apply method is passed a block. All
154
- text added to the blocks node will have the styling we've defined (bold courier
155
- font) applied to it.
144
+ text added to the blocks node (n2 in this case) will have the styling we've
145
+ defined (bold courier font) applied to it.
156
146
 
157
- Note, that within the apply block we could still use the previous (p) node. Any
158
- text we added to this would appear in the paragraph but wouldn't be styled and,
159
- it should be noted, will appear before any text added to c, as the c node only
160
- becomes part of the document when the apply block completes.
147
+ Note, that within the apply block we could still use the n1 node. Any text we
148
+ added to this would appear in the paragraph but wouldn't be styled and, it
149
+ should be noted, will appear before any text added to n2 (as the n2 node only
150
+ becomes part of the document when the apply block completes).
161
151
 
162
- Within the apply method block we add some lines of text to the c node. Note
152
+ Within the apply method block we add some lines of text to the n2 node. Note
163
153
  that, as this is all encompassed within the parapgraph block, all the text is
164
154
  part of a single paragraph. To get each of the lines of code to appear on a
165
155
  line of their own we have used the line_break method which inserts a carriage
166
156
  return into the document. Note you should use this method to insert line breaks
167
157
  rather than trying to add a string containing "\n". RTF is a text based standard
168
- and won't treat "\n" as you're expecting.
158
+ and won't treat "\n" as you're expecting. You should note also that we've had to
159
+ escape the '#' in one of the code lines to stop Ruby considering it as an
160
+ interpolated value.
169
161
 
170
162
  Okay, so we've seen have the basics of creating a document and adding elements
171
163
  to that document. How do we get what we've created to a file. Well thats
@@ -173,7 +165,7 @@ actually quite straight forward. As was mentioned previously, RTF is a text
173
165
  based standard so you simply generate the RTF and write it to a file. Heres an
174
166
  example...
175
167
 
176
- File.open('my_document.rtf') {|file| file.write(document.to_rtf)}
168
+ File.open('my_document.rtf', 'w') {|file| file.write(document.to_rtf)} # existing file by this name will be overwritten
177
169
 
178
170
  There you have it. You've been given a quick overview of the basics of using
179
171
  the library. For more information consult the HTML based API documentation that
@@ -181,11 +173,16 @@ is installed with the library gem (if you're reading this you may already be
181
173
  looking at this documentation). Another source of information is the examples
182
174
  directory, so check that out too.
183
175
 
184
- CONTRIBUTORS
185
- Claudio Bustos
186
- Chris O'Sullivan
176
+ == CONTRIBUTORS
187
177
 
188
- COPYRIGHT
189
- =========
178
+ === Individuals
179
+ * Marcello Barnaba
180
+ * Claudio Bustos
181
+ * Sam Mullen
182
+ * Chris O'Sullivan
190
183
 
191
- Copyright (c) 2009-2010 Peter Wood. See LICENSE for details.
184
+ ===Organizations
185
+ * IFAD
186
+
187
+ COPYRIGHT
188
+ Copyright (c) 2009-2012 Peter Wood. See LICENSE for details.
@@ -0,0 +1,201 @@
1
+ = rtf
2
+
3
+ * https://github.com/clbustos/rtf
4
+
5
+ == Purpose of this fork
6
+
7
+ * [DONE] Add support for ordered and unordered lists
8
+ * [DONE] Add support for hyperlinks
9
+ * [DONE] Support for UTF8 text
10
+ * [TODO] Write comprehensive tests for OL and UL
11
+ * [TODO] Clean up the API
12
+ * [TODO] DRY the code
13
+ * [TODO] Add an HTML-to-RTF converter
14
+
15
+ Please, please, please: if you come along this library and would lend me an
16
+ hand to complete tests, please help. Thank you!
17
+
18
+ == DESCRIPTION:
19
+
20
+ The RTF library provides a pure Ruby set of functionality that can be used to
21
+ programmatically create RTF documents. The main aim in developing this library
22
+ is to ease the complexity involved in assembling RTF documents although some
23
+ consideration has also been given to generating documents that are easier to
24
+ manually interpret too.
25
+
26
+ This library does not include functionality for parsing RTF documents. Nor does
27
+ the library claim to provide extensive coverage of the RTF specification. The
28
+ library was developed mostly with reference to the RTF Pocket Guide by Sean M.
29
+ Burke and some reference to the RTF specification itself. The introduction to
30
+ the RTF Pocket Guide states that the book covers version 1.7 of the RTF
31
+ specification so I guess, as this was the primary source, that this is the
32
+ version that the library covers too. Finally, no consideration was given to
33
+ making the functionality within the library thread safe.
34
+
35
+ In creating this library I set out to make it reasonably easy to create RTF
36
+ documents in code. Having said that I'm certain that it is possible to generate
37
+ invalid RTF documents with this library.
38
+
39
+ === FEATURES/PROBLEMS:
40
+
41
+ I've tried to assemble a reasonably extensive (although I won't claim
42
+ exhaustive) unit test for the library. Despite that, this is an early release of
43
+ the code and I'm sure there will be issues with it given the complexity inherent
44
+ in RTF. The following are issues that I'm already aware of with the library...
45
+
46
+ * The implementation of headers and footers is incomplete. Stick to using
47
+ universal headers and footers for the time being.
48
+
49
+ * The library makes no attempt to split large chunks of text into separate
50
+ lines. This can make editing the resulting document in a text editor a little
51
+ awkward.
52
+
53
+ * RTF is, when it comes down to it, a Microsoft standard. As a result I have
54
+ taken Word and Wordpad to be definitive when it comes to displaying the RTF
55
+ documents generated by the library. I have tried things like Abiword and
56
+ Open Office with varying degrees of success. I'm certainly not saying that
57
+ this is due to deficencies in these particular applications as it could
58
+ equally be a lack of my understanding of the RTF standard or problems with my
59
+ implementation. Still, I think I should mention the point that I don't get
60
+ consistent appearance across all of the RTF viewers I've tried.
61
+
62
+ === To do
63
+ This section details that areas where I feel the library is currently lacking
64
+ or incomplete. I hope to address the things detailed here in later releases of
65
+ the code.
66
+
67
+ * Check into RTF image handling with a view to adding support for the insertion
68
+ of images into a Document.
69
+
70
+ * Provide a complete implementation for the headers and footers.
71
+
72
+ === Some Examples
73
+ Okay, so how is the library used. Well lets look at some examples to see if we
74
+ can cast a little light on the matter. The examples provided here assume that
75
+ you are already familiar with the Ruby language. So, for a start, consider...
76
+
77
+ require 'rubygems'
78
+ require 'rtf'
79
+
80
+ The first thing to look at here at the are the first two lines. The RTF library
81
+ is provided as a Ruby gem and these two lines load the libraries functionality
82
+ into the script. The third line of code includes the RTF module into the current
83
+ name space. This is a convenience mechanism that saves on specifically having
84
+ to refer to the module when accessing the RTF library. Next we want to create
85
+ an RTF document and that is done like this...
86
+
87
+ document = RTF::Document.new(RTF::Font.new(RTF::Font::ROMAN, 'Times New Roman'))
88
+
89
+ This line of code creates a new Document object, specifying that the default
90
+ font for the document will the the Times New Roman font. So we have a document,
91
+ what can we do with it. Well, lets add a short paragraph of text...
92
+
93
+ document.paragraph << "This is a short paragraph of text."
94
+
95
+ That's fine, but what if we wanted to extend that paragraph or we simply wanted
96
+ to add more text than we've added here? Well, the paragraph method accepts a
97
+ block to which it passes the actual paragraph object, so we could do something
98
+ like the following...
99
+
100
+ document.paragraph do |p|
101
+ p << "This is the first sentence in the paragraph. "
102
+ p << "This is the second sentence in the paragraph. "
103
+ p << "And this is the third sentence in the paragraph."
104
+ end
105
+
106
+ This is a common approach used by the RTF library, allowing a block to define
107
+ the scope of a document element. Lets see a more complicated example of this
108
+ in which we apply a number of document effects. Lets say that we want to insert
109
+ some code into the document. We want the code to appear in the document slightly
110
+ indented on the left hand side, in a non-proportionately space font and we want
111
+ it in bold text. Heres the code that shows how to do that...
112
+
113
+ 01 code_para = ParagraphStyle.new
114
+ 02 code_para.left_indent = 200
115
+ 03
116
+ 04 code_char = CharacterStyle.new
117
+ 05 code_char.font = RTF::Font::MODERN
118
+ 06 code_char.bold = true
119
+ 07
120
+ 08 document.paragraph(code_para) do |p|
121
+ 09 p.apply(code_char) do |c|
122
+ 10 c << "count = 0"
123
+ 11 c.line_break
124
+ 12 c << "File.open('file.txt', 'r') do |file|"
125
+ 13 c.line_break
126
+ 14 c << " file.each_line {|line| count += 1}"
127
+ 15 c.line_break
128
+ 16 c << "end"
129
+ 17 c.line_break
130
+ 18 c << "puts \"File contains \#{count} lines.\""
131
+ 19 end
132
+ 20 end
133
+
134
+ This is a much larger piece of code and covers a number of topics that need to
135
+ be addressed. I have included line numbers with code so that individual elements
136
+ can be referenced. Lines 1 to 6 are the first new elements. Here we create
137
+ two style objects, one that can be applied to paragraphs and one that applies
138
+ to characters.
139
+
140
+ On line 2 we set the left indentation value of the paragraph style to 200 *twips*.
141
+ A twip is a type setting measurement that equates to one twentieth of a point
142
+ (about a fifty seventh of a millimetre or one seventy second of an inch). This is
143
+ the measurement scale used by RTF documents.
144
+
145
+ On lines 5 and 6 we update the character style to use a courier font and to
146
+ apply bold styling to the text.
147
+
148
+ On line 8 we start a new paragraph in our document. This differs from our previous
149
+ use of this method in that we specify a style that will be applied to the paragraph
150
+ using the one we prepared earlier.
151
+
152
+ The block accompanying the paragraph method takes the single parameter that we
153
+ have seen previously. At this point its probably a good idea to point out that
154
+ the elements that make up an RTF document created with the library are all
155
+ stored as nodes in a tree.
156
+
157
+ Within the block, the +apply+ method applies a character style, and we're using
158
+ the one we prepared earlier.
159
+
160
+ Like the call to the paragraph method, the apply method is passed a block. All
161
+ text added to the blocks node will have the styling we've defined (bold courier
162
+ font) applied to it.
163
+
164
+ Note, that within the apply block we could still use the previous (p) node. Any
165
+ text we added to this would appear in the paragraph but wouldn't be styled and,
166
+ it should be noted, will appear before any text added to c, as the c node only
167
+ becomes part of the document when the apply block completes.
168
+
169
+ Within the apply method block we add some lines of text to the c node. Note
170
+ that, as this is all encompassed within the parapgraph block, all the text is
171
+ part of a single paragraph. To get each of the lines of code to appear on a
172
+ line of their own we have used the line_break method which inserts a carriage
173
+ return into the document. Note you should use this method to insert line breaks
174
+ rather than trying to add a string containing "\n". RTF is a text based standard
175
+ and won't treat "\n" as you're expecting.
176
+
177
+ Okay, so we've seen have the basics of creating a document and adding elements
178
+ to that document. How do we get what we've created to a file. Well thats
179
+ actually quite straight forward. As was mentioned previously, RTF is a text
180
+ based standard so you simply generate the RTF and write it to a file. Heres an
181
+ example...
182
+
183
+ File.open('my_document.rtf') {|file| file.write(document.to_rtf)}
184
+
185
+ There you have it. You've been given a quick overview of the basics of using
186
+ the library. For more information consult the HTML based API documentation that
187
+ is installed with the library gem (if you're reading this you may already be
188
+ looking at this documentation). Another source of information is the examples
189
+ directory, so check that out too.
190
+
191
+ == CONTRIBUTORS
192
+
193
+ * Marcello Barnaba
194
+ * Claudio Bustos
195
+ * Sam Mullen
196
+ * Chris O'Sullivan
197
+
198
+
199
+ == COPYRIGHT
200
+
201
+ Copyright (c) 2009-2012 Peter Wood. See LICENSE for details.