rrtf 0.1.1 → 0.1.2

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.
Files changed (70) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +31 -7
  3. data/documentation/RRTF/CharacterFormatting.html +1002 -0
  4. data/documentation/RRTF/CharacterStyle.html +1058 -0
  5. data/documentation/RRTF/Colour.html +813 -0
  6. data/documentation/RRTF/ColourTable.html +770 -0
  7. data/documentation/RRTF/CommandNode.html +2372 -0
  8. data/documentation/RRTF/ContainerNode.html +826 -0
  9. data/documentation/RRTF/Converters/HTML/Helpers.html +272 -0
  10. data/documentation/RRTF/Converters/HTML/Node.html +364 -0
  11. data/documentation/RRTF/Converters/HTML/NodeSet.html +265 -0
  12. data/documentation/RRTF/Converters/HTML.html +337 -0
  13. data/documentation/RRTF/Converters.html +117 -0
  14. data/documentation/RRTF/Document.html +2405 -0
  15. data/documentation/RRTF/DocumentStyle.html +1367 -0
  16. data/documentation/RRTF/Font.html +790 -0
  17. data/documentation/RRTF/FontTable.html +763 -0
  18. data/documentation/RRTF/FooterNode.html +515 -0
  19. data/documentation/RRTF/HeaderNode.html +515 -0
  20. data/documentation/RRTF/ImageNode.html +1374 -0
  21. data/documentation/RRTF/Information.html +809 -0
  22. data/documentation/RRTF/LinkNode.html +264 -0
  23. data/documentation/RRTF/ListLevel.html +799 -0
  24. data/documentation/RRTF/ListLevelNode.html +612 -0
  25. data/documentation/RRTF/ListMarker.html +595 -0
  26. data/documentation/RRTF/ListNode.html +368 -0
  27. data/documentation/RRTF/ListTable.html +343 -0
  28. data/documentation/RRTF/ListTemplate.html +433 -0
  29. data/documentation/RRTF/ListTextNode.html +285 -0
  30. data/documentation/RRTF/Node.html +616 -0
  31. data/documentation/RRTF/Paper.html +624 -0
  32. data/documentation/RRTF/ParagraphFormatting.html +749 -0
  33. data/documentation/RRTF/ParagraphNode.html +275 -0
  34. data/documentation/RRTF/ParagraphStyle.html +1319 -0
  35. data/documentation/RRTF/RTFError.html +295 -0
  36. data/documentation/RRTF/Style.html +1767 -0
  37. data/documentation/RRTF/Stylesheet.html +1768 -0
  38. data/documentation/RRTF/TableCellNode.html +1704 -0
  39. data/documentation/RRTF/TableNode.html +1025 -0
  40. data/documentation/RRTF/TableRowNode.html +675 -0
  41. data/documentation/RRTF/TextNode.html +600 -0
  42. data/documentation/RRTF/Utilities.html +201 -0
  43. data/documentation/RRTF.html +129 -0
  44. data/documentation/_index.html +478 -0
  45. data/documentation/class_list.html +51 -0
  46. data/documentation/css/common.css +1 -0
  47. data/documentation/css/full_list.css +58 -0
  48. data/documentation/css/style.css +492 -0
  49. data/documentation/file.README.html +223 -0
  50. data/documentation/file_list.html +56 -0
  51. data/documentation/frames.html +17 -0
  52. data/documentation/index.html +223 -0
  53. data/documentation/js/app.js +248 -0
  54. data/documentation/js/full_list.js +216 -0
  55. data/documentation/js/jquery.js +4 -0
  56. data/documentation/method_list.html +2203 -0
  57. data/documentation/top-level-namespace.html +110 -0
  58. data/examples/01.rtf +14 -17
  59. data/examples/01_mac_word15_36.png +0 -0
  60. data/examples/01_styles_and_paragraphs.rb +3 -4
  61. data/examples/resources/json/redshirt_styles.json +4 -2
  62. data/lib/rrtf/node.rb +86 -167
  63. data/lib/rrtf/style/character_style.rb +4 -3
  64. data/lib/rrtf/style/formatting.rb +55 -11
  65. data/lib/rrtf/style/paragraph_style.rb +19 -4
  66. data/lib/rrtf/style/style.rb +15 -15
  67. data/lib/rrtf/stylesheet.rb +57 -16
  68. data/lib/rrtf/version.rb +1 -1
  69. data/rrtf.gemspec +1 -0
  70. metadata +70 -1
@@ -0,0 +1,110 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>
7
+ Top Level Namespace
8
+
9
+ &mdash; Documentation by YARD 0.9.9
10
+
11
+ </title>
12
+
13
+ <link rel="stylesheet" href="css/style.css" type="text/css" charset="utf-8" />
14
+
15
+ <link rel="stylesheet" href="css/common.css" type="text/css" charset="utf-8" />
16
+
17
+ <script type="text/javascript" charset="utf-8">
18
+ pathId = "";
19
+ relpath = '';
20
+ </script>
21
+
22
+
23
+ <script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
24
+
25
+ <script type="text/javascript" charset="utf-8" src="js/app.js"></script>
26
+
27
+
28
+ </head>
29
+ <body>
30
+ <div class="nav_wrap">
31
+ <iframe id="nav" src="class_list.html?1"></iframe>
32
+ <div id="resizer"></div>
33
+ </div>
34
+
35
+ <div id="main" tabindex="-1">
36
+ <div id="header">
37
+ <div id="menu">
38
+
39
+ <a href="_index.html">Index</a> &raquo;
40
+
41
+
42
+ <span class="title">Top Level Namespace</span>
43
+
44
+ </div>
45
+
46
+ <div id="search">
47
+
48
+ <a class="full_list_link" id="class_list_link"
49
+ href="class_list.html">
50
+
51
+ <svg width="24" height="24">
52
+ <rect x="0" y="4" width="24" height="4" rx="1" ry="1"></rect>
53
+ <rect x="0" y="12" width="24" height="4" rx="1" ry="1"></rect>
54
+ <rect x="0" y="20" width="24" height="4" rx="1" ry="1"></rect>
55
+ </svg>
56
+ </a>
57
+
58
+ </div>
59
+ <div class="clear"></div>
60
+ </div>
61
+
62
+ <div id="content"><h1>Top Level Namespace
63
+
64
+
65
+
66
+ </h1>
67
+ <div class="box_info">
68
+
69
+
70
+
71
+
72
+
73
+
74
+
75
+
76
+
77
+
78
+
79
+ </div>
80
+
81
+ <h2>Defined Under Namespace</h2>
82
+ <p class="children">
83
+
84
+
85
+ <strong class="modules">Modules:</strong> <span class='object_link'><a href="RRTF.html" title="RRTF (module)">RRTF</a></span>
86
+
87
+
88
+
89
+
90
+ </p>
91
+
92
+
93
+
94
+
95
+
96
+
97
+
98
+
99
+
100
+ </div>
101
+
102
+ <div id="footer">
103
+ Generated on Mon Jul 24 15:48:59 2017 by
104
+ <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
105
+ 0.9.9 (ruby-2.3.3).
106
+ </div>
107
+
108
+ </div>
109
+ </body>
110
+ </html>
data/examples/01.rtf CHANGED
@@ -7,39 +7,36 @@
7
7
  \red255\green0\blue0;
8
8
  }
9
9
  {\stylesheet
10
- {\s1 \qc\sa100\ltrpar \b\uldb\caps\ulc1\fs36 \sbasedon3 \sautoupd \snext3 \sqformat \spriority100 Title;}
11
- {\s2 \ql\sb200\sa40\ltrpar \b\ul\ulc1\fs24 \snext3 \sqformat \spriority101 Heading 1;}
12
- {\s3 \ql\hyphpar\ltrpar \fs24 \sqformat \spriority102 Body;}
13
- {\*\cs4 \b\i\cf1 \additive \spriority103 Emphasis;}
10
+ {\s1 \qc\sa100\ltrpar\b\uldb\caps\ulc1\fs36 \sbasedon0 \sautoupd \snext0 \sqformat \spriority1 Title;}
11
+ {\s2 \ql\sb200\sa40\ltrpar\b\ul\ulc1\fs24 \snext0 \sqformat \spriority2 Heading 1;}
12
+ {\s0 \ql\hyphpar\ltrpar\fs24 \sqformat \spriority3 Normal;}
13
+ {\*\cs3 \b\i\cf1 \additive \spriority4 Emphasis;}
14
14
  }
15
15
  {\info
16
- {\createim\yr2017\mo7\dy23\hr19\min18}
16
+ {\createim\yr2017\mo7\dy24\hr15\min51}
17
17
  }
18
18
 
19
19
  \stylesortmethod1\paperw12247\paperh15819\margl1800\margr1800\margt1440\margb1440
20
- {\pard\s1 \qc\sa100\ltrpar \b\uldb\caps\ulc1\fs36
20
+ {\pard\s1 \qc\sa100\ltrpar\b\uldb\caps\ulc1\fs36
21
21
  RedShirts 101
22
22
  \par}
23
- {\pard\s3 \ql\hyphpar\ltrpar \fs24
23
+ {\pard\s0 \ql\hyphpar\ltrpar\fs24
24
24
  Should you ever find yourself on a spacefaring vessel wearing a
25
- {\cs4 \b\i\cf1
25
+ {\cs3 \b\i\cf1
26
26
  red
27
27
  }
28
28
  shirt, take heed and be on guard, for danger is immanent and you are likely expendable among the crew...
29
29
  \par}
30
- {\pard\s2 \ql\sb200\sa40\ltrpar \b\ul\ulc1\fs24
30
+ {\pard\s2 \ql\sb200\sa40\ltrpar\b\ul\ulc1\fs24
31
31
  1. The Danger of Away Missions
32
32
  \par}
33
- {\pard\s3 \ql\hyphpar\ltrpar \fs24
34
- If you're ever assigned an away mission, its almost certian to be your doom. The optimal stategy is to avoid away missions to begin with...
33
+ {\pard\s0 \ql\hyphpar\ltrpar\fs24
34
+ If you're ever assigned an away mission, it's almost certain to be your doom. The optimal strategy is to avoid away missions to begin with...
35
35
  \par}
36
- {\pard\s2 \ql\sb200\sa40\ltrpar \b\ul\ulc1\fs24
36
+ {\pard\s2 \ql\sb200\sa40\ltrpar\b\ul\ulc1\fs24
37
37
  2. Avoiding High-Ranking Officers
38
38
  \par}
39
- {\pard\s3 \ql\hyphpar\ltrpar \fs24
40
- You're likely to notice an influx of unfortunate outcomes around certian high-ranking officers. Its to your advantage to quickly identify and avoid these officers...
41
- \par}
42
- {\pard\s2 \ql\sb200\sa40\ltrpar \b\ul\ulc1\fs24
43
- 3. Miscellaneous Hazards
39
+ {\pard\s0 \ql\hyphpar\ltrpar\fs24
40
+ You're likely to notice an influx of unfortunate outcomes around certain high-ranking officers. Its to your advantage to quickly identify and avoid these officers...
44
41
  \par}
45
42
  }
Binary file
@@ -17,17 +17,16 @@ rtf.paragraph(styles['BODY']) do |p|
17
17
  end
18
18
  rtf.paragraph(styles['H1']) << "1. The Danger of Away Missions"
19
19
  rtf.paragraph(styles['BODY']) do |p|
20
- p << "If you're ever assigned an away mission, its almost certian to be your doom. "
21
- p << "The optimal stategy is to avoid away missions to begin with..."
20
+ p << "If you're ever assigned an away mission, it's almost certain to be your doom. "
21
+ p << "The optimal strategy is to avoid away missions to begin with..."
22
22
  end
23
23
  rtf.paragraph(styles['H1']) << "2. Avoiding High-Ranking Officers"
24
24
  rtf.paragraph(styles['BODY']) do |p|
25
25
  p << "You're likely to notice an influx of unfortunate outcomes around "
26
- p << "certian high-ranking officers. Its to your advantage to quickly identify and "
26
+ p << "certain high-ranking officers. Its to your advantage to quickly identify and "
27
27
  p << "avoid these officers..."
28
28
  end
29
29
 
30
-
31
30
  File.open(DIR+'/01.rtf', 'w') do |file|
32
31
  file.write(rtf.to_rtf)
33
32
  end
@@ -31,8 +31,9 @@
31
31
  {
32
32
  "type": "paragraph",
33
33
  "id": "BODY",
34
- "name": "Body",
34
+ "name": "Normal",
35
35
  "primary": true,
36
+ "default": true,
36
37
  "justification": "LEFT",
37
38
  "font_size": 24,
38
39
  "hyphenate": true
@@ -44,6 +45,7 @@
44
45
  "additive": true,
45
46
  "italic": true,
46
47
  "bold": true,
47
- "foreground_color": "#ff0000"
48
+ "foreground_color": "#ff0000",
49
+ "locked": true
48
50
  }
49
51
  ]
data/lib/rrtf/node.rb CHANGED
@@ -1515,150 +1515,65 @@ module RRTF
1515
1515
  # This class represents an RTF document. In actuality it is just a
1516
1516
  # specialised Node type that cannot be assigned a parent and that holds
1517
1517
  # document font, colour and information tables.
1518
+ # @author Peter Wood
1518
1519
  class Document < CommandNode
1519
- # A definition for a document character set setting.
1520
- CS_ANSI = :ansi
1521
-
1522
- # A definition for a document character set setting.
1523
- CS_MAC = :mac
1524
-
1525
- # A definition for a document character set setting.
1526
- CS_PC = :pc
1527
-
1528
- # A definition for a document character set setting.
1529
- CS_PCA = :pca
1530
-
1531
- # A definition for a document language setting.
1532
- LC_AFRIKAANS = 1078
1533
-
1534
- # A definition for a document language setting.
1535
- LC_ARABIC = 1025
1536
-
1537
- # A definition for a document language setting.
1538
- LC_CATALAN = 1027
1539
-
1540
- # A definition for a document language setting.
1541
- LC_CHINESE_TRADITIONAL = 1028
1542
-
1543
- # A definition for a document language setting.
1544
- LC_CHINESE_SIMPLIFIED = 2052
1545
-
1546
- # A definition for a document language setting.
1547
- LC_CZECH = 1029
1548
-
1549
- # A definition for a document language setting.
1550
- LC_DANISH = 1030
1551
-
1552
- # A definition for a document language setting.
1553
- LC_DUTCH = 1043
1554
-
1555
- # A definition for a document language setting.
1556
- LC_DUTCH_BELGIAN = 2067
1557
-
1558
- # A definition for a document language setting.
1559
- LC_ENGLISH_UK = 2057
1560
-
1561
- # A definition for a document language setting.
1562
- LC_ENGLISH_US = 1033
1563
-
1564
- # A definition for a document language setting.
1565
- LC_FINNISH = 1035
1566
-
1567
- # A definition for a document language setting.
1568
- LC_FRENCH = 1036
1569
-
1570
- # A definition for a document language setting.
1571
- LC_FRENCH_BELGIAN = 2060
1572
-
1573
- # A definition for a document language setting.
1574
- LC_FRENCH_CANADIAN = 3084
1575
-
1576
- # A definition for a document language setting.
1577
- LC_FRENCH_SWISS = 4108
1578
-
1579
- # A definition for a document language setting.
1580
- LC_GERMAN = 1031
1581
-
1582
- # A definition for a document language setting.
1583
- LC_GERMAN_SWISS = 2055
1584
-
1585
- # A definition for a document language setting.
1586
- LC_GREEK = 1032
1587
-
1588
- # A definition for a document language setting.
1589
- LC_HEBREW = 1037
1590
-
1591
- # A definition for a document language setting.
1592
- LC_HUNGARIAN = 1038
1593
-
1594
- # A definition for a document language setting.
1595
- LC_ICELANDIC = 1039
1596
-
1597
- # A definition for a document language setting.
1598
- LC_INDONESIAN = 1057
1599
-
1600
- # A definition for a document language setting.
1601
- LC_ITALIAN = 1040
1602
-
1603
- # A definition for a document language setting.
1604
- LC_JAPANESE = 1041
1605
-
1606
- # A definition for a document language setting.
1607
- LC_KOREAN = 1042
1608
-
1609
- # A definition for a document language setting.
1610
- LC_NORWEGIAN_BOKMAL = 1044
1611
-
1612
- # A definition for a document language setting.
1613
- LC_NORWEGIAN_NYNORSK = 2068
1614
-
1615
- # A definition for a document language setting.
1616
- LC_POLISH = 1045
1617
-
1618
- # A definition for a document language setting.
1619
- LC_PORTUGUESE = 2070
1620
-
1621
- # A definition for a document language setting.
1622
- LC_POTUGUESE_BRAZILIAN = 1046
1623
-
1624
- # A definition for a document language setting.
1625
- LC_ROMANIAN = 1048
1626
-
1627
- # A definition for a document language setting.
1628
- LC_RUSSIAN = 1049
1629
-
1630
- # A definition for a document language setting.
1631
- LC_SERBO_CROATIAN_CYRILLIC = 2074
1632
-
1633
- # A definition for a document language setting.
1634
- LC_SERBO_CROATIAN_LATIN = 1050
1635
-
1636
- # A definition for a document language setting.
1637
- LC_SLOVAK = 1051
1638
-
1639
- # A definition for a document language setting.
1640
- LC_SPANISH_CASTILLIAN = 1034
1641
-
1642
- # A definition for a document language setting.
1643
- LC_SPANISH_MEXICAN = 2058
1644
-
1645
- # A definition for a document language setting.
1646
- LC_SWAHILI = 1089
1647
-
1648
- # A definition for a document language setting.
1649
- LC_SWEDISH = 1053
1650
-
1651
- # A definition for a document language setting.
1652
- LC_THAI = 1054
1653
-
1654
- # A definition for a document language setting.
1655
- LC_TURKISH = 1055
1656
-
1657
- # A definition for a document language setting.
1658
- LC_UNKNOWN = 1024
1520
+ # A hash mapping character set string constants to their RTF counterparts.
1521
+ # @return [Hash<String, Symbol>] the RTF character set dictionary.
1522
+ CS_DICTIONARY = {
1523
+ "ANSI" => :ansi,
1524
+ "MAC" => :mac,
1525
+ "PC" => :pc,
1526
+ "PCA" => :pca
1527
+ }.freeze
1659
1528
 
1660
- # A definition for a document language setting.
1661
- LC_VIETNAMESE = 1066
1529
+ # A hash mapping langauge set string constants to their RTF counterparts.
1530
+ # @return [Hash<String, Integer>] the RTF langauge setting dictionary.
1531
+ LS_DICTIONARY = {
1532
+ "AFRIKAANS" => 1078,
1533
+ "ARABIC" => 1025,
1534
+ "CATALAN" => 1027,
1535
+ "CHINESE_TRADITIONAL" => 1028,
1536
+ "CHINESE_SIMPLIFIED" => 2052,
1537
+ "CZECH" => 1029,
1538
+ "DANISH" => 1030,
1539
+ "DUTCH" => 1043,
1540
+ "DUTCH_BELGIAN" => 2067,
1541
+ "ENGLISH_UK" => 2057,
1542
+ "ENGLISH_US" => 1033,
1543
+ "FINNISH" => 1035,
1544
+ "FRENCH" => 1036,
1545
+ "FRENCH_BELGIAN" => 2060,
1546
+ "FRENCH_CANADIAN" => 3084,
1547
+ "FRENCH_SWISS" => 4108,
1548
+ "GERMAN" => 1031,
1549
+ "GERMAN_SWISS" => 2055,
1550
+ "GREEK" => 1032,
1551
+ "HEBREW" => 1037,
1552
+ "HUNGARIAN" => 1038,
1553
+ "ICELANDIC" => 1039,
1554
+ "INDONESIAN" => 1057,
1555
+ "ITALIAN" => 1040,
1556
+ "JAPANESE" => 1041,
1557
+ "KOREAN" => 1042,
1558
+ "NORWEGIAN_BOKMAL" => 1044,
1559
+ "NORWEGIAN_NYNORSK" => 2068,
1560
+ "POLISH" => 1045,
1561
+ "PORTUGUESE" => 2070,
1562
+ "POTUGUESE_BRAZILIAN" => 1046,
1563
+ "ROMANIAN" => 1048,
1564
+ "RUSSIAN" => 1049,
1565
+ "SERBO_CROATIAN_CYRILLIC" => 2074,
1566
+ "SERBO_CROATIAN_LATIN" => 1050,
1567
+ "SLOVAK" => 1051,
1568
+ "SPANISH_CASTILLIAN" => 1034,
1569
+ "SPANISH_MEXICAN" => 2058,
1570
+ "SWAHILI" => 1089,
1571
+ "SWEDISH" => 1053,
1572
+ "THAI" => 1054,
1573
+ "TURKISH" => 1055,
1574
+ "UNKNOWN" => 1024,
1575
+ "VIETNAMESE" => 1066
1576
+ }.freeze
1662
1577
 
1663
1578
  # Attribute accessor.
1664
1579
  attr_reader :fonts, :lists, :colours, :information, :character_set,
@@ -1668,35 +1583,25 @@ module RRTF
1668
1583
  attr_writer :character_set, :language, :stylesheet
1669
1584
 
1670
1585
 
1671
- # This is a constructor for the Document class.
1586
+ # Represents an entire RTF document.
1587
+ # @note The "suppress_system_styles" option is ignored by most RTF platforms including Word and LibreOffice.
1588
+ # @see DocumentStyle#initialize DocumentStyle#initialize for available document style options.
1589
+ # @see Stylesheet#add_style Stylesheet#initialize for available stylesheet options.
1672
1590
  #
1673
- # ==== Parameters
1674
- # options:: A hashmap of options to use in initializing the document
1675
- # default_font:: A font object OR string encapsulating the default
1676
- # font to be used by the document.
1677
- # STRING FORMAT "<FAMILY>:<Name>"
1678
- # DEFAULT "SWISS:Helvetica".
1679
- # document_style:: A DocumentStyle object OR options hash encapsulating
1680
- # the style settings to be applied to the document.
1681
- # DEFAULT DocumentStyle object with default settings.
1682
- # character_set:: The character set to be applied to the document.
1683
- # DEFAULT Document::CS_ANSI.
1684
- # language:: The language setting to be applied to document.
1685
- # DEFAULT Document::LC_ENGLISH_UK.
1686
- # suppress_system_styles:: A Boolean indicating whether or not to add
1687
- # the \noqfpromote control word, which indicates
1688
- # "quick" or default styles should be suppressed.
1689
- # DEFAULT false.
1690
- # stylesheet:: A Stylesheet object OR hashmap array encapsulating
1691
- # the styles to make available throughout the document.
1692
- # DEFAULT nil.
1591
+ # @param [Hash<String, Object>] options the options to use in creating the document.
1592
+ # @option options [String, Font] "default_font" ("SWISS:Helvetica") a font object OR string encapsulating the default font to be used by the document (see {Font.from_string} for string format).
1593
+ # @option options [String] "character_set" ("ANSI") the character set to be applied to the document (see {CS_DICTIONARY} for valid values).
1594
+ # @option options [String] "language" ("ENGLISH_US") the language setting to be applied to the document (see {LS_DICTIONARY} for valid values).
1595
+ # @option options [Boolean] "suppress_system_styles" (false) whether or not to suppress styles provided in the host platform (adds the \noqfpromote control word before stylesheet definition).
1596
+ # @option options [DocumentStyle] "document_style" (DocumentStyle.new) a DocumentStyle object OR options hash encapsulating the style settings to be applied to the document.
1597
+ # @option options [Array, Hash, Stylesheet] "stylesheet" (nil) a Stylesheet object OR array of style hashes OR hash of stylesheet options with which to use as or construct the stylesheet for the document.
1693
1598
  def initialize(options = {})
1694
1599
  # load default options
1695
1600
  options = {
1696
1601
  "default_font" => "SWISS:Helvetica",
1697
1602
  "document_style" => DocumentStyle.new,
1698
- "character_set" => CS_ANSI,
1699
- "language" => LC_ENGLISH_US,
1603
+ "character_set" => "ANSI",
1604
+ "language" => "ENGLISH_US",
1700
1605
  "suppress_system_styles" => false,
1701
1606
  "stylesheet" => nil
1702
1607
  }.merge(options)
@@ -1723,13 +1628,27 @@ module RRTF
1723
1628
  RTFError.fire("Unreconized document style format #{font.class.to_s}")
1724
1629
  end # case
1725
1630
 
1631
+ # parse character set
1632
+ cs_string = options.delete("character_set")
1633
+ cs_val = CS_DICTIONARY[cs_string]
1634
+ if cs_val.nil?
1635
+ RTFError.fire("Unreconized character set '#{cs_string}'.")
1636
+ end # if
1637
+
1638
+ # parse language setting
1639
+ ls_string = options.delete("language")
1640
+ ls_val = LS_DICTIONARY[ls_string]
1641
+ if ls_val.nil?
1642
+ RTFError.fire("Unreconized language '#{ls_string}'.")
1643
+ end # if
1644
+
1726
1645
  @fonts = FontTable.new(font)
1727
1646
  @lists = ListTable.new
1728
1647
  @default_font = 0
1729
1648
  @colours = ColourTable.new
1730
1649
  @information = Information.new
1731
- @character_set = options.delete("character_set")
1732
- @language = options.delete("language")
1650
+ @character_set = cs_val
1651
+ @language = ls_val
1733
1652
  @style = style
1734
1653
  @headers = [nil, nil, nil, nil]
1735
1654
  @footers = [nil, nil, nil, nil]
@@ -7,9 +7,9 @@ module RRTF
7
7
 
8
8
  # This is the constructor for the CharacterStyle class.
9
9
  #
10
- # ==== Exceptions
11
- # RTFError:: Generate if the parent style specified is not an instance
12
- # of the CharacterStyle class.
10
+ # @param [Hash] options the character style options.
11
+ # @option options (see Style#initialize)
12
+ # @option options (see CharacterFormatting#initialize_character_formatting)
13
13
  def initialize(options = {})
14
14
  super(options)
15
15
  initialize_character_formatting(options)
@@ -45,6 +45,7 @@ module RRTF
45
45
  rtf << "\\snext#{@next_style_handle}#{suffix}" unless @next_style_handle.nil?
46
46
  rtf << "\\sqformat#{suffix}" if @primary
47
47
  rtf << "\\spriority#{@priority}#{suffix}" unless @priority.nil?
48
+ rtf << "\\shidden#{suffix}" if @hidden
48
49
  rtf << "#{name_prefix}#{name};}"
49
50
 
50
51
  rtf.string
@@ -1,6 +1,7 @@
1
1
  require 'stringio'
2
2
 
3
- # Encapsulates all character formatting methods shared between style types
3
+ # Encapsulates all character formatting methods shared between style types.
4
+ # @author Wesley Hileman
4
5
  module RRTF::CharacterFormatting
5
6
  CHARACTER_ATTRIBUTES = {
6
7
  # toggable attributes
@@ -72,7 +73,7 @@ module RRTF::CharacterFormatting
72
73
  "default" => nil,
73
74
  "to_rtf" => lambda{ |value, document| (value ? '\outl' : '\outl0') unless value.nil? }
74
75
  },
75
- "hidden" => {
76
+ "text_hidden" => {
76
77
  "default" => nil,
77
78
  "to_rtf" => lambda{ |value, document| (value ? '\v' : '\v0') unless value.nil? }
78
79
  },
@@ -87,29 +88,29 @@ module RRTF::CharacterFormatting
87
88
  },
88
89
  "foreground_color" => {
89
90
  "default" => nil,
90
- "from_user" => lambda{ |value| RRTF::Colour.from_string(value) },
91
+ "from_user" => lambda{ |value| value.is_a?(RRTF::Colour) ? value : RRTF::Colour.from_string(value) },
91
92
  "to_rtf" => lambda{ |value, document| "\\cf#{document.colours.index(value)}" unless value.nil? }
92
93
  },
93
94
  "background_color" => {
94
95
  "default" => nil,
95
- "from_user" => lambda{ |value| RRTF::Colour.from_string(value) },
96
+ "from_user" => lambda{ |value| value.is_a?(RRTF::Colour) ? value : RRTF::Colour.from_string(value) },
96
97
  "to_rtf" => lambda{ |value, document| "\\cb#{document.colours.index(value)}" unless value.nil? }
97
98
  },
98
99
  "underline_color" => {
99
100
  "default" => nil,
100
- "from_user" => lambda{ |value| RRTF::Colour.from_string(value) },
101
+ "from_user" => lambda{ |value| value.is_a?(RRTF::Colour) ? value : RRTF::Colour.from_string(value) },
101
102
  "to_rtf" => lambda{ |value, document| "\\ulc#{document.colours.index(value)}" unless value.nil? }
102
103
  },
103
104
  "font" => {
104
105
  "default" => nil,
105
- "from_user" => lambda{ |value| RRTF::Font.from_string(value) },
106
+ "from_user" => lambda{ |value| value.is_a?(RRTF::Font) ? value : RRTF::Font.from_string(value) },
106
107
  "to_rtf" => lambda{ |value, document| "\\f#{document.fonts.index(value)}" unless value.nil? }
107
108
  },
108
109
  "font_size" => {
109
110
  "default" => nil,
110
111
  "to_rtf" => lambda{ |value, document| "\\fs#{value}" unless value.nil? }
111
112
  }
112
- }
113
+ }.freeze
113
114
 
114
115
  def self.included(base)
115
116
  # define accessors in base for paragraph attributes
@@ -120,6 +121,27 @@ module RRTF::CharacterFormatting
120
121
  end # class_eval
121
122
  end
122
123
 
124
+ # Initializes character formatting attributes.
125
+ #
126
+ # @param [Hash] options the character formatting options.
127
+ # @option options [Boolean] "bold" (nil) enable or disable bold (nil to remain same).
128
+ # @option options [Boolean] "italic" (nil) enable or disable italic (nil to remain same).
129
+ # @option options [Boolean, String] "underline" (nil) enable or disable underline (nil to remain same); can also be a string (see {CharacterFormatting::CHARACTER_ATTRIBUTES}).
130
+ # @option options [Boolean] "uppercase" (nil) enable or disable all caps (nil to remain same).
131
+ # @option options [Boolean] "superscript" (nil) enable or disable superscript (nil to remain same).
132
+ # @option options [Boolean] "subscript" (nil) enable or disable subscript (nil to remain same).
133
+ # @option options [Boolean] "strike" (nil) enable or disable single line-through (nil to remain same).
134
+ # @option options [Boolean] "emboss" (nil) enable or disable emboss (nil to remain same).
135
+ # @option options [Boolean] "imprint" (nil) enable or disable imprint (nil to remain same).
136
+ # @option options [Boolean] "outline" (nil) enable or disable outline (nil to remain same).
137
+ # @option options [Boolean] "text_hidden" (nil) enable or disable hidden (nil to remain same).
138
+ # @option options [Boolean, Integer] "kerning" (nil) enable or disable kerning (nil to remain same); to enable specify the font size in half-points above which kerining will be applied.
139
+ # @option options [Integer] "character_spacing_offset" (nil) quarter points by which to expand or compress character spacing (negative for compress).
140
+ # @option options [String, Colour] "foreground_color" (nil) colour to apply to the foreground (text); see {Colour.from_string} for string format.
141
+ # @option options [String, Colour] "background_color" (nil) colour to apply to the background (highlight); see {Colour.from_string} for string format.
142
+ # @option options [String, Colour] "underline_color" (nil) colour to apply to the underline; see {Colour.from_string} for string format.
143
+ # @option options [String, Font] "font" (nil) font to apply to text; see {Font.from_string} for string format.
144
+ # @option options [Integer] "font_size" (nil) font size in half-points.
123
145
  def initialize_character_formatting(options = {})
124
146
  # load default attribute values
125
147
  CHARACTER_ATTRIBUTES.each do |key, options|
@@ -159,14 +181,18 @@ module RRTF::CharacterFormatting
159
181
 
160
182
  # accumulate RTF representations of attributes
161
183
  CHARACTER_ATTRIBUTES.each do |key, options|
162
- text << options["to_rtf"].call(send(key), document) if options.has_key?("to_rtf")
184
+ if options.has_key?("to_rtf")
185
+ rtf = options["to_rtf"].call(send(key), document)
186
+ text << rtf unless rtf.nil?
187
+ end # if
163
188
  end # each
164
189
 
165
190
  text.string
166
191
  end
167
192
  end # module CharacterFormatting
168
193
 
169
- # Encapsulates all paragraph formatting methods shared between style types
194
+ # Encapsulates all paragraph formatting methods shared between style types.
195
+ # @author Wesley Hileman
170
196
  module RRTF::ParagraphFormatting
171
197
  PARAGRAPH_ATTRIBUTES = {
172
198
  "justification" => {
@@ -228,7 +254,7 @@ module RRTF::ParagraphFormatting
228
254
  },
229
255
  "to_rtf" => lambda{ |value, document| "\\#{value}par" unless value.nil? }
230
256
  }
231
- }
257
+ }.freeze
232
258
 
233
259
  def self.included(base)
234
260
  # define accessors in base for paragraph attributes
@@ -239,6 +265,21 @@ module RRTF::ParagraphFormatting
239
265
  end # class_eval
240
266
  end
241
267
 
268
+ # Initializes paragraph formatting attributes.
269
+ #
270
+ # @param [Hash] options the paragraph formatting options.
271
+ # @option options [String] "justification" ('LEFT') the paragraph justification ('LEFT', 'CENTER'/'CENTRE', 'RIGHT', or 'FULL').
272
+ # @option options [Integer] "left_indent" (nil) the left indent of the paragraph (twentieth points).
273
+ # @option options [Integer] "right_indent" (nil) the right indent of the paragraph (twentieth points).
274
+ # @option options [Integer] "first_line_indent" (nil) the first line indent of the paragraph (twentieth points).
275
+ # @option options [Integer] "space_before" (nil) the space before the paragraph (twentieth points).
276
+ # @option options [Integer] "space_after" (nil) the space after the paragraph (twentieth points).
277
+ # @option options [Integer] "line_spacing" (nil) the line spacing in the paragraph (twentieth points).
278
+ # @option options [Boolean] "widow_orphan_ctl" (nil) enable or disable widow-and-orphan control.
279
+ # @option options [Boolean] "no_break" (nil) when true, tries to keep the paragraph on the same page (i.e. without breaking).
280
+ # @option options [Boolean] "no_break_with_next" (nil) when true, tries to keep the paragraph with the next paragraph on the same page (i.e. without breaking).
281
+ # @option options [Boolean] "hyphenate" (nil) enable or disable hyphenation for the paragraph.
282
+ # @option options [String] "paragraph_flow" ('LEFT_TO_RIGHT') the text flow direction in the paragraph ('LEFT_TO_RIGHT' or 'RIGHT_TO_LEFT').
242
283
  def initialize_paragraph_formatting(options = {})
243
284
  # load default attribute values
244
285
  PARAGRAPH_ATTRIBUTES.each do |key, options|
@@ -268,7 +309,10 @@ module RRTF::ParagraphFormatting
268
309
 
269
310
  # accumulate RTF representations of paragraph attributes
270
311
  PARAGRAPH_ATTRIBUTES.each do |key, options|
271
- text << options["to_rtf"].call(send(key), document) if options.has_key?("to_rtf")
312
+ if options.has_key?("to_rtf")
313
+ rtf = options["to_rtf"].call(send(key), document)
314
+ text << rtf unless rtf.nil?
315
+ end # if
272
316
  end # each
273
317
 
274
318
  text.string