pdf-writer 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. data/ChangeLog +44 -0
  2. data/LICENCE +118 -0
  3. data/README +32 -0
  4. data/bin/loader +54 -0
  5. data/bin/manual +22 -0
  6. data/bin/manual.bat +2 -0
  7. data/demo/chunkybacon.rb +28 -0
  8. data/demo/code.rb +63 -0
  9. data/demo/colornames.rb +843 -0
  10. data/demo/demo.rb +65 -0
  11. data/demo/gettysburg.rb +58 -0
  12. data/demo/hello.rb +18 -0
  13. data/demo/individual-i.rb +81 -0
  14. data/demo/pac.rb +62 -0
  15. data/demo/pagenumber.rb +67 -0
  16. data/demo/qr-language.rb +573 -0
  17. data/demo/qr-library.rb +371 -0
  18. data/images/chunkybacon.jpg +0 -0
  19. data/images/chunkybacon.png +0 -0
  20. data/images/pdfwriter-icon.jpg +0 -0
  21. data/images/pdfwriter-small.jpg +0 -0
  22. data/lib/pdf/charts.rb +13 -0
  23. data/lib/pdf/charts/stddev.rb +431 -0
  24. data/lib/pdf/grid.rb +135 -0
  25. data/lib/pdf/math.rb +108 -0
  26. data/lib/pdf/quickref.rb +330 -0
  27. data/lib/pdf/simpletable.rb +946 -0
  28. data/lib/pdf/techbook.rb +890 -0
  29. data/lib/pdf/writer.rb +2661 -0
  30. data/lib/pdf/writer/arc4.rb +63 -0
  31. data/lib/pdf/writer/fontmetrics.rb +201 -0
  32. data/lib/pdf/writer/fonts/Courier-Bold.afm +342 -0
  33. data/lib/pdf/writer/fonts/Courier-BoldOblique.afm +342 -0
  34. data/lib/pdf/writer/fonts/Courier-Oblique.afm +342 -0
  35. data/lib/pdf/writer/fonts/Courier.afm +342 -0
  36. data/lib/pdf/writer/fonts/Helvetica-Bold.afm +2827 -0
  37. data/lib/pdf/writer/fonts/Helvetica-BoldOblique.afm +2827 -0
  38. data/lib/pdf/writer/fonts/Helvetica-Oblique.afm +3051 -0
  39. data/lib/pdf/writer/fonts/Helvetica.afm +3051 -0
  40. data/lib/pdf/writer/fonts/MustRead.html +1 -0
  41. data/lib/pdf/writer/fonts/Symbol.afm +213 -0
  42. data/lib/pdf/writer/fonts/Times-Bold.afm +2588 -0
  43. data/lib/pdf/writer/fonts/Times-BoldItalic.afm +2384 -0
  44. data/lib/pdf/writer/fonts/Times-Italic.afm +2667 -0
  45. data/lib/pdf/writer/fonts/Times-Roman.afm +2419 -0
  46. data/lib/pdf/writer/fonts/ZapfDingbats.afm +225 -0
  47. data/lib/pdf/writer/graphics.rb +727 -0
  48. data/lib/pdf/writer/graphics/imageinfo.rb +365 -0
  49. data/lib/pdf/writer/lang.rb +43 -0
  50. data/lib/pdf/writer/lang/en.rb +77 -0
  51. data/lib/pdf/writer/object.rb +23 -0
  52. data/lib/pdf/writer/object/action.rb +40 -0
  53. data/lib/pdf/writer/object/annotation.rb +42 -0
  54. data/lib/pdf/writer/object/catalog.rb +39 -0
  55. data/lib/pdf/writer/object/contents.rb +68 -0
  56. data/lib/pdf/writer/object/destination.rb +40 -0
  57. data/lib/pdf/writer/object/encryption.rb +53 -0
  58. data/lib/pdf/writer/object/font.rb +76 -0
  59. data/lib/pdf/writer/object/fontdescriptor.rb +34 -0
  60. data/lib/pdf/writer/object/fontencoding.rb +39 -0
  61. data/lib/pdf/writer/object/image.rb +168 -0
  62. data/lib/pdf/writer/object/info.rb +55 -0
  63. data/lib/pdf/writer/object/outline.rb +30 -0
  64. data/lib/pdf/writer/object/outlines.rb +30 -0
  65. data/lib/pdf/writer/object/page.rb +195 -0
  66. data/lib/pdf/writer/object/pages.rb +115 -0
  67. data/lib/pdf/writer/object/procset.rb +46 -0
  68. data/lib/pdf/writer/object/viewerpreferences.rb +74 -0
  69. data/lib/pdf/writer/ohash.rb +58 -0
  70. data/lib/pdf/writer/oreader.rb +25 -0
  71. data/lib/pdf/writer/state.rb +48 -0
  72. data/lib/pdf/writer/strokestyle.rb +138 -0
  73. data/manual.pwd +5151 -0
  74. metadata +147 -0
@@ -0,0 +1,65 @@
1
+ #--
2
+ # PDF::Writer for Ruby.
3
+ # http://rubyforge.org/projects/ruby-pdf/
4
+ # Copyright 2003 - 2005 Austin Ziegler.
5
+ #
6
+ # Licensed under a MIT-style licence. See LICENCE in the main distribution
7
+ # for full licensing information.
8
+ #
9
+ # $Id: demo.rb,v 1.4 2005/06/07 04:19:57 austin Exp $
10
+ #++
11
+ load '../bin/loader'
12
+ ClassLoader.new('pdf/writer')
13
+
14
+ if ARGV.empty?
15
+ line = 'Ruby Rocks'
16
+ else
17
+ line = ARGV.join(" ")
18
+ end
19
+
20
+ pdf = PDF::Writer.new
21
+
22
+ # Do some funky stuff in the background, in a nice light blue, which is
23
+ # bound to clash with something and some red for the hell of it
24
+ x = 578
25
+ r1 = 25
26
+
27
+ 40.step(1, -3) do |xw|
28
+ tone = 1.0 - (xw / 40.0) * 0.2
29
+
30
+ pdf.stroke_style(PDF::Writer::StrokeStyle.new(xw))
31
+ pdf.stroke_color(Color::RGB.from_fraction(tone, 1, tone))
32
+ pdf.circle_at(50, 750, r1).stroke
33
+ r1 += xw
34
+ end
35
+
36
+ 40.step(1, -3) do |xw|
37
+ tone = 1.0 - (xw / 40.0) * 0.2
38
+
39
+ pdf.stroke_style(PDF::Writer::StrokeStyle.new(xw))
40
+ pdf.stroke_color(Color::RGB.from_fraction(tone, tone, 1))
41
+ pdf.line(x, 0, x, 842)
42
+ x = (x - xw - 2)
43
+ end
44
+
45
+ pdf.stroke_color(Color::Black)
46
+ pdf.stroke_style(PDF::Writer::StrokeStyle.new(1))
47
+ pdf.rectangle(20, 20, 558, 802)
48
+
49
+ y = 800
50
+ 50.step(5, -5) do |size|
51
+ height = pdf.font_height(size)
52
+ y = y - height
53
+
54
+ pdf.add_text(30, y, size, line)
55
+ end
56
+
57
+ (0...360).step(20) do |angle|
58
+ pdf.fill_color(Color::RGB.from_fraction(rand, rand, rand))
59
+
60
+ pdf.add_text(300 + Math.cos(PDF::Math.deg2rad(angle)) * 40,
61
+ 300 - Math.sin(PDF::Math.deg2rad(angle)) * 40,
62
+ 20, line, angle)
63
+ end
64
+
65
+ pdf.save_as("demo.pdf", true)
@@ -0,0 +1,58 @@
1
+ #--
2
+ # PDF::Writer for Ruby.
3
+ # http://rubyforge.org/projects/ruby-pdf/
4
+ # Copyright 2003 - 2005 Austin Ziegler.
5
+ #
6
+ # Licensed under a MIT-style licence. See LICENCE in the main distribution
7
+ # for full licensing information.
8
+ #
9
+ # $Id: gettysburg.rb,v 1.3 2005/06/07 04:19:57 austin Exp $
10
+ #++
11
+ load '../bin/loader'
12
+ ClassLoader.new('pdf/writer')
13
+
14
+ pdf = PDF::Writer.new
15
+
16
+ GETTYSBURG = <<-'EOS'
17
+ Four score and seven years ago our fathers brought forth on this
18
+ continent a new nation, conceived in liberty and dedicated to the
19
+ proposition that all men are created equal. Now we are engaged in
20
+ a great civil war, testing whether that nation or any nation so
21
+ conceived and so dedicated can long endure. We are met on a great
22
+ battlefield of that war. We have come to dedicate a portion of
23
+ that field as a final resting-place for those who here gave their
24
+ lives that that nation might live. It is altogether fitting and
25
+ proper that we should do this. But in a larger sense, we cannot
26
+ dedicate, we cannot consecrate, we cannot hallow this ground.
27
+ The brave men, living and dead who struggled here have consecrated
28
+ it far above our poor power to add or detract. The world will
29
+ little note nor long remember what we say here, but it can never
30
+ forget what they did here. It is for us the living rather to be
31
+ dedicated here to the unfinished work which they who fought here
32
+ have thus far so nobly advanced. It is rather for us to be here
33
+ dedicated to the great task remaining before us�that from these
34
+ honored dead we take increased devotion to that cause for which
35
+ they gave the last full measure of devotion�that we here highly
36
+ resolve that these dead shall not have died in vain, that this
37
+ nation under God shall have a new birth of freedom, and that
38
+ government of the people, by the people, for the people shall
39
+ not perish from the earth.
40
+ EOS
41
+
42
+ gba = GETTYSBURG.split($/).join(" ").squeeze
43
+
44
+ pdf.text "The Gettysburg Address\n\n", :font_size => 36,
45
+ :justification => :center
46
+
47
+ y0 = pdf.y + 18
48
+ pdf.text gba, :justification => :full, :font_size => 14, :left => 50,
49
+ :right => 50
50
+ pdf.move_pointer(36)
51
+ pdf.text "U.S. President Abraham Lincoln, 19 November 1863",
52
+ :justification => :right, :right => 100
53
+ pdf.text "Gettysburg, Pennsylvania", :justification => :right, :right => 100
54
+
55
+ pdf.rounded_rectangle(pdf.left_margin + 25, y0, pdf.margin_width - 50,
56
+ y0 - pdf.y + 18, 10).stroke
57
+
58
+ pdf.save_as("gettysburg.pdf")
@@ -0,0 +1,18 @@
1
+ #--
2
+ # PDF::Writer for Ruby.
3
+ # http://rubyforge.org/projects/ruby-pdf/
4
+ # Copyright 2003 - 2005 Austin Ziegler.
5
+ #
6
+ # Licensed under a MIT-style licence. See LICENCE in the main distribution
7
+ # for full licensing information.
8
+ #
9
+ # $Id: hello.rb,v 1.5 2005/06/07 04:19:57 austin Exp $
10
+ #++
11
+ load '../bin/loader'
12
+ ClassLoader.new('pdf/writer')
13
+
14
+ pdf = PDF::Writer.new
15
+ pdf.select_font "Times-Roman"
16
+ pdf.text "Hello, Ruby.", :font_size => 72, :justification => :center
17
+
18
+ pdf.save_as("hello.pdf")
@@ -0,0 +1,81 @@
1
+ #--
2
+ # PDF::Writer for Ruby.
3
+ # http://rubyforge.org/projects/ruby-pdf/
4
+ # Copyright 2003 - 2005 Austin Ziegler.
5
+ #
6
+ # Licensed under a MIT-style licence. See LICENCE in the main distribution
7
+ # for full licensing information.
8
+ #
9
+ # $Id: individual-i.rb,v 1.3 2005/06/07 04:19:57 austin Exp $
10
+ #++
11
+ load '../bin/loader'
12
+ ClassLoader.new('pdf/writer')
13
+
14
+ require 'color/palette/monocontrast'
15
+
16
+ class IndividualI
17
+ def initialize(size = 100)
18
+ @size = size
19
+ end
20
+
21
+ # The size of the "i" in points.
22
+ attr_accessor :size
23
+
24
+ def half_i(pdf)
25
+ pdf.move_to(0, 82)
26
+ pdf.line_to(0, 78)
27
+ pdf.line_to(9, 78)
28
+ pdf.line_to(9, 28)
29
+ pdf.line_to(0, 28)
30
+ pdf.line_to(0, 23)
31
+ pdf.line_to(18, 23)
32
+ pdf.line_to(18, 82)
33
+ pdf.fill
34
+ end
35
+ private :half_i
36
+
37
+ def draw(pdf, x, y)
38
+ pdf.save_state
39
+ pdf.translate_axis(x, y)
40
+ pdf.scale_axis(1 * (@size / 100.0), -1 * (@size / 100.0))
41
+
42
+ pdf.circle_at(20, 10, 7.5)
43
+ pdf.fill
44
+
45
+ half_i(pdf)
46
+
47
+ pdf.translate_axis(40, 0)
48
+ pdf.scale_axis(-1, 1)
49
+
50
+ half_i(pdf)
51
+
52
+ pdf.restore_state
53
+ end
54
+ end
55
+
56
+ pdf = PDF::Writer.new
57
+ ii = IndividualI.new(24)
58
+
59
+ x = pdf.absolute_left_margin
60
+ y = pdf.absolute_top_margin
61
+
62
+ bg = Color::RGB.from_fraction(rand, rand, rand)
63
+ fg = Color::RGB.from_fraction(rand, rand, rand)
64
+ pal = Color::Palette::MonoContrast.new(bg, fg)
65
+
66
+ sz = 24
67
+
68
+ (-5..5).each do |col|
69
+ pdf.fill_color pal.background[col]
70
+ ii.draw(pdf, x, y)
71
+ ii.size += sz
72
+ x += sz / 2.0
73
+ y -= sz / 2.0
74
+ pdf.fill_color pal.foreground[col]
75
+ ii.draw(pdf, x, y)
76
+ x += sz / 2.0
77
+ y -= sz / 2.0
78
+ ii.size += sz
79
+ end
80
+
81
+ pdf.save_as("individual-i.pdf")
@@ -0,0 +1,62 @@
1
+ #--
2
+ # PDF::Writer for Ruby.
3
+ # http://rubyforge.org/projects/ruby-pdf/
4
+ # Copyright 2003 - 2005 Austin Ziegler.
5
+ #
6
+ # Licensed under a MIT-style licence. See LICENCE in the main distribution
7
+ # for full licensing information.
8
+ #
9
+ # $Id: pac.rb,v 1.3 2005/06/07 04:19:57 austin Exp $
10
+ #++
11
+ load '../bin/loader'
12
+ ClassLoader.new('pdf/writer')
13
+
14
+ pdf = PDF::Writer.new(:orientation => :landscape)
15
+
16
+ pdf.fill_color Color::Black
17
+ pdf.rectangle(0, 0, pdf.page_width, pdf.page_height).fill
18
+
19
+ # Wall
20
+ pdf.fill_color Color::Magenta
21
+ pdf.stroke_color Color::Cyan
22
+ pdf.rounded_rectangle(20, 500, 750, 20, 10).close_fill_stroke
23
+ pdf.rounded_rectangle(20, 200, 750, 20, 10).close_fill_stroke
24
+
25
+ # Body
26
+ pdf.fill_color Color::Yellow
27
+ pdf.stroke_color Color::Black
28
+ pdf.circle_at(150, 350, 100).fill_stroke
29
+
30
+ # Mouth
31
+ pdf.fill_color Color::Black
32
+ pdf.segment_at(150, 350, 100, 100, 30, -30).close_fill_stroke
33
+
34
+ # Dot
35
+ pdf.fill_color Color::Yellow
36
+ pdf.circle_at(250, 350, 20).fill_stroke
37
+ pdf.circle_at(300, 350, 10).fill_stroke
38
+ pdf.circle_at(350, 350, 10).fill_stroke
39
+ pdf.circle_at(400, 350, 10).fill_stroke
40
+ pdf.circle_at(450, 350, 10).fill_stroke
41
+
42
+ pdf.fill_color Color::Blue
43
+ pdf.stroke_color Color::Cyan
44
+ pdf.move_to(500, 250)
45
+ pdf.line_to(500, 425)
46
+ pdf.curve_to(550, 475, 600, 475, 650, 425)
47
+ pdf.line_to(650, 250)
48
+ pdf.line_to(625, 275)
49
+ pdf.line_to(600, 250)
50
+ pdf.line_to(575, 275)
51
+ pdf.line_to(550, 250)
52
+ pdf.line_to(525, 275)
53
+ pdf.line_to(500, 250).fill_stroke
54
+
55
+ pdf.fill_color Color::White
56
+ pdf.rectangle(525, 375, 25, 25).fill
57
+ pdf.rectangle(575, 375, 25, 25).fill
58
+ pdf.fill_color Color::Black
59
+ pdf.rectangle(525, 375, 10, 10).fill
60
+ pdf.rectangle(575, 375, 10, 10).fill
61
+
62
+ pdf.save_as("pac.pdf")
@@ -0,0 +1,67 @@
1
+ #--
2
+ # PDF::Writer for Ruby.
3
+ # http://rubyforge.org/projects/ruby-pdf/
4
+ # Copyright 2003 - 2005 Austin Ziegler.
5
+ #
6
+ # Licensed under a MIT-style licence. See LICENCE in the main distribution
7
+ # for full licensing information.
8
+ #
9
+ # $Id: pagenumber.rb,v 1.4 2005/06/07 04:19:57 austin Exp $
10
+ #++
11
+ load '../bin/loader'
12
+ ClassLoader.new('pdf/writer')
13
+
14
+ def grey_page(pdf)
15
+ @page_num ||= 0
16
+ @page_num += 1
17
+ pdf.save_state
18
+ pdf.fill_color Color::Grey90
19
+ x = pdf.absolute_x_middle - (pdf.text_width(48, @page_num) / 2.0)
20
+ y = pdf.absolute_y_middle - (pdf.font_height(48) / 2.0)
21
+ pdf.add_text(x, y, 48, @page_num)
22
+ pdf.restore_state
23
+ end
24
+
25
+ def make_page(pdf)
26
+ pdf.start_new_page
27
+ grey_page(pdf)
28
+ end
29
+
30
+ pdf = PDF::Writer.new(:paper => "A10")
31
+ pdf.margins_pt 0
32
+ pdf.select_font "Helvetica"
33
+
34
+ grey_page(pdf) # Page 1: blank
35
+ sa = pdf.start_page_numbering(5, 60, 9, nil, nil, 1)
36
+ make_page(pdf) # Page 2: 1 of 2
37
+ make_page(pdf) # Page 3: 2 of 2
38
+ pdf.stop_page_numbering(true, :current, sa)
39
+ make_page(pdf) # Page 4: blank
40
+ sb = pdf.start_page_numbering(5, 50, 9, :center, nil, 10)
41
+ make_page(pdf) # Page 5: 10 of 12
42
+ make_page(pdf) # Page 6: 11 of 12
43
+ pdf.stop_page_numbering(true, :next, sb)
44
+ make_page(pdf) # Page 7: 12 of 12
45
+ sc = pdf.start_page_numbering(5, 40, 9, nil, nil, 1)
46
+ make_page(pdf) # Page 8: 1 of 3
47
+ make_page(pdf) # Page 9: 2 of 3
48
+ make_page(pdf) # Page 10: 3 of 3
49
+ pdf.stop_page_numbering(true, :current, sc)
50
+ make_page(pdf) # Page 11: blank
51
+ sd = pdf.start_page_numbering(5, 30, 9, nil, nil, 1)
52
+ make_page(pdf) # Page 12: 1 of 6
53
+ make_page(pdf) # Page 13: 2 of 6
54
+ se = pdf.start_page_numbering(5, 20, 9, nil, nil, 5)
55
+ sf = pdf.start_page_numbering(5, 10, 9, :right, nil, 1)
56
+ make_page(pdf) # Page 14: 3 of 6, 5 of 10, 1 of 8
57
+ make_page(pdf) # Page 15: 4 of 6, 6 of 10, 2 of 8
58
+ make_page(pdf) # Page 16: 5 of 6, 7 of 10, 3 of 8
59
+ pdf.stop_page_numbering(true, :next, sd)
60
+ make_page(pdf) # Page 17: 6 of 6, 8 of 10, 4 of 8
61
+ make_page(pdf) # Page 18: 9 of 10, 5 of 8
62
+ pdf.stop_page_numbering(true, :next, se)
63
+ pdf.stop_page_numbering(false, :current, sf)
64
+ make_page(pdf) # Page 19: 10 of 10
65
+ make_page(pdf) # Page 20: blank
66
+
67
+ pdf.save_as("pagenumber.pdf")
@@ -0,0 +1,573 @@
1
+ #--
2
+ # PDF::Writer for Ruby.
3
+ # http://rubyforge.org/projects/ruby-pdf/
4
+ # Copyright 2003 - 2005 Austin Ziegler.
5
+ #
6
+ # This Quick Reference card program is copyright 2003�2005 Ryan
7
+ # Davis and is licensed under the Creative Commons Attribution
8
+ # NonCommercial
9
+ # ShareAlike[http://creativecommons.org/licenses/by-nc-sa/2.0/] licence.
10
+ #
11
+ # See LICENCE in the main distribution for full licensing information.
12
+ #
13
+ # $Id: qr-language.rb,v 1.10 2005/06/02 21:20:35 austin Exp $
14
+ #++
15
+ load '../bin/loader'
16
+ ClassLoader.new 'pdf/writer'
17
+
18
+ require 'pdf/quickref'
19
+
20
+ if ARGV[0].nil?
21
+ paper = "LETTER"
22
+ else
23
+ if PDF::Writer::PAGE_SIZES.has_key?(ARGV[0])
24
+ paper = ARGV[0]
25
+ else
26
+ puts <<-EOS
27
+ usage: #{File.basename($0)} [paper-size]
28
+
29
+ paper-size must be one of the standard PDF::Writer page sizes.
30
+ Default paper-size is LETTER.
31
+ EOS
32
+ exit 0
33
+ end
34
+ end
35
+
36
+ PDF::QuickRef.make(paper, 3) do
37
+ pdf.info.author = "Ryan Davis"
38
+ pdf.info.title = "Ruby Language Quick Reference"
39
+ pdf.info.subject = "The Ruby Programming Language"
40
+
41
+ self.title_font_size = 13
42
+ self.h1_font_size = 10
43
+ self.h2_font_size = 8
44
+ self.h3_font_size = 7
45
+ self.h4_font_size = 6
46
+ self.body_font_size = 5
47
+
48
+ enc = {
49
+ :encoding => 'WinAnsiEncoding',
50
+ :differences => {
51
+ 148 => "copyright",
52
+ }
53
+ }
54
+ self.title_font_encoding = enc
55
+ self.heading_font_encoding = enc
56
+ self.body_font_encoding = enc
57
+ self.code_font_encoding = enc
58
+
59
+ title "Ruby Language QuickRef"
60
+ h1 "General Syntax Rules"
61
+ lines <<-'EOS'
62
+ Comments start with a pound/sharp (#) character and go to EOL.
63
+ Lines between �=begin� and �=end� are skipped by the interpreter.
64
+ Ruby programs are sequence of expressions.
65
+ Each expression is delimited by semicolons (;) or newlines unless obviously incomplete (e.g. trailing �+�).
66
+ Backslashes at the end of line does not terminate expression.
67
+ EOS
68
+
69
+ h1 "Reserved Words"
70
+ codelines <<-'EOS'
71
+ alias and BEGIN begin break case
72
+ class def defined do else elsif
73
+ END end ensure false for if
74
+ in module next nil not or
75
+ redo rescue retry return self super
76
+ then true undef unless until when
77
+ while yield
78
+ EOS
79
+
80
+ h1 "Types"
81
+ body <<-'EOS'
82
+ Basic types are numbers, strings, ranges, regexen, symbols, arrays, and
83
+ hashes. Also included are files because they are used so often.
84
+ EOS
85
+
86
+ h2 "Numbers"
87
+ lines <<-'EOS'
88
+ 123 1_234 123.45 1.2e-3
89
+ 0xffff (hex) 0b01011 (binary) 0377 (octal)
90
+ ?a ASCII character
91
+ ?\C-a Control-a
92
+ ?\M-a Meta-a
93
+ ?\M-\C-a Meta-Control-a
94
+ EOS
95
+
96
+ h2 "Strings"
97
+ body <<-'EOS'
98
+ In all of the %() cases below, you may use any matching characters or any
99
+ single character for delimiters. %[], %!!, %@@, etc.
100
+ EOS
101
+ codelines <<-'EOS'
102
+ 'no interpolation'
103
+ "#{interpolation} and backslashes\n"
104
+ %q(no interpolation)
105
+ %Q(interpolation and backslashes)
106
+ %(interpolation and backslashes)
107
+ `echo command interpretation with interpolation and backslashes`
108
+ %x(echo command interpretation with interpolation and backslashes)
109
+ EOS
110
+
111
+ h3 "Backslashes"
112
+ pre <<-'EOS'
113
+ \t (tab), \n (newline), \r (carriage return),
114
+ \f (form feed), \b (backspace), \a (bell),
115
+ \e (escape), \s (whitespace), \nnn (octal),
116
+ \xnn (hexadecimal), \cx (control x),
117
+ \C-x (control x), \M-x (meta x),
118
+ \M-\C-x (meta control x)
119
+ EOS
120
+
121
+ h3 "Here Docs"
122
+ pre <<-'EOS'
123
+ &lt;&lt;identifier # interpolation
124
+ &lt;&lt;"identifier" # interpolation
125
+ &lt;&lt;'identifier' # no interpolation
126
+ &lt;&lt;-identifier # interpolation, indented end
127
+ &lt;&lt;-"identifier" # interpolation, indented end
128
+ &lt;&lt;-'identifier' # no interpolation, indented end
129
+ EOS
130
+
131
+ h2 "Symbols"
132
+ body <<-'EOS'
133
+ A symbol (:symbol) is an immutable name used for identifiers,
134
+ variables, and operators.
135
+ EOS
136
+
137
+ h2 "Ranges"
138
+ pre <<-'EOS'
139
+ 1..10
140
+ 'a'..'z'
141
+ (1..10) === 5 -&gt; true
142
+ (1..10) === 15 -&gt; false
143
+
144
+ # prints lines starting at 'start' and
145
+ # ending at 'end'
146
+ while gets
147
+ print if /start/../end/
148
+ end
149
+
150
+ class RangeThingy
151
+ def &lt;=&gt;(rhs)
152
+ # ...
153
+ end
154
+ def succ
155
+ # ...
156
+ end
157
+ end
158
+ range = RangeThingy.new(lower_bound) .. RangeThingy.new(upper_bound)
159
+ EOS
160
+
161
+ h2 "Regexen"
162
+ pre <<-'EOS'
163
+ /normal regex/[xim]
164
+ %r|alternate form|[xim]
165
+ Regex.new(pattern, options)
166
+ EOS
167
+ pairs <<-'EOS'
168
+ . any character except newline
169
+ [set] any single character of set
170
+ [^set] any single character NOT of set
171
+ * 0 or more previous regular expression
172
+ *? 0 or more previous regular expression (non greedy)
173
+ + 1 or more previous regular expression
174
+ +? 1 or more previous regular expression (non greedy)
175
+ ? 0 or 1 previous regular expression
176
+ | alternation
177
+ ( ) grouping regular expressions
178
+ ^ beginning of a line or string
179
+ $ end of a line or string
180
+ #{m,n} at least m but most n previous regular expression
181
+ #{m,n}? at least m but most n previous regular expression (non greedy)
182
+ \A beginning of a string
183
+ \b backspace (0x08, inside [] only)
184
+ \B non-word boundary
185
+ \b word boundary (outside [] only)
186
+ \d digit, same as[0-9]
187
+ \D non-digit
188
+ \S non-whitespace character
189
+ \s whitespace character[ \t\n\r\f]
190
+ \W non-word character
191
+ \w word character[0-9A-Za-z_]
192
+ \z end of a string
193
+ \Z end of a string, or before newline at the end
194
+ (?# ) comment
195
+ (?: ) grouping without backreferences
196
+ (?= ) zero-width positive look-ahead assertion (?! ) zero-width negative look-ahead assertion
197
+ (?ix-ix) turns on/off i/x options, localized in group if any.
198
+ (?ix-ix: ) turns on/off i/x options, localized in non-capturing group.
199
+ EOS
200
+
201
+ h2 "Arrays"
202
+ pre <<-'EOS'
203
+ [1, 2, 3]
204
+ %w(foo bar baz) # no interpolation
205
+ %W(foo #{bar} baz) # interpolation
206
+ EOS
207
+ body <<-'EOS'
208
+ Indexes may be negative, and they index backwards (-1 is the last element).
209
+ EOS
210
+
211
+ h2 "Hashes"
212
+ pre <<-'EOS'
213
+ { 1 =&gt; 2, 2 =&gt; 4, 3 =&gt; 6 }
214
+ { expr =&gt; expr, ... }
215
+ EOS
216
+
217
+ h2 "Files"
218
+ body "Common methods include:"
219
+ lines <<-'EOS'
220
+ File.join(p1, p2, ... pN) =&gt; �p1/p2/.../pN� platform independent paths
221
+ File.new(path, mode_string="r") =&gt; file
222
+ File.new(path, mode_num [, perm_num]) =&gt; file
223
+ File.open(filename, mode_string="r") {|file| block} -&gt; nil
224
+ File.open(filename [, mode_num [, perm_num ]]) {|file| block} -&gt; nil
225
+ IO.foreach(path, sepstring=$/) {|line| block}
226
+ IO.readlines(path) =&gt; array
227
+ EOS
228
+
229
+ h3 "Mode Strings"
230
+ pairs <<-'EOS'
231
+ r Read-only, starts at beginning of file (default mode).
232
+ r+ Read-write, starts at beginning of file.
233
+ w Write-only, truncates existing file to zero length or creates a new file for writing.
234
+ w+ Read-write, truncates existing file to zero length or creates a new file for reading and writing.
235
+ a Write-only, starts at end of file if file exists, otherwise creates a new file for writing.
236
+ a+ Read-write, starts at end of file if file exists, otherwise creates a new file for reading and writing.
237
+ b Binary file mode (may appear with any of the key letters listed above). Only <b>necessary</b> for DOS/Windows.
238
+ EOS
239
+
240
+ h1 "Variables and Constants"
241
+ pre <<-'EOS'
242
+ $global_variable
243
+ @instance_variable
244
+ [OtherClass::]CONSTANT
245
+ local_variable
246
+ EOS
247
+
248
+ h1 "Pseudo-variables"
249
+ pairs <<-'EOS'
250
+ self the receiver of the current method
251
+ nil the sole instance of NilClass (represents false)
252
+ true the sole instance of TrueClass (typical true value)
253
+ false the sole instance of FalseClass (represents false)
254
+ __FILE__ the current source file name.
255
+ __LINE__ the current line number in the source file.
256
+ EOS
257
+
258
+ h1 "Pre-defined Variables"
259
+ pairs <<-'EOS'
260
+ $! The exception information message set by �raise�.
261
+ $@ Array of backtrace of the last exception thrown.
262
+ $&amp; The string matched by the last successful pattern match in this scope.
263
+ $` The string to the left of the last successful match.
264
+ $' The string to the right of the last successful match.
265
+ $+ The last bracket matched by the last successful match.
266
+ $1 The Nth group of the last successful match. May be &gt; 1.
267
+ $~ The information about the last match in the current scope.
268
+ $= The flag for case insensitive, nil by default.
269
+ $/ The input record separator, newline by default.
270
+ $\ The output record separator for the print and IO#write. Default is nil.
271
+ $, The output field separator for the print and Array#join.
272
+ $; The default separator for String#split.
273
+ $. The current input line number of the last file that was read.
274
+ $&lt; The virtual concatenation file of the files given on command line.
275
+ $&gt; The default output for print, printf. $stdout by default.
276
+ $_ The last input line of string by gets or readline.
277
+ $0 Contains the name of the script being executed. May be assignable.
278
+ $* Command line arguments given for the script sans args.
279
+ $$ The process number of the Ruby running this script.
280
+ $? The status of the last executed child process.
281
+ $: Load path for scripts and binary modules by load or require.
282
+ $" The array contains the module names loaded by require.
283
+ $DEBUG The status of the -d switch.
284
+ $FILENAME Current input file from $&lt;. Same as $&lt;.filename.
285
+ $LOAD_PATH The alias to the $:.
286
+ $stderr The current standard error output.
287
+ $stdin The current standard input.
288
+ $stdout The current standard output.
289
+ $VERBOSE The verbose flag, which is set by the -v switch.
290
+ $-0 The alias to $/.
291
+ $-a True if option -a is set. Read-only variable.
292
+ $-d The alias to $DEBUG.
293
+ $-F The alias to $;.
294
+ $-i In in-place-edit mode, this variable holds the extention, otherwise nil.
295
+ $-I The alias to $:.
296
+ $-l True if option -l is set. Read-only variable.
297
+ $-p True if option -p is set. Read-only variable.
298
+ $-v The alias to $VERBOSE.
299
+ EOS
300
+
301
+ h1 "Pre-defined Global Constants"
302
+ pairs <<-'EOS'
303
+ TRUE The typical true value.
304
+ FALSE The false itself.
305
+ NIL The nil itself.
306
+ STDIN The standard input. The default value for $stdin.
307
+ STDOUT The standard output. The default value for $stdout.
308
+ STDERR The standard error output. The default value for $stderr.
309
+ ENV The hash contains current environment variables.
310
+ ARGF The alias to the $&lt;.
311
+ ARGV The alias to the $*.
312
+ DATA The file object of the script, pointing just after __END__.
313
+ RUBY_VERSION The ruby version string (VERSION was depricated).
314
+ RUBY_RELEASE_DATE The relase date string.
315
+ RUBY_PLATFORM The platform identifier.
316
+ EOS
317
+
318
+ h1 "Expressions"
319
+ h2 "Terms"
320
+ body <<-'EOS'
321
+ Terms are expressions that may be a basic type (listed above), a shell
322
+ command, variable reference, constant reference, or method invocation.
323
+ EOS
324
+
325
+ h2 "Operators and Precedence"
326
+ codelines <<-'EOS'
327
+ ::
328
+ []
329
+ **
330
+ - (unary) + (unary) ! ~
331
+ * / %
332
+ + -
333
+ &lt;&lt; &gt;&gt;
334
+ &amp;
335
+ | ^
336
+ &gt; &gt;= &lt; &lt;=
337
+ &lt;=&gt; == === != =~ !~
338
+ &amp;&amp;
339
+ ||
340
+ .. ...
341
+ = (+=, -=, ...)
342
+ not
343
+ and or
344
+ EOS
345
+
346
+ h2 "Control Expressions"
347
+ pre <<-'EOS'
348
+ if bool-expr [then]
349
+ body
350
+ elsif bool-expr [then]
351
+ body
352
+ else
353
+ body
354
+ end
355
+
356
+ unless bool-expr [then]
357
+ body
358
+ else
359
+ body
360
+ end
361
+
362
+ expr if bool-expr
363
+ expr unless bool-expr
364
+
365
+ case target-expr
366
+ # (comparisons may be regexen)
367
+ when comparison [, comparison]... [then]
368
+ body
369
+ when comparison [, comparison]... [then]
370
+ body
371
+ ...
372
+ [else
373
+ body]
374
+ end
375
+
376
+ while bool-expr [do]
377
+ body
378
+ end
379
+
380
+ until bool-expr [do]
381
+ body
382
+ end
383
+
384
+ begin
385
+ body
386
+ end while bool-expr
387
+
388
+ begin
389
+ body
390
+ end until bool-expr
391
+
392
+ for name[, name]... in expr [do]
393
+ body
394
+ end
395
+
396
+ expr.each do | name[, name]... |
397
+ body
398
+ end
399
+
400
+ expr while bool-expr
401
+ expr until bool-expr
402
+ EOS
403
+ pairs <<-'EOS'
404
+ break terminates loop immediately.
405
+ redo immediately repeats w/o rerunning the condition.
406
+ next starts the next iteration through the loop.
407
+ retry restarts the loop, rerunning the condition.
408
+ EOS
409
+
410
+ h1 "Invoking a Method"
411
+ body <<-'EOS'
412
+ Nearly everything available in a method invocation is optional, consequently
413
+ the syntax is very difficult to follow. Here are some examples:
414
+ EOS
415
+ lines <<-'EOS'
416
+ method
417
+ obj.method
418
+ Class::method
419
+ method(arg1, arg2)
420
+ method(arg1, key1 =&gt; val1, key2 =&gt; val2, aval1, aval2) { block }
421
+ method(arg1, *[arg2, arg3]) becomes: method(arg1, arg2, arg3)
422
+ EOS
423
+ pre <<-'EOS'
424
+ call := [receiver ('::' | '.')] name [params] [block]
425
+ params := ( [param]* [, hash] [*arr] [&amp;proc] )
426
+ block := { body } | do body end
427
+ EOS
428
+
429
+ h1 "Defining a Class"
430
+ body "Class names begin with capital characters."
431
+ pre <<-'EOS'
432
+ class Identifier [ &lt; Superclass ]; ... ; end
433
+
434
+ # Singleton classes, or idioclasses;
435
+ # add methods to a single instance
436
+ # obj can be self
437
+ class &lt;&lt; obj; ...; end
438
+ EOS
439
+
440
+ h1 "Defining a Module"
441
+ body "Module names begin with capital characters."
442
+ pre "module Identifier; ...; end"
443
+
444
+ h1 "Defining a Method"
445
+ pre <<-'EOS'
446
+ def method_name(arg_list); ...; end
447
+ def expr.method_name(arg_list); ...; end
448
+ EOS
449
+ lines <<-'EOS'
450
+ arg_list := ['('] [varname*] ['*' listname] ['&' blockname] [')']
451
+ Arguments may have default values (varname = expr).
452
+ Method definitions may not be nested.
453
+ method_name may be an operator: &lt;=&gt;, ==, ===, =~, &lt;, &lt;=, &gt; &gt;=, +, -, *, /, %, **, &lt;&lt;, &gt;&gt;, ~, +@, -@, [], []= (the last takes two arguments)
454
+ EOS
455
+
456
+ h2 "Access Restriction"
457
+ pairs <<-'EOS'
458
+ public totally accessable.
459
+ protected accessable only by instances of class and direct descendants. Even through hasA relationships. (see below)
460
+ private accessable only by instances of class.
461
+ EOS
462
+ body <<-'EOS'
463
+ Restriction used without arguments set the default access control. Used with
464
+ arguments, sets the access of the named methods and constants.
465
+ EOS
466
+ pre <<-'EOS'
467
+ class A
468
+ protected
469
+ def protected_method; ...; end
470
+ end
471
+ class B &lt; A
472
+ public
473
+ def test_protected
474
+ myA = A.new
475
+ myA.protected_method
476
+ end
477
+ end
478
+ b = B.new.test_protected
479
+ EOS
480
+
481
+ h3 "Accessors"
482
+ body "Module provides the following utility methods:"
483
+ pairs <<-'EOS'
484
+ attr_reader &lt;attribute&gt;[, &lt;attribute&gt;]... Creates a read-only accessor for each &lt;attribute&gt;.
485
+ attr_writer &lt;attribute&gt;[, &lt;attribute&gt;]... Creates a write-only accessor for each &lt;attribute&gt;.
486
+ attr &lt;attribute&gt; [, &lt;writable&gt;] Equivalent to "attr_reader &lt;attribute&gt;; attr_writer &lt;attribute&gt; if &lt;writable&gt;"
487
+ attr_accessor &lt;attribute&gt;[, &lt;attribute&gt;]... Equivalent to "attr &lt;attribute&gt;, true" for each argument.
488
+ EOS
489
+
490
+ h2 "Aliasing"
491
+ pre "alias &lt;old&gt; &lt;new&gt;"
492
+ body <<-'EOS'
493
+ Creates a new reference to whatever old referred to. old can be any existing
494
+ method, operator, global. It may not be a local, instance, constant, or
495
+ class variable.
496
+ EOS
497
+
498
+ h1 "Blocks, Closures, and Procs"
499
+ h2 "Blocks/Closures"
500
+ body "Blocks must follow a method invocation:"
501
+ pre <<-'EOS'
502
+ invocation do ... end
503
+ invocation do || ... end
504
+ invocation do |arg_list| ... end
505
+ invocation { ... }
506
+ invocation { || ... }
507
+ invocation { |arg_list| ... }
508
+ EOS
509
+ lines <<-'EOS'
510
+ Blocks are full closures, remembering their variable context.
511
+ Blocks are invoked via yield and may be passed arguments.
512
+ Block arguments may not have default parameters.
513
+ Brace form ({/}) has higher precedence and will bind to the last parameter if the invocation is made without parentheses.
514
+ do/end form has lower precedence and will bind to the invocation even without parentheses.
515
+ EOS
516
+
517
+ h2 "Proc Objects"
518
+ body "See class Proc for more information. Created via:"
519
+ pre <<-'EOS'
520
+ Kernel#proc (or Kernel#lambda)
521
+ Proc#new
522
+ &amp;block argument on a method
523
+ EOS
524
+
525
+ h2 "Exceptions"
526
+ pre <<-'EOS'
527
+ begin
528
+ expr
529
+ [ rescue [ exception_class [ =&gt; var ], ... ]
530
+ expr ]
531
+ [ else
532
+ expr ]
533
+ [ ensure
534
+ expr ]
535
+ end
536
+
537
+ raise [ exception_class, ] [ message ]
538
+ EOS
539
+ body <<-'EOS'
540
+ The default exception_class for rescue is StandardError, not Exception.
541
+ Raise without an exception_class raises a RuntimeError. All exception
542
+ classes must inherit from Exception or one of its children (listed below).
543
+ EOS
544
+ pairs <<-'EOS'
545
+ StandardError LocalJumpError, SystemStackError, ZeroDivisionError, RangeError (FloatDomainError), SecurityError, ThreadError, IOError (EOFError), ArgumentError, IndexError, RuntimeError, TypeError, SystemCallError (Errno::*), RegexpError
546
+ SignalException
547
+ Interrupt
548
+ NoMemoryError
549
+ ScriptError LoadError, NameError, SyntaxError, NotImplementedError
550
+ SystemExit
551
+ EOS
552
+
553
+ h2 "Catch and Throw"
554
+ pre <<-'EOS'
555
+ catch :label do
556
+ expr
557
+ throw :label
558
+ end
559
+ EOS
560
+
561
+ hline
562
+
563
+ x = pdf.absolute_right_margin + pdf.font_height(5)
564
+ y = pdf.absolute_bottom_margin
565
+ memo = %Q(Copyright � 2005 Ryan Davis with Austin Ziegler. PDF version by Austin Ziegler. Licensed under the <c:alink uri="http://creativecommons.org/licenses/by-nc-sa/2.0/">Creative Commons Attribution-NonCommercial-ShareAlike</c:alink> Licence. The original HTML version is at <c:alink uri="http://www.zenspider.com/Languages/Ruby/QuickRef.html">Zen Spider</c:alink>. Generated by <c:alink uri="http://rubyforge.org/projects/ruby-pdf/">PDF::Writer</c:alink> #{PDF::Writer::VERSION} and PDF::QuickRef #{PDF::QuickRef::VERSION}.)
566
+ pdf.add_text(x, y, 5, memo, -90)
567
+ x = pdf.absolute_right_margin - 32
568
+ y = pdf.absolute_bottom_margin + 24
569
+
570
+ pdf.add_image_from_file("../images/pdfwriter-icon.jpg", x, y)
571
+
572
+ save_as "Ruby-Language-QuickRef.pdf"
573
+ end