surpass 0.0.4 → 0.0.6

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 (259) hide show
  1. data/History.txt +4 -0
  2. data/README.txt +3 -20
  3. data/Rakefile +2 -13
  4. data/bin/surpass +8 -0
  5. data/examples/big-16mb.rb +25 -0
  6. data/examples/big-random-strings.rb +28 -0
  7. data/examples/blanks.rb +34 -0
  8. data/examples/blanks.xls +0 -0
  9. data/examples/col_width.rb +16 -0
  10. data/examples/col_width.xls +0 -0
  11. data/examples/dates.rb +31 -0
  12. data/examples/dates.xls +0 -0
  13. data/examples/format.rb +23 -0
  14. data/examples/format.xls +0 -0
  15. data/examples/hello-world.rb +9 -0
  16. data/examples/hello-world.xls +0 -0
  17. data/examples/image.rb +10 -0
  18. data/examples/image.xls +0 -0
  19. data/examples/merged.rb +36 -0
  20. data/examples/merged.xls +0 -0
  21. data/examples/merged0.rb +27 -0
  22. data/examples/merged0.xls +0 -0
  23. data/examples/merged1.rb +99 -0
  24. data/examples/merged1.xls +0 -0
  25. data/examples/num_formats.rb +55 -0
  26. data/examples/num_formats.xls +0 -0
  27. data/examples/numbers.rb +24 -0
  28. data/examples/numbers.xls +0 -0
  29. data/examples/outline.rb +110 -0
  30. data/examples/outline.xls +0 -0
  31. data/examples/panes.rb +48 -0
  32. data/examples/panes.xls +0 -0
  33. data/examples/protection.rb +132 -0
  34. data/examples/protection.xls +0 -0
  35. data/examples/python.bmp +0 -0
  36. data/examples/row_styles.rb +16 -0
  37. data/examples/row_styles.xls +0 -0
  38. data/examples/row_styles_empty.rb +15 -0
  39. data/examples/row_styles_empty.xls +0 -0
  40. data/examples/set_cell_and_range_style.rb +12 -0
  41. data/examples/set_cell_and_range_style.xls +0 -0
  42. data/examples/wrapped-text.rb +13 -0
  43. data/examples/wrapped-text.xls +0 -0
  44. data/examples/write_arrays.rb +22 -0
  45. data/examples/write_arrays.xls +0 -0
  46. data/examples/ws_props.rb +80 -0
  47. data/lib/surpass/ExcelFormula.g +366 -0
  48. data/lib/surpass/ExcelFormula.tokens +30 -0
  49. data/lib/surpass/ExcelFormulaLexer.rb +922 -0
  50. data/lib/surpass/ExcelFormulaParser.rb +602 -0
  51. data/lib/{biff_record.rb → surpass/biff_record.rb} +0 -0
  52. data/lib/{bitmap.rb → surpass/bitmap.rb} +0 -0
  53. data/lib/{cell.rb → surpass/cell.rb} +2 -34
  54. data/lib/{chart.rb → surpass/chart.rb} +0 -0
  55. data/lib/{column.rb → surpass/column.rb} +0 -0
  56. data/lib/{document.rb → surpass/document.rb} +0 -0
  57. data/lib/surpass/excel_formula.rb +23 -0
  58. data/lib/{excel_magic.rb → surpass/excel_magic.rb} +0 -0
  59. data/lib/{formatting.rb → surpass/formatting.rb} +93 -53
  60. data/lib/{row.rb → surpass/row.rb} +0 -0
  61. data/lib/{style.rb → surpass/style.rb} +2 -1
  62. data/lib/surpass/tokens.txt +2 -0
  63. data/lib/{utilities.rb → surpass/utilities.rb} +0 -0
  64. data/lib/{workbook.rb → surpass/workbook.rb} +0 -0
  65. data/lib/{worksheet.rb → surpass/worksheet.rb} +15 -6
  66. data/lib/surpass.rb +1 -1
  67. data/spec/biff_record_spec.rb +268 -0
  68. data/spec/cell_spec.rb +56 -0
  69. data/spec/data/random-strings.txt +10000 -0
  70. data/spec/document_spec.rb +168 -0
  71. data/spec/excel_formula_spec.rb +27 -0
  72. data/spec/formatting_spec.rb +53 -0
  73. data/spec/output/cells-rk.xls +0 -0
  74. data/spec/output/cells.xls +0 -0
  75. data/spec/output/mini.xls +0 -0
  76. data/spec/reference/P-0508-0000507647-3280-5298.xls +0 -0
  77. data/spec/reference/all-cell-styles.bin +0 -0
  78. data/spec/reference/all-number-formats.bin +0 -0
  79. data/spec/reference/all-styles.bin +0 -0
  80. data/spec/reference/mini.xls +0 -0
  81. data/spec/row_spec.rb +19 -0
  82. data/spec/spec_helper.rb +10 -0
  83. data/spec/style_spec.rb +89 -0
  84. data/spec/surpass_spec.rb +7 -0
  85. data/spec/utilities_spec.rb +57 -0
  86. data/spec/workbook_spec.rb +48 -0
  87. data/spec/worksheet_spec.rb +0 -0
  88. data/stats/cloc.txt +8 -0
  89. data/stats/rcov.txt +0 -0
  90. data/stats/specdoc.txt +158 -0
  91. data/surpass.gemspec +40 -0
  92. data/tasks/setup.rb +1 -1
  93. data/tasks/zentest.rake +36 -0
  94. data/webby/README.txt +6 -0
  95. data/webby/Sitefile +43 -0
  96. data/webby/content/css/pygments.txt +6 -0
  97. data/webby/content/css/style.css +279 -0
  98. data/webby/content/examples/autoformat.png +0 -0
  99. data/webby/content/examples/autoformat.rb +32 -0
  100. data/webby/content/examples/autoformat.xls +0 -0
  101. data/webby/content/examples/borders.png +0 -0
  102. data/webby/content/examples/borders.rb +15 -0
  103. data/webby/content/examples/borders.xls +0 -0
  104. data/webby/content/examples/colours.png +0 -0
  105. data/webby/content/examples/colours.rb +23 -0
  106. data/webby/content/examples/colours.xls +0 -0
  107. data/webby/content/examples/data.png +0 -0
  108. data/webby/content/examples/data.rb +11 -0
  109. data/webby/content/examples/data.xls +0 -0
  110. data/webby/content/examples/formatting.png +0 -0
  111. data/webby/content/examples/formatting.rb +78 -0
  112. data/webby/content/examples/formatting.xls +0 -0
  113. data/webby/content/examples/hello-world.png +0 -0
  114. data/webby/content/examples/hello-world.py +8 -0
  115. data/webby/content/examples/hello-world.rb +9 -0
  116. data/webby/content/examples/hello-world.xls +0 -0
  117. data/webby/content/examples/number-format-string.png +0 -0
  118. data/webby/content/examples/number-format-string.rb +14 -0
  119. data/webby/content/examples/number-format-string.xls +0 -0
  120. data/webby/content/examples/patterns.png +0 -0
  121. data/webby/content/examples/patterns.rb +26 -0
  122. data/webby/content/examples/patterns.xls +0 -0
  123. data/webby/content/examples/show-greens.sh +1 -0
  124. data/webby/content/examples/surpass-info.sh +1 -0
  125. data/webby/content/img/Thumbs.db +0 -0
  126. data/webby/content/img/bg_menu.gif +0 -0
  127. data/webby/content/img/bg_t.gif +0 -0
  128. data/webby/content/img/bullet.gif +0 -0
  129. data/webby/content/img/logo.png +0 -0
  130. data/webby/content/img/logo_.jpg +0 -0
  131. data/webby/content/img/top_bg.gif +0 -0
  132. data/webby/content/img/top_bg_.gif +0 -0
  133. data/webby/content/index.txt +16 -0
  134. data/webby/content/installation/index.txt +24 -0
  135. data/webby/content/source/ExcelFormulaLexer.txt +7 -0
  136. data/webby/content/source/ExcelFormulaParser.txt +7 -0
  137. data/webby/content/source/biff_record.txt +7 -0
  138. data/webby/content/source/bitmap.txt +7 -0
  139. data/webby/content/source/cell.txt +7 -0
  140. data/webby/content/source/chart.txt +7 -0
  141. data/webby/content/source/column.txt +7 -0
  142. data/webby/content/source/document.txt +7 -0
  143. data/webby/content/source/excel_formula.txt +7 -0
  144. data/webby/content/source/excel_magic.txt +7 -0
  145. data/webby/content/source/formatting.txt +7 -0
  146. data/webby/content/source/row.txt +7 -0
  147. data/webby/content/source/style.txt +7 -0
  148. data/webby/content/source/utilities.txt +7 -0
  149. data/webby/content/source/workbook.txt +7 -0
  150. data/webby/content/source/worksheet.txt +7 -0
  151. data/webby/content/surpass-manual.erb +198 -0
  152. data/webby/layouts/book.txt +29 -0
  153. data/webby/layouts/default.txt +27 -0
  154. data/webby/layouts/two_column.txt +25 -0
  155. data/webby/layouts/web.txt +66 -0
  156. data/webby/output/.cairn +0 -0
  157. data/webby/output/css/blueprint/ie.css +26 -0
  158. data/webby/output/css/blueprint/plugins/buttons/icons/cross.png +0 -0
  159. data/webby/output/css/blueprint/plugins/buttons/icons/key.png +0 -0
  160. data/webby/output/css/blueprint/plugins/buttons/icons/tick.png +0 -0
  161. data/webby/output/css/blueprint/plugins/buttons/readme.txt +32 -0
  162. data/webby/output/css/blueprint/plugins/buttons/screen.css +97 -0
  163. data/webby/output/css/blueprint/plugins/fancy-type/readme.txt +14 -0
  164. data/webby/output/css/blueprint/plugins/fancy-type/screen.css +71 -0
  165. data/webby/output/css/blueprint/plugins/link-icons/icons/doc.png +0 -0
  166. data/webby/output/css/blueprint/plugins/link-icons/icons/email.png +0 -0
  167. data/webby/output/css/blueprint/plugins/link-icons/icons/external.png +0 -0
  168. data/webby/output/css/blueprint/plugins/link-icons/icons/feed.png +0 -0
  169. data/webby/output/css/blueprint/plugins/link-icons/icons/im.png +0 -0
  170. data/webby/output/css/blueprint/plugins/link-icons/icons/pdf.png +0 -0
  171. data/webby/output/css/blueprint/plugins/link-icons/icons/visited.png +0 -0
  172. data/webby/output/css/blueprint/plugins/link-icons/icons/xls.png +0 -0
  173. data/webby/output/css/blueprint/plugins/link-icons/readme.txt +18 -0
  174. data/webby/output/css/blueprint/plugins/link-icons/screen.css +40 -0
  175. data/webby/output/css/blueprint/plugins/rtl/readme.txt +10 -0
  176. data/webby/output/css/blueprint/plugins/rtl/screen.css +109 -0
  177. data/webby/output/css/blueprint/print.css +30 -0
  178. data/webby/output/css/blueprint/screen.css +251 -0
  179. data/webby/output/css/blueprint/src/forms.css +49 -0
  180. data/webby/output/css/blueprint/src/grid.css +212 -0
  181. data/webby/output/css/blueprint/src/grid.png +0 -0
  182. data/webby/output/css/blueprint/src/ie.css +59 -0
  183. data/webby/output/css/blueprint/src/print.css +85 -0
  184. data/webby/output/css/blueprint/src/reset.css +38 -0
  185. data/webby/output/css/blueprint/src/typography.css +105 -0
  186. data/webby/output/css/pygments.css +59 -0
  187. data/webby/output/css/site.css +62 -0
  188. data/webby/output/css/style.css +279 -0
  189. data/webby/output/examples/autoformat.png +0 -0
  190. data/webby/output/examples/autoformat.rb +32 -0
  191. data/webby/output/examples/autoformat.xls +0 -0
  192. data/webby/output/examples/borders.png +0 -0
  193. data/webby/output/examples/borders.rb +15 -0
  194. data/webby/output/examples/borders.xls +0 -0
  195. data/webby/output/examples/colours.png +0 -0
  196. data/webby/output/examples/colours.rb +23 -0
  197. data/webby/output/examples/colours.xls +0 -0
  198. data/webby/output/examples/data.png +0 -0
  199. data/webby/output/examples/data.rb +11 -0
  200. data/webby/output/examples/data.xls +0 -0
  201. data/webby/output/examples/formatting.png +0 -0
  202. data/webby/output/examples/formatting.rb +78 -0
  203. data/webby/output/examples/formatting.xls +0 -0
  204. data/webby/output/examples/hello-world.png +0 -0
  205. data/webby/output/examples/hello-world.py +8 -0
  206. data/webby/output/examples/hello-world.rb +9 -0
  207. data/webby/output/examples/hello-world.xls +0 -0
  208. data/webby/output/examples/number-format-string.png +0 -0
  209. data/webby/output/examples/number-format-string.rb +14 -0
  210. data/webby/output/examples/number-format-string.xls +0 -0
  211. data/webby/output/examples/patterns.png +0 -0
  212. data/webby/output/examples/patterns.rb +26 -0
  213. data/webby/output/examples/patterns.xls +0 -0
  214. data/webby/output/examples/show-greens.sh +1 -0
  215. data/webby/output/examples/surpass-info.sh +1 -0
  216. data/webby/output/img/Thumbs.db +0 -0
  217. data/webby/output/img/bg_menu.gif +0 -0
  218. data/webby/output/img/bg_t.gif +0 -0
  219. data/webby/output/img/bullet.gif +0 -0
  220. data/webby/output/img/logo.png +0 -0
  221. data/webby/output/img/logo_.jpg +0 -0
  222. data/webby/output/img/top_bg.gif +0 -0
  223. data/webby/output/img/top_bg_.gif +0 -0
  224. data/webby/output/index.html +138 -0
  225. data/webby/output/installation/index.html +64 -0
  226. data/webby/output/installation/installation.html +1 -0
  227. data/webby/output/installation.html +1 -0
  228. data/webby/output/source/ExcelFormulaLexer.html +981 -0
  229. data/webby/output/source/ExcelFormulaParser.html +661 -0
  230. data/webby/output/source/biff_record.html +462 -0
  231. data/webby/output/source/bitmap.html +277 -0
  232. data/webby/output/source/cell.html +241 -0
  233. data/webby/output/source/chart.html +64 -0
  234. data/webby/output/source/column.html +99 -0
  235. data/webby/output/source/document.html +465 -0
  236. data/webby/output/source/excel_formula.html +82 -0
  237. data/webby/output/source/excel_magic.html +1072 -0
  238. data/webby/output/source/formatting.html +664 -0
  239. data/webby/output/source/row.html +169 -0
  240. data/webby/output/source/style.html +158 -0
  241. data/webby/output/source/surpass.html +110 -0
  242. data/webby/output/source/utilities.html +145 -0
  243. data/webby/output/source/workbook.html +265 -0
  244. data/webby/output/source/worksheet.html +331 -0
  245. data/webby/output/surpass-manual-0-0-5.pdf +0 -0
  246. data/webby/output/surpass-manual.aux +50 -0
  247. data/webby/output/surpass-manual.log +366 -0
  248. data/webby/output/surpass-manual.out +20 -0
  249. data/webby/output/surpass-manual.tex +582 -0
  250. data/webby/output/surpass-manual.toc +20 -0
  251. data/webby/rsync-exclude +7 -0
  252. data/webby/tasks/latex.rake +14 -0
  253. data/webby/tasks/screenshots.rb +58 -0
  254. data/webby/templates/article.erb +15 -0
  255. data/webby/templates/book.erb +16 -0
  256. data/webby/templates/page.erb +9 -0
  257. metadata +302 -24
  258. data/bin/surpass-info +0 -20
  259. data/lib/excel_formula.rb +0 -6
@@ -0,0 +1,462 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
2
+
3
+ <!-- ========================================================== -->
4
+ <!-- Created by Devit Schizoper -->
5
+ <!-- Created HomePages http://LoadFoo.starzonewebhost.com -->
6
+ <!-- Created Day 01.12.2006 -->
7
+ <!-- ========================================================== -->
8
+
9
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
10
+ <head>
11
+ <meta http-equiv="content-type" content="text/html;charset=utf-8" />
12
+ <meta name="author" content="LoadFoO" />
13
+ <meta name="description" content="Site description" />
14
+ <meta name="keywords" content="key, words" />
15
+ <title>Surpass :: biff_record.rb</title>
16
+ <link rel="stylesheet" type="text/css" href="/css/style.css" media="screen" />
17
+ <link rel="stylesheet" href="/css/pygments.css" type="text/css" />
18
+ <link rel="shortcut icon" href="favicon.ico" />
19
+ </head>
20
+
21
+ <body>
22
+ <div id="wrap">
23
+ <div id="top">
24
+ <h2><a href="/" title="Back to main page">Surpass</a></h2>
25
+ <div id="menu">
26
+ <ul>
27
+ <li><a href="/installation">Installation</a></li>
28
+ <li><a href="/examples">Examples</a></li>
29
+ <li><a href="/source">Source</a></li>
30
+ </ul>
31
+ </div>
32
+ </div>
33
+ <div id="content">
34
+ <div id="left">
35
+ <h2>biff_record.rb</h2>
36
+ <div class="highlight"><pre><span class="k">class</span> <span class="nc">SharedStringTable</span>
37
+ <span class="no">SST_ID</span> <span class="o">=</span> <span class="mh">0x00FC</span>
38
+
39
+ <span class="k">def</span> <span class="nf">initialize</span>
40
+ <span class="vi">@sst_record</span> <span class="o">=</span> <span class="kp">nil</span>
41
+ <span class="vi">@continues</span> <span class="o">=</span> <span class="o">[]</span>
42
+ <span class="vi">@current_piece</span> <span class="o">=</span> <span class="o">[</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="o">].</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;V2&#39;</span><span class="p">)</span>
43
+
44
+ <span class="vi">@str_indexes</span> <span class="o">=</span> <span class="p">{}</span> <span class="c1"># TODO replace with array? or is hash more efficient?</span>
45
+ <span class="vi">@add_calls</span> <span class="o">=</span> <span class="mi">0</span>
46
+ <span class="k">end</span>
47
+
48
+ <span class="k">def</span> <span class="nf">add_str</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
49
+ <span class="vi">@add_calls</span> <span class="o">+=</span> <span class="mi">1</span>
50
+ <span class="n">index</span> <span class="o">=</span> <span class="vi">@str_indexes</span><span class="o">[</span><span class="n">s</span><span class="o">]</span>
51
+ <span class="k">if</span> <span class="n">index</span><span class="o">.</span><span class="n">nil?</span>
52
+ <span class="c1"># This is a new string for the SST.</span>
53
+ <span class="n">position</span> <span class="o">=</span> <span class="vi">@str_indexes</span><span class="o">.</span><span class="n">length</span>
54
+ <span class="vi">@str_indexes</span><span class="o">[</span><span class="n">s</span><span class="o">]</span> <span class="o">=</span> <span class="n">position</span>
55
+ <span class="n">index</span> <span class="o">=</span> <span class="n">position</span>
56
+ <span class="n">add_to_sst</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
57
+ <span class="k">end</span>
58
+ <span class="n">index</span>
59
+ <span class="k">end</span>
60
+
61
+ <span class="k">def</span> <span class="nf">str_index</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
62
+ <span class="vi">@str_indexes</span><span class="o">[</span><span class="n">s</span><span class="o">]</span>
63
+ <span class="k">end</span>
64
+
65
+ <span class="k">def</span> <span class="nf">to_biff</span>
66
+ <span class="n">new_piece</span> <span class="c1"># flush the &#39;current&#39; piece</span>
67
+ <span class="n">result</span> <span class="o">=</span> <span class="o">[</span><span class="no">SST_ID</span><span class="p">,</span> <span class="vi">@sst_record</span><span class="o">.</span><span class="n">length</span><span class="p">,</span> <span class="vi">@add_calls</span><span class="p">,</span> <span class="vi">@str_indexes</span><span class="o">.</span><span class="n">length</span><span class="o">].</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;v2V2&#39;</span><span class="p">)</span>
68
+ <span class="n">result</span> <span class="o">+=</span> <span class="vi">@sst_record</span><span class="o">[</span><span class="mi">8</span><span class="o">.</span><span class="n">.</span><span class="o">-</span><span class="mi">1</span><span class="o">]</span>
69
+ <span class="n">result</span> <span class="o">+=</span> <span class="vi">@continues</span><span class="o">.</span><span class="n">join</span>
70
+ <span class="n">result</span>
71
+ <span class="k">end</span>
72
+
73
+ <span class="k">def</span> <span class="nf">add_to_sst</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
74
+ <span class="n">u_str</span> <span class="o">=</span> <span class="n">mock_unicode_string</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
75
+ <span class="k">raise</span> <span class="s2">&quot;very long string&quot;</span> <span class="k">if</span> <span class="n">u_str</span><span class="o">.</span><span class="n">length</span> <span class="o">&gt;</span> <span class="mh">0xFFFF</span>
76
+ <span class="n">save_atom</span><span class="p">(</span><span class="n">u_str</span><span class="o">[</span><span class="mi">0</span><span class="o">.</span><span class="n">.</span><span class="o">.</span><span class="mi">4</span><span class="o">]</span><span class="p">)</span>
77
+ <span class="n">save_splitted</span><span class="p">(</span><span class="n">u_str</span><span class="o">[</span><span class="mi">4</span><span class="o">.</span><span class="n">.</span><span class="o">-</span><span class="mi">1</span><span class="o">]</span><span class="p">,</span> <span class="kp">false</span><span class="p">)</span>
78
+ <span class="k">end</span>
79
+
80
+ <span class="c1"># Store the @current_piece in @continues and initialize a new @current_piece</span>
81
+ <span class="k">def</span> <span class="nf">new_piece</span>
82
+ <span class="k">if</span> <span class="vi">@sst_record</span><span class="o">.</span><span class="n">nil?</span>
83
+ <span class="c1"># We get here when we first run out of space, or if that never happens then we end</span>
84
+ <span class="c1"># up here when everything is finished and we call to_biff for the first time.</span>
85
+ <span class="vi">@sst_record</span> <span class="o">=</span> <span class="vi">@current_piece</span>
86
+ <span class="k">else</span>
87
+ <span class="vi">@continues</span> <span class="o">&lt;&lt;</span> <span class="o">[</span><span class="no">BiffRecord</span><span class="o">::</span><span class="no">CONTINUE_RECORD_ID</span><span class="p">,</span> <span class="vi">@current_piece</span><span class="o">.</span><span class="n">length</span><span class="o">].</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;v2&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="vi">@current_piece</span>
88
+ <span class="k">end</span>
89
+ <span class="vi">@current_piece</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
90
+ <span class="k">end</span>
91
+
92
+ <span class="k">def</span> <span class="nf">save_atom</span><span class="p">(</span><span class="n">atom</span><span class="p">)</span>
93
+ <span class="n">free_space</span> <span class="o">=</span> <span class="mh">0x2020</span> <span class="o">-</span> <span class="vi">@current_piece</span><span class="o">.</span><span class="n">length</span>
94
+ <span class="n">new_piece</span> <span class="k">if</span> <span class="n">free_space</span> <span class="o">&lt;</span> <span class="n">atom</span><span class="o">.</span><span class="n">length</span>
95
+ <span class="vi">@current_piece</span> <span class="o">+=</span> <span class="n">atom</span>
96
+ <span class="k">end</span>
97
+
98
+ <span class="k">def</span> <span class="nf">save_splitted</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">is_unicode_str</span><span class="p">)</span>
99
+ <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span>
100
+ <span class="k">while</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">s</span><span class="o">.</span><span class="n">length</span> <span class="k">do</span>
101
+ <span class="n">free_space</span> <span class="o">=</span> <span class="mh">0x2020</span> <span class="o">-</span> <span class="vi">@current_piece</span><span class="o">.</span><span class="n">length</span>
102
+ <span class="n">tail_length</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">length</span> <span class="o">-</span> <span class="n">i</span>
103
+ <span class="n">need_more_space</span> <span class="o">=</span> <span class="n">free_space</span> <span class="o">&lt;</span> <span class="n">tail_length</span>
104
+
105
+ <span class="k">if</span> <span class="o">!</span><span class="n">need_more_space</span>
106
+ <span class="n">atom_length</span> <span class="o">=</span> <span class="n">tail_length</span>
107
+ <span class="k">else</span>
108
+ <span class="k">if</span> <span class="n">is_unicode_str</span>
109
+ <span class="n">atom_length</span> <span class="o">=</span> <span class="n">free_space</span> <span class="o">&amp;</span> <span class="mh">0xFFFE</span>
110
+ <span class="k">else</span>
111
+ <span class="n">atom_length</span> <span class="o">=</span> <span class="n">free_space</span>
112
+ <span class="k">end</span>
113
+ <span class="k">end</span>
114
+ <span class="vi">@current_piece</span> <span class="o">+=</span> <span class="n">s</span><span class="o">[</span><span class="n">i</span><span class="o">.</span><span class="n">.</span><span class="o">.</span><span class="p">(</span><span class="n">i</span><span class="o">+</span><span class="n">atom_length</span><span class="p">)</span><span class="o">]</span>
115
+
116
+ <span class="k">if</span> <span class="n">need_more_space</span>
117
+ <span class="n">new_piece</span>
118
+ <span class="k">if</span> <span class="n">is_unicode_str</span>
119
+ <span class="vi">@current_piece</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\001</span><span class="s2">&quot;</span>
120
+ <span class="k">else</span>
121
+ <span class="vi">@current_piece</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\000</span><span class="s2">&quot;</span>
122
+ <span class="k">end</span>
123
+ <span class="k">end</span>
124
+
125
+ <span class="n">i</span> <span class="o">+=</span> <span class="n">atom_length</span>
126
+ <span class="k">end</span>
127
+ <span class="k">end</span>
128
+ <span class="k">end</span>
129
+
130
+ <span class="k">class</span> <span class="nc">BiffRecord</span>
131
+ <span class="kp">attr_accessor</span> <span class="ss">:record_data</span>
132
+
133
+ <span class="no">BIFF_LIMIT</span> <span class="o">=</span> <span class="mh">0x2020</span> <span class="c1"># limit for BIFF7/8</span>
134
+ <span class="no">CONTINUE_RECORD_ID</span> <span class="o">=</span> <span class="mh">0x003C</span>
135
+
136
+ <span class="c1"># By default, initialize to &#39;&#39;.</span>
137
+ <span class="c1"># May be overridden in subclass.</span>
138
+ <span class="k">def</span> <span class="nf">initialize</span>
139
+ <span class="vi">@record_data</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
140
+ <span class="k">end</span>
141
+
142
+ <span class="k">def</span> <span class="nf">record_header</span>
143
+ <span class="c1"># TODO figure out if Ruby&#39;s or Python&#39;s length function is correct here.</span>
144
+ <span class="o">[</span><span class="nb">self</span><span class="o">.</span><span class="n">class</span><span class="o">::</span><span class="no">RECORD_ID</span><span class="p">,</span> <span class="vi">@record_data</span><span class="o">.</span><span class="n">length</span><span class="o">].</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;v2&#39;</span><span class="p">)</span>
145
+ <span class="k">end</span>
146
+
147
+ <span class="k">def</span> <span class="nf">to_biff</span>
148
+ <span class="k">if</span> <span class="vi">@record_data</span><span class="o">.</span><span class="n">length</span> <span class="o">&gt;</span> <span class="no">BIFF_LIMIT</span>
149
+ <span class="n">chunks</span> <span class="o">=</span> <span class="o">[]</span>
150
+ <span class="n">pos</span> <span class="o">=</span> <span class="mi">0</span>
151
+ <span class="k">while</span> <span class="n">pos</span> <span class="o">&lt;</span> <span class="vi">@record_data</span><span class="o">.</span><span class="n">length</span>
152
+ <span class="n">chunk_pos</span> <span class="o">=</span> <span class="n">pos</span> <span class="o">+</span> <span class="no">BIFF_LIMIT</span>
153
+ <span class="n">chunk</span> <span class="o">=</span> <span class="vi">@record_data</span><span class="o">[</span><span class="n">pos</span><span class="o">.</span><span class="n">.</span><span class="o">.</span><span class="n">chunk_pos</span><span class="o">]</span>
154
+ <span class="n">chunks</span> <span class="o">&lt;&lt;</span> <span class="n">chunk</span>
155
+ <span class="n">pos</span> <span class="o">=</span> <span class="n">chunk_pos</span>
156
+ <span class="k">end</span>
157
+
158
+ <span class="n">continues</span> <span class="o">=</span> <span class="o">[</span><span class="nb">self</span><span class="o">.</span><span class="n">class</span><span class="o">::</span><span class="no">RECORD_ID</span><span class="p">,</span> <span class="n">chunks</span><span class="o">[</span><span class="mi">0</span><span class="o">].</span><span class="n">length</span><span class="o">].</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;v2&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="n">chunks</span><span class="o">[</span><span class="mi">0</span><span class="o">]</span>
159
+ <span class="n">chunks</span><span class="o">.</span><span class="n">each_with_index</span> <span class="k">do</span> <span class="o">|</span><span class="n">c</span><span class="p">,</span> <span class="n">i</span><span class="o">|</span>
160
+ <span class="k">next</span> <span class="k">if</span> <span class="n">i</span> <span class="o">==</span> <span class="mi">0</span>
161
+ <span class="n">continues</span> <span class="o">+=</span> <span class="o">[</span><span class="no">CONTINUE_RECORD_ID</span><span class="p">,</span> <span class="n">c</span><span class="o">.</span><span class="n">length</span><span class="o">].</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;v2&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="n">c</span>
162
+ <span class="k">end</span>
163
+ <span class="n">continues</span>
164
+ <span class="k">else</span>
165
+ <span class="n">record_header</span> <span class="o">+</span> <span class="vi">@record_data</span>
166
+ <span class="k">end</span>
167
+ <span class="k">end</span>
168
+ <span class="k">end</span>
169
+
170
+ <span class="c1"># Offset Size Contents</span>
171
+ <span class="c1"># 0 2 Version, contains 0600H for BIFF8 and BIFF8X</span>
172
+ <span class="c1"># 2 2 Type of the following data:</span>
173
+ <span class="c1"># 0005H = Workbook globals</span>
174
+ <span class="c1"># 0006H = Visual Basic module</span>
175
+ <span class="c1"># 0010H = Worksheet</span>
176
+ <span class="c1"># 0020H = Chart</span>
177
+ <span class="c1"># 0040H = Macro sheet</span>
178
+ <span class="c1"># 0100H = Workspace file</span>
179
+ <span class="c1"># 4 2 Build identifier</span>
180
+ <span class="c1"># 6 2 Build year</span>
181
+ <span class="c1"># 8 4 File history flags</span>
182
+ <span class="c1"># 12 4 Lowest Excel version that can read all records in this file</span>
183
+ <span class="k">class</span> <span class="nc">Biff8BOFRecord</span> <span class="o">&lt;</span> <span class="no">BiffRecord</span>
184
+ <span class="no">RECORD_ID</span> <span class="o">=</span> <span class="mh">0x0809</span>
185
+
186
+ <span class="c1"># Stream Types</span>
187
+ <span class="no">BOOK_GLOBAL</span> <span class="o">=</span> <span class="mh">0x0005</span>
188
+ <span class="no">VB_MODULE</span> <span class="o">=</span> <span class="mh">0x0006</span>
189
+ <span class="no">WORKSHEET</span> <span class="o">=</span> <span class="mh">0x0010</span>
190
+ <span class="no">CHART</span> <span class="o">=</span> <span class="mh">0x0020</span>
191
+ <span class="no">MACROSHEET</span> <span class="o">=</span> <span class="mh">0x0040</span>
192
+ <span class="no">WORKSPACE</span> <span class="o">=</span> <span class="mh">0x0100</span>
193
+
194
+ <span class="k">def</span> <span class="nf">initialize</span><span class="p">(</span><span class="n">rec_type</span><span class="p">)</span>
195
+ <span class="n">version</span> <span class="o">=</span> <span class="mh">0x0600</span>
196
+ <span class="n">build</span> <span class="o">=</span> <span class="mh">0x0DBB</span>
197
+ <span class="n">year</span> <span class="o">=</span> <span class="mh">0x07CC</span>
198
+ <span class="n">file_hist_flags</span> <span class="o">=</span> <span class="mh">0x00</span>
199
+ <span class="n">ver_can_read</span> <span class="o">=</span> <span class="mh">0x06</span>
200
+
201
+ <span class="vi">@record_data</span> <span class="o">=</span> <span class="o">[</span><span class="n">version</span><span class="p">,</span> <span class="n">rec_type</span><span class="p">,</span> <span class="n">build</span><span class="p">,</span> <span class="n">year</span><span class="p">,</span> <span class="n">file_hist_flags</span><span class="p">,</span> <span class="n">ver_can_read</span><span class="o">].</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;v4V2&#39;</span><span class="p">)</span>
202
+ <span class="k">end</span>
203
+ <span class="k">end</span>
204
+
205
+ <span class="k">class</span> <span class="nc">InterfaceHeaderRecord</span> <span class="o">&lt;</span> <span class="no">BiffRecord</span>
206
+ <span class="no">RECORD_ID</span> <span class="o">=</span> <span class="mh">0x00E1</span>
207
+
208
+ <span class="k">def</span> <span class="nf">initialize</span>
209
+ <span class="vi">@record_data</span> <span class="o">=</span> <span class="o">[</span><span class="mh">0xB0</span><span class="p">,</span> <span class="mh">0x04</span><span class="o">].</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;C2&#39;</span><span class="p">)</span>
210
+ <span class="k">end</span>
211
+ <span class="k">end</span>
212
+
213
+ <span class="k">class</span> <span class="nc">InterfaceEndRecord</span> <span class="o">&lt;</span> <span class="no">BiffRecord</span>
214
+ <span class="no">RECORD_ID</span> <span class="o">=</span> <span class="mh">0x00E2</span>
215
+ <span class="k">end</span>
216
+
217
+ <span class="k">class</span> <span class="nc">MMSRecord</span> <span class="o">&lt;</span> <span class="no">BiffRecord</span>
218
+ <span class="no">RECORD_ID</span> <span class="o">=</span> <span class="mh">0x00C1</span>
219
+ <span class="k">def</span> <span class="nf">initialize</span>
220
+ <span class="vi">@record_data</span> <span class="o">=</span> <span class="o">[</span><span class="mh">0x00</span><span class="o">].</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;v&#39;</span><span class="p">)</span>
221
+ <span class="k">end</span>
222
+ <span class="k">end</span>
223
+
224
+ <span class="c1"># This record is part of the file protection. It contains the name of the</span>
225
+ <span class="c1"># user that has saved the file. The user name is always stored as an</span>
226
+ <span class="c1"># equal-sized string. All unused characters after the name are filled</span>
227
+ <span class="c1"># with space characters. It is not required to write the mentioned string</span>
228
+ <span class="c1"># length. Every other length will be accepted too.</span>
229
+ <span class="k">class</span> <span class="nc">WriteAccessRecord</span> <span class="o">&lt;</span> <span class="no">BiffRecord</span>
230
+ <span class="no">RECORD_ID</span> <span class="o">=</span> <span class="mh">0x005C</span>
231
+
232
+ <span class="c1"># TODO Can we extend this to 0x70? I think 0x30 is a holdover from Biff7 but 112 chars is Biff8.</span>
233
+ <span class="k">def</span> <span class="nf">initialize</span><span class="p">(</span><span class="n">owner</span><span class="p">)</span>
234
+ <span class="vi">@record_data</span> <span class="o">=</span> <span class="o">[</span><span class="n">owner</span><span class="o">[</span><span class="mi">0</span><span class="p">,</span> <span class="mh">0x30</span><span class="o">]].</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;A112&#39;</span><span class="p">)</span>
235
+ <span class="k">end</span>
236
+ <span class="k">end</span>
237
+
238
+ <span class="c1"># This record specifies if the file contains an additional BIFF5/BIFF7</span>
239
+ <span class="c1"># workbook stream.</span>
240
+ <span class="c1"># Record DSF, BIFF8:</span>
241
+ <span class="c1"># Offset Size Contents</span>
242
+ <span class="c1"># 0 2 0 = Only the BIFF8 Workbook stream is present</span>
243
+ <span class="c1"># 1 = Additional BIFF5/BIFF7 Book stream is in the file</span>
244
+ <span class="c1"># A double stream file can be read by Excel 5.0 and Excel 95, and still</span>
245
+ <span class="c1"># contains all new features added to BIFF8 (which are left out in the</span>
246
+ <span class="c1"># BIFF5/BIFF7 Book stream).</span>
247
+ <span class="k">class</span> <span class="nc">DSFRecord</span> <span class="o">&lt;</span> <span class="no">BiffRecord</span>
248
+ <span class="no">RECORD_ID</span> <span class="o">=</span> <span class="mh">0x0161</span>
249
+
250
+ <span class="k">def</span> <span class="nf">initialize</span>
251
+ <span class="vi">@record_data</span> <span class="o">=</span> <span class="o">[</span><span class="mh">0x00</span><span class="o">].</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;v&#39;</span><span class="p">)</span>
252
+ <span class="k">end</span>
253
+ <span class="k">end</span>
254
+
255
+ <span class="k">class</span> <span class="nc">TabIDRecord</span> <span class="o">&lt;</span> <span class="no">BiffRecord</span>
256
+ <span class="no">RECORD_ID</span> <span class="o">=</span> <span class="mh">0x013D</span>
257
+
258
+ <span class="k">def</span> <span class="nf">initialize</span><span class="p">(</span><span class="n">sheetcount</span><span class="p">)</span>
259
+ <span class="vi">@record_data</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
260
+ <span class="k">for</span> <span class="n">i</span> <span class="k">in</span> <span class="mi">1</span><span class="o">.</span><span class="n">.sheetcount</span> <span class="k">do</span>
261
+ <span class="vi">@record_data</span> <span class="o">+=</span> <span class="o">[</span><span class="n">i</span><span class="o">].</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;v&#39;</span><span class="p">)</span>
262
+ <span class="k">end</span>
263
+ <span class="k">end</span>
264
+ <span class="k">end</span>
265
+
266
+ <span class="k">class</span> <span class="nc">FnGroupCountRecord</span> <span class="o">&lt;</span> <span class="no">BiffRecord</span>
267
+ <span class="no">RECORD_ID</span> <span class="o">=</span> <span class="mh">0x009C</span>
268
+
269
+ <span class="k">def</span> <span class="nf">initialize</span>
270
+ <span class="vi">@record_data</span> <span class="o">=</span> <span class="o">[</span><span class="mh">0x0E</span><span class="p">,</span> <span class="mi">0</span><span class="no">X00</span><span class="o">].</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;C2&#39;</span><span class="p">)</span>
271
+ <span class="k">end</span>
272
+ <span class="k">end</span>
273
+
274
+ <span class="c1"># This record is part of the worksheet/workbook protection. It determines</span>
275
+ <span class="c1"># whether the window configuration of this document is protected. Window</span>
276
+ <span class="c1"># protection is not active, if this record is omitted.</span>
277
+ <span class="k">class</span> <span class="nc">WindowProtectRecord</span> <span class="o">&lt;</span> <span class="no">BiffRecord</span>
278
+ <span class="no">RECORD_ID</span> <span class="o">=</span> <span class="mh">0x0019</span>
279
+
280
+ <span class="k">def</span> <span class="nf">initialize</span><span class="p">(</span><span class="n">protect</span><span class="p">)</span>
281
+ <span class="vi">@record_data</span> <span class="o">=</span> <span class="o">[</span><span class="n">protect</span><span class="o">].</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;v&#39;</span><span class="p">)</span>
282
+ <span class="k">end</span>
283
+ <span class="k">end</span>
284
+
285
+ <span class="c1"># This record is part of the worksheet/workbook protection.</span>
286
+ <span class="c1"># It determines whether the objects of the current sheet are protected.</span>
287
+ <span class="c1"># Object protection is not active, if this record is omitted.</span>
288
+ <span class="k">class</span> <span class="nc">ObjectProtectRecord</span> <span class="o">&lt;</span> <span class="no">BiffRecord</span>
289
+ <span class="no">RECORD_ID</span> <span class="o">=</span> <span class="mh">0x0063</span>
290
+
291
+ <span class="k">def</span> <span class="nf">initialize</span><span class="p">(</span><span class="n">protect</span><span class="p">)</span>
292
+ <span class="vi">@record_data</span> <span class="o">=</span> <span class="o">[</span><span class="n">protect</span><span class="o">].</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;v&#39;</span><span class="p">)</span>
293
+ <span class="k">end</span>
294
+ <span class="k">end</span>
295
+
296
+ <span class="c1"># This record is part of the worksheet/workbook protection. It</span>
297
+ <span class="c1"># determines whether the scenarios of the current sheet are protected.</span>
298
+ <span class="c1"># Scenario protection is not active, if this record is omitted.</span>
299
+ <span class="k">class</span> <span class="nc">ScenarioProtectRecord</span> <span class="o">&lt;</span> <span class="no">BiffRecord</span>
300
+ <span class="no">RECORD_ID</span> <span class="o">=</span> <span class="mh">0x00DD</span>
301
+
302
+ <span class="k">def</span> <span class="nf">initialize</span><span class="p">(</span><span class="n">protect</span><span class="p">)</span>
303
+ <span class="vi">@record_data</span> <span class="o">=</span> <span class="o">[</span><span class="n">protect</span><span class="o">].</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;v&#39;</span><span class="p">)</span>
304
+ <span class="k">end</span>
305
+ <span class="k">end</span>
306
+
307
+ <span class="c1"># This record is part of the worksheet/workbook protection. It</span>
308
+ <span class="c1"># determines whether the scenarios of the current sheet are protected.</span>
309
+ <span class="c1"># Scenario protection is not active, if this record is omitted.</span>
310
+ <span class="k">class</span> <span class="nc">ProtectRecord</span> <span class="o">&lt;</span> <span class="no">BiffRecord</span>
311
+ <span class="no">RECORD_ID</span> <span class="o">=</span> <span class="mh">0x0012</span>
312
+
313
+ <span class="k">def</span> <span class="nf">initialize</span><span class="p">(</span><span class="n">protect</span><span class="p">)</span>
314
+ <span class="vi">@record_data</span> <span class="o">=</span> <span class="o">[</span><span class="n">protect</span><span class="o">].</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;v&#39;</span><span class="p">)</span>
315
+ <span class="k">end</span>
316
+ <span class="k">end</span>
317
+
318
+ <span class="c1"># This record is part of the worksheet/workbook protection. It</span>
319
+ <span class="c1"># stores a 16-bit hash value, calculated from the worksheet or workbook</span>
320
+ <span class="c1"># protection password.</span>
321
+ <span class="k">class</span> <span class="nc">PasswordRecord</span> <span class="o">&lt;</span> <span class="no">BiffRecord</span>
322
+ <span class="no">RECORD_ID</span> <span class="o">=</span> <span class="mh">0x0013</span>
323
+
324
+ <span class="k">def</span> <span class="nf">initialize</span><span class="p">(</span><span class="n">password</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
325
+ <span class="vi">@record_data</span> <span class="o">=</span> <span class="o">[</span><span class="n">password_hash</span><span class="p">(</span><span class="n">password</span><span class="p">)</span><span class="o">].</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;v&#39;</span><span class="p">)</span>
326
+ <span class="k">end</span>
327
+
328
+ <span class="c1"># Based on the algorithm provided by Daniel Rentz of OpenOffice.</span>
329
+ <span class="k">def</span> <span class="nf">password_hash</span><span class="p">(</span><span class="n">plaintext</span><span class="p">)</span>
330
+ <span class="k">return</span> <span class="mi">0</span> <span class="k">if</span> <span class="n">plaintext</span> <span class="o">===</span> <span class="s2">&quot;&quot;</span>
331
+ <span class="nb">hash</span> <span class="o">=</span> <span class="mh">0x0000</span>
332
+ <span class="n">plaintext</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;C*&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">each_with_index</span> <span class="k">do</span> <span class="o">|</span><span class="n">t</span><span class="p">,</span> <span class="n">i</span><span class="o">|</span>
333
+ <span class="n">c</span> <span class="o">=</span> <span class="n">t</span> <span class="o">&lt;&lt;</span> <span class="p">(</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span>
334
+ <span class="n">low_15</span> <span class="o">=</span> <span class="n">c</span> <span class="o">&amp;</span> <span class="mh">0x7fff</span>
335
+ <span class="n">high_15</span> <span class="o">=</span> <span class="n">c</span> <span class="o">&amp;</span> <span class="mh">0x7fff</span> <span class="o">&lt;&lt;</span> <span class="mi">15</span>
336
+ <span class="n">high_15</span> <span class="o">=</span> <span class="n">high_15</span> <span class="o">&gt;&gt;</span> <span class="mi">15</span>
337
+ <span class="n">c</span> <span class="o">=</span> <span class="n">low_15</span> <span class="o">|</span> <span class="n">high_15</span>
338
+ <span class="nb">hash</span> <span class="o">=</span> <span class="p">(</span><span class="nb">hash</span> <span class="o">^</span> <span class="n">c</span><span class="p">)</span>
339
+ <span class="k">end</span>
340
+ <span class="nb">hash</span> <span class="o">=</span> <span class="p">(</span><span class="nb">hash</span> <span class="o">^</span> <span class="n">plaintext</span><span class="o">.</span><span class="n">length</span><span class="p">)</span>
341
+ <span class="nb">hash</span> <span class="o">=</span> <span class="p">(</span><span class="nb">hash</span> <span class="o">^</span> <span class="mh">0xCE4B</span><span class="p">)</span>
342
+ <span class="nb">hash</span>
343
+ <span class="k">end</span>
344
+ <span class="k">end</span>
345
+
346
+ <span class="k">class</span> <span class="nc">Prot4RevRecord</span> <span class="o">&lt;</span> <span class="no">BiffRecord</span>
347
+ <span class="no">RECORD_ID</span> <span class="o">=</span> <span class="mh">0x01AF</span>
348
+
349
+ <span class="k">def</span> <span class="nf">initialize</span>
350
+ <span class="vi">@record_data</span> <span class="o">=</span> <span class="o">[</span><span class="mh">0x00</span><span class="o">].</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;v&#39;</span><span class="p">)</span>
351
+ <span class="k">end</span>
352
+ <span class="k">end</span>
353
+
354
+ <span class="k">class</span> <span class="nc">Prot4RevPassRecord</span> <span class="o">&lt;</span> <span class="no">BiffRecord</span>
355
+ <span class="no">RECORD_ID</span> <span class="o">=</span> <span class="mh">0x01BC</span>
356
+
357
+ <span class="k">def</span> <span class="nf">initialize</span>
358
+ <span class="vi">@record_data</span> <span class="o">=</span> <span class="o">[</span><span class="mh">0x00</span><span class="o">].</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;v&#39;</span><span class="p">)</span>
359
+ <span class="k">end</span>
360
+ <span class="k">end</span>
361
+
362
+ <span class="c1"># This record contains a Boolean value determining whether Excel makes</span>
363
+ <span class="c1"># a backup of the file while saving.</span>
364
+ <span class="k">class</span> <span class="nc">BackupRecord</span> <span class="o">&lt;</span> <span class="no">BiffRecord</span>
365
+ <span class="no">RECORD_ID</span> <span class="o">=</span> <span class="mh">0x0040</span>
366
+
367
+ <span class="k">def</span> <span class="nf">initialize</span><span class="p">(</span><span class="n">backup</span><span class="p">)</span>
368
+ <span class="vi">@record_data</span> <span class="o">=</span> <span class="o">[</span><span class="n">backup</span><span class="o">].</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;v&#39;</span><span class="p">)</span>
369
+ <span class="k">end</span>
370
+ <span class="k">end</span>
371
+
372
+ <span class="c1"># This record specifies whether and how to show objects in the workbook.</span>
373
+ <span class="c1"># </span>
374
+ <span class="c1"># Record HIDEOBJ, BIFF3-BIFF8:</span>
375
+ <span class="c1"># Offset Size Contents</span>
376
+ <span class="c1"># 0 2 Viewing mode for objects:</span>
377
+ <span class="c1"># 0 = Show all objects</span>
378
+ <span class="c1"># 1 = Show placeholders</span>
379
+ <span class="c1"># 2 = Do not show objects</span>
380
+ <span class="k">class</span> <span class="nc">HideObjRecord</span> <span class="o">&lt;</span> <span class="no">BiffRecord</span>
381
+ <span class="no">RECORD_ID</span> <span class="o">=</span> <span class="mh">0x008D</span>
382
+
383
+ <span class="k">def</span> <span class="nf">initialize</span>
384
+ <span class="vi">@record_data</span> <span class="o">=</span> <span class="o">[</span><span class="mh">0x00</span><span class="o">].</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;v&#39;</span><span class="p">)</span>
385
+ <span class="k">end</span>
386
+ <span class="k">end</span>
387
+
388
+ <span class="k">class</span> <span class="nc">RefreshAllRecord</span> <span class="o">&lt;</span> <span class="no">BiffRecord</span>
389
+ <span class="no">RECORD_ID</span> <span class="o">=</span> <span class="mh">0x01B7</span>
390
+
391
+ <span class="k">def</span> <span class="nf">initialize</span>
392
+ <span class="vi">@record_data</span> <span class="o">=</span> <span class="o">[</span><span class="mh">0x00</span><span class="o">].</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;v&#39;</span><span class="p">)</span>
393
+ <span class="k">end</span>
394
+ <span class="k">end</span>
395
+
396
+ <span class="c1"># This record contains a Boolean value determining whether to save values</span>
397
+ <span class="c1"># linked from external workbooks (CRN records and XCT records). In BIFF3</span>
398
+ <span class="c1"># and BIFF4 this option is stored in the WSBOOL record.</span>
399
+ <span class="c1"># </span>
400
+ <span class="c1"># Record BOOKBOOL, BIFF5-BIFF8:</span>
401
+ <span class="c1"># </span>
402
+ <span class="c1"># Offset Size Contents</span>
403
+ <span class="c1"># 0 2 0 = Save external linked values;</span>
404
+ <span class="c1"># 1 = Do not save external linked values</span>
405
+ <span class="k">class</span> <span class="nc">BookBoolRecord</span> <span class="o">&lt;</span> <span class="no">BiffRecord</span>
406
+ <span class="no">RECORD_ID</span> <span class="o">=</span> <span class="mh">0x00DA</span>
407
+
408
+ <span class="k">def</span> <span class="nf">initialize</span>
409
+ <span class="vi">@record_data</span> <span class="o">=</span> <span class="o">[</span><span class="mh">0x00</span><span class="o">].</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;v&#39;</span><span class="p">)</span>
410
+ <span class="k">end</span>
411
+ <span class="k">end</span>
412
+
413
+ <span class="c1"># This record stores two Windows country identifiers. The first</span>
414
+ <span class="c1"># represents the user interface language of the Excel version that has</span>
415
+ <span class="c1"># saved the file, and the second represents the system regional settings</span>
416
+ <span class="c1"># at the time the file was saved.</span>
417
+ <span class="c1"># </span>
418
+ <span class="c1"># Record COUNTRY, BIFF3-BIFF8:</span>
419
+ <span class="c1"># </span>
420
+ <span class="c1"># Offset Size Contents</span>
421
+ <span class="c1"># 0 2 Windows country identifier of the user interface language of Excel</span>
422
+ <span class="c1"># 2 2 Windows country identifier of the system regional settings</span>
423
+ <span class="c1"># </span>
424
+ <span class="c1"># The following table shows most of the used country identifiers. Most</span>
425
+ <span class="c1"># of these identifiers are equal to the international country calling</span>
426
+ <span class="c1"># codes.</span>
427
+ <span class="c1"># </span>
428
+ <span class="c1"># 1 USA</span>
429
+ <span class="c1"># 2 Canada</span>
430
+ <span class="c1"># 7 Russia</span>
431
+ <span class="k">class</span> <span class="nc">CountryRecord</span> <span class="o">&lt;</span> <span class="no">BiffRecord</span>
432
+ <span class="no">RECORD_ID</span> <span class="o">=</span> <span class="mh">0x00DA</span>
433
+
434
+ <span class="k">def</span> <span class="nf">initialize</span><span class="p">(</span><span class="n">ui_id</span><span class="p">,</span> <span class="n">sys_settings_id</span><span class="p">)</span>
435
+ <span class="vi">@record_data</span> <span class="o">=</span> <span class="o">[</span><span class="n">ui_id</span><span class="p">,</span> <span class="n">sys_settings_id</span><span class="o">].</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;v2&#39;</span><span class="p">)</span>
436
+ <span class="k">end</span>
437
+ <span class="k">end</span>
438
+
439
+ <span class="c1"># This record specifies if the formulas in the workbook can use natural</span>
440
+
441
+
442
+ </div>
443
+ <div id="right">
444
+ <ul id="nav">
445
+ <li><a href="surpass-manual-0-0-5.pdf">Download PDF Manual</a></li>
446
+ <li><a href="http://rubyforge.org/projects/surpass">Rubyforge Project Page</a></li>
447
+ </ul>
448
+ <div class="box">
449
+ <h2 style="margin-top:17px">Latest News</h2>
450
+ <ul>
451
+ <li>...</li>
452
+ </ul>
453
+ </div>
454
+ </div>
455
+ <div id="clear"></div></div>
456
+ <div id="footer">
457
+ <p>Site template designed by <a href="http://loadfoo.org/" rel="external">LoadFoO</a>. Valid <a href="http://jigsaw.w3.org/css-validator/check/referer" rel="external">CSS</a> &amp; <a href="http://validator.w3.org/check?uri=referer" rel="external">XHTML</a></p>
458
+ </div>
459
+ </div>
460
+
461
+ </body>
462
+ </html>