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.
- data/History.txt +4 -0
- data/README.txt +3 -20
- data/Rakefile +2 -13
- data/bin/surpass +8 -0
- data/examples/big-16mb.rb +25 -0
- data/examples/big-random-strings.rb +28 -0
- data/examples/blanks.rb +34 -0
- data/examples/blanks.xls +0 -0
- data/examples/col_width.rb +16 -0
- data/examples/col_width.xls +0 -0
- data/examples/dates.rb +31 -0
- data/examples/dates.xls +0 -0
- data/examples/format.rb +23 -0
- data/examples/format.xls +0 -0
- data/examples/hello-world.rb +9 -0
- data/examples/hello-world.xls +0 -0
- data/examples/image.rb +10 -0
- data/examples/image.xls +0 -0
- data/examples/merged.rb +36 -0
- data/examples/merged.xls +0 -0
- data/examples/merged0.rb +27 -0
- data/examples/merged0.xls +0 -0
- data/examples/merged1.rb +99 -0
- data/examples/merged1.xls +0 -0
- data/examples/num_formats.rb +55 -0
- data/examples/num_formats.xls +0 -0
- data/examples/numbers.rb +24 -0
- data/examples/numbers.xls +0 -0
- data/examples/outline.rb +110 -0
- data/examples/outline.xls +0 -0
- data/examples/panes.rb +48 -0
- data/examples/panes.xls +0 -0
- data/examples/protection.rb +132 -0
- data/examples/protection.xls +0 -0
- data/examples/python.bmp +0 -0
- data/examples/row_styles.rb +16 -0
- data/examples/row_styles.xls +0 -0
- data/examples/row_styles_empty.rb +15 -0
- data/examples/row_styles_empty.xls +0 -0
- data/examples/set_cell_and_range_style.rb +12 -0
- data/examples/set_cell_and_range_style.xls +0 -0
- data/examples/wrapped-text.rb +13 -0
- data/examples/wrapped-text.xls +0 -0
- data/examples/write_arrays.rb +22 -0
- data/examples/write_arrays.xls +0 -0
- data/examples/ws_props.rb +80 -0
- data/lib/surpass/ExcelFormula.g +366 -0
- data/lib/surpass/ExcelFormula.tokens +30 -0
- data/lib/surpass/ExcelFormulaLexer.rb +922 -0
- data/lib/surpass/ExcelFormulaParser.rb +602 -0
- data/lib/{biff_record.rb → surpass/biff_record.rb} +0 -0
- data/lib/{bitmap.rb → surpass/bitmap.rb} +0 -0
- data/lib/{cell.rb → surpass/cell.rb} +2 -34
- data/lib/{chart.rb → surpass/chart.rb} +0 -0
- data/lib/{column.rb → surpass/column.rb} +0 -0
- data/lib/{document.rb → surpass/document.rb} +0 -0
- data/lib/surpass/excel_formula.rb +23 -0
- data/lib/{excel_magic.rb → surpass/excel_magic.rb} +0 -0
- data/lib/{formatting.rb → surpass/formatting.rb} +93 -53
- data/lib/{row.rb → surpass/row.rb} +0 -0
- data/lib/{style.rb → surpass/style.rb} +2 -1
- data/lib/surpass/tokens.txt +2 -0
- data/lib/{utilities.rb → surpass/utilities.rb} +0 -0
- data/lib/{workbook.rb → surpass/workbook.rb} +0 -0
- data/lib/{worksheet.rb → surpass/worksheet.rb} +15 -6
- data/lib/surpass.rb +1 -1
- data/spec/biff_record_spec.rb +268 -0
- data/spec/cell_spec.rb +56 -0
- data/spec/data/random-strings.txt +10000 -0
- data/spec/document_spec.rb +168 -0
- data/spec/excel_formula_spec.rb +27 -0
- data/spec/formatting_spec.rb +53 -0
- data/spec/output/cells-rk.xls +0 -0
- data/spec/output/cells.xls +0 -0
- data/spec/output/mini.xls +0 -0
- data/spec/reference/P-0508-0000507647-3280-5298.xls +0 -0
- data/spec/reference/all-cell-styles.bin +0 -0
- data/spec/reference/all-number-formats.bin +0 -0
- data/spec/reference/all-styles.bin +0 -0
- data/spec/reference/mini.xls +0 -0
- data/spec/row_spec.rb +19 -0
- data/spec/spec_helper.rb +10 -0
- data/spec/style_spec.rb +89 -0
- data/spec/surpass_spec.rb +7 -0
- data/spec/utilities_spec.rb +57 -0
- data/spec/workbook_spec.rb +48 -0
- data/spec/worksheet_spec.rb +0 -0
- data/stats/cloc.txt +8 -0
- data/stats/rcov.txt +0 -0
- data/stats/specdoc.txt +158 -0
- data/surpass.gemspec +40 -0
- data/tasks/setup.rb +1 -1
- data/tasks/zentest.rake +36 -0
- data/webby/README.txt +6 -0
- data/webby/Sitefile +43 -0
- data/webby/content/css/pygments.txt +6 -0
- data/webby/content/css/style.css +279 -0
- data/webby/content/examples/autoformat.png +0 -0
- data/webby/content/examples/autoformat.rb +32 -0
- data/webby/content/examples/autoformat.xls +0 -0
- data/webby/content/examples/borders.png +0 -0
- data/webby/content/examples/borders.rb +15 -0
- data/webby/content/examples/borders.xls +0 -0
- data/webby/content/examples/colours.png +0 -0
- data/webby/content/examples/colours.rb +23 -0
- data/webby/content/examples/colours.xls +0 -0
- data/webby/content/examples/data.png +0 -0
- data/webby/content/examples/data.rb +11 -0
- data/webby/content/examples/data.xls +0 -0
- data/webby/content/examples/formatting.png +0 -0
- data/webby/content/examples/formatting.rb +78 -0
- data/webby/content/examples/formatting.xls +0 -0
- data/webby/content/examples/hello-world.png +0 -0
- data/webby/content/examples/hello-world.py +8 -0
- data/webby/content/examples/hello-world.rb +9 -0
- data/webby/content/examples/hello-world.xls +0 -0
- data/webby/content/examples/number-format-string.png +0 -0
- data/webby/content/examples/number-format-string.rb +14 -0
- data/webby/content/examples/number-format-string.xls +0 -0
- data/webby/content/examples/patterns.png +0 -0
- data/webby/content/examples/patterns.rb +26 -0
- data/webby/content/examples/patterns.xls +0 -0
- data/webby/content/examples/show-greens.sh +1 -0
- data/webby/content/examples/surpass-info.sh +1 -0
- data/webby/content/img/Thumbs.db +0 -0
- data/webby/content/img/bg_menu.gif +0 -0
- data/webby/content/img/bg_t.gif +0 -0
- data/webby/content/img/bullet.gif +0 -0
- data/webby/content/img/logo.png +0 -0
- data/webby/content/img/logo_.jpg +0 -0
- data/webby/content/img/top_bg.gif +0 -0
- data/webby/content/img/top_bg_.gif +0 -0
- data/webby/content/index.txt +16 -0
- data/webby/content/installation/index.txt +24 -0
- data/webby/content/source/ExcelFormulaLexer.txt +7 -0
- data/webby/content/source/ExcelFormulaParser.txt +7 -0
- data/webby/content/source/biff_record.txt +7 -0
- data/webby/content/source/bitmap.txt +7 -0
- data/webby/content/source/cell.txt +7 -0
- data/webby/content/source/chart.txt +7 -0
- data/webby/content/source/column.txt +7 -0
- data/webby/content/source/document.txt +7 -0
- data/webby/content/source/excel_formula.txt +7 -0
- data/webby/content/source/excel_magic.txt +7 -0
- data/webby/content/source/formatting.txt +7 -0
- data/webby/content/source/row.txt +7 -0
- data/webby/content/source/style.txt +7 -0
- data/webby/content/source/utilities.txt +7 -0
- data/webby/content/source/workbook.txt +7 -0
- data/webby/content/source/worksheet.txt +7 -0
- data/webby/content/surpass-manual.erb +198 -0
- data/webby/layouts/book.txt +29 -0
- data/webby/layouts/default.txt +27 -0
- data/webby/layouts/two_column.txt +25 -0
- data/webby/layouts/web.txt +66 -0
- data/webby/output/.cairn +0 -0
- data/webby/output/css/blueprint/ie.css +26 -0
- data/webby/output/css/blueprint/plugins/buttons/icons/cross.png +0 -0
- data/webby/output/css/blueprint/plugins/buttons/icons/key.png +0 -0
- data/webby/output/css/blueprint/plugins/buttons/icons/tick.png +0 -0
- data/webby/output/css/blueprint/plugins/buttons/readme.txt +32 -0
- data/webby/output/css/blueprint/plugins/buttons/screen.css +97 -0
- data/webby/output/css/blueprint/plugins/fancy-type/readme.txt +14 -0
- data/webby/output/css/blueprint/plugins/fancy-type/screen.css +71 -0
- data/webby/output/css/blueprint/plugins/link-icons/icons/doc.png +0 -0
- data/webby/output/css/blueprint/plugins/link-icons/icons/email.png +0 -0
- data/webby/output/css/blueprint/plugins/link-icons/icons/external.png +0 -0
- data/webby/output/css/blueprint/plugins/link-icons/icons/feed.png +0 -0
- data/webby/output/css/blueprint/plugins/link-icons/icons/im.png +0 -0
- data/webby/output/css/blueprint/plugins/link-icons/icons/pdf.png +0 -0
- data/webby/output/css/blueprint/plugins/link-icons/icons/visited.png +0 -0
- data/webby/output/css/blueprint/plugins/link-icons/icons/xls.png +0 -0
- data/webby/output/css/blueprint/plugins/link-icons/readme.txt +18 -0
- data/webby/output/css/blueprint/plugins/link-icons/screen.css +40 -0
- data/webby/output/css/blueprint/plugins/rtl/readme.txt +10 -0
- data/webby/output/css/blueprint/plugins/rtl/screen.css +109 -0
- data/webby/output/css/blueprint/print.css +30 -0
- data/webby/output/css/blueprint/screen.css +251 -0
- data/webby/output/css/blueprint/src/forms.css +49 -0
- data/webby/output/css/blueprint/src/grid.css +212 -0
- data/webby/output/css/blueprint/src/grid.png +0 -0
- data/webby/output/css/blueprint/src/ie.css +59 -0
- data/webby/output/css/blueprint/src/print.css +85 -0
- data/webby/output/css/blueprint/src/reset.css +38 -0
- data/webby/output/css/blueprint/src/typography.css +105 -0
- data/webby/output/css/pygments.css +59 -0
- data/webby/output/css/site.css +62 -0
- data/webby/output/css/style.css +279 -0
- data/webby/output/examples/autoformat.png +0 -0
- data/webby/output/examples/autoformat.rb +32 -0
- data/webby/output/examples/autoformat.xls +0 -0
- data/webby/output/examples/borders.png +0 -0
- data/webby/output/examples/borders.rb +15 -0
- data/webby/output/examples/borders.xls +0 -0
- data/webby/output/examples/colours.png +0 -0
- data/webby/output/examples/colours.rb +23 -0
- data/webby/output/examples/colours.xls +0 -0
- data/webby/output/examples/data.png +0 -0
- data/webby/output/examples/data.rb +11 -0
- data/webby/output/examples/data.xls +0 -0
- data/webby/output/examples/formatting.png +0 -0
- data/webby/output/examples/formatting.rb +78 -0
- data/webby/output/examples/formatting.xls +0 -0
- data/webby/output/examples/hello-world.png +0 -0
- data/webby/output/examples/hello-world.py +8 -0
- data/webby/output/examples/hello-world.rb +9 -0
- data/webby/output/examples/hello-world.xls +0 -0
- data/webby/output/examples/number-format-string.png +0 -0
- data/webby/output/examples/number-format-string.rb +14 -0
- data/webby/output/examples/number-format-string.xls +0 -0
- data/webby/output/examples/patterns.png +0 -0
- data/webby/output/examples/patterns.rb +26 -0
- data/webby/output/examples/patterns.xls +0 -0
- data/webby/output/examples/show-greens.sh +1 -0
- data/webby/output/examples/surpass-info.sh +1 -0
- data/webby/output/img/Thumbs.db +0 -0
- data/webby/output/img/bg_menu.gif +0 -0
- data/webby/output/img/bg_t.gif +0 -0
- data/webby/output/img/bullet.gif +0 -0
- data/webby/output/img/logo.png +0 -0
- data/webby/output/img/logo_.jpg +0 -0
- data/webby/output/img/top_bg.gif +0 -0
- data/webby/output/img/top_bg_.gif +0 -0
- data/webby/output/index.html +138 -0
- data/webby/output/installation/index.html +64 -0
- data/webby/output/installation/installation.html +1 -0
- data/webby/output/installation.html +1 -0
- data/webby/output/source/ExcelFormulaLexer.html +981 -0
- data/webby/output/source/ExcelFormulaParser.html +661 -0
- data/webby/output/source/biff_record.html +462 -0
- data/webby/output/source/bitmap.html +277 -0
- data/webby/output/source/cell.html +241 -0
- data/webby/output/source/chart.html +64 -0
- data/webby/output/source/column.html +99 -0
- data/webby/output/source/document.html +465 -0
- data/webby/output/source/excel_formula.html +82 -0
- data/webby/output/source/excel_magic.html +1072 -0
- data/webby/output/source/formatting.html +664 -0
- data/webby/output/source/row.html +169 -0
- data/webby/output/source/style.html +158 -0
- data/webby/output/source/surpass.html +110 -0
- data/webby/output/source/utilities.html +145 -0
- data/webby/output/source/workbook.html +265 -0
- data/webby/output/source/worksheet.html +331 -0
- data/webby/output/surpass-manual-0-0-5.pdf +0 -0
- data/webby/output/surpass-manual.aux +50 -0
- data/webby/output/surpass-manual.log +366 -0
- data/webby/output/surpass-manual.out +20 -0
- data/webby/output/surpass-manual.tex +582 -0
- data/webby/output/surpass-manual.toc +20 -0
- data/webby/rsync-exclude +7 -0
- data/webby/tasks/latex.rake +14 -0
- data/webby/tasks/screenshots.rb +58 -0
- data/webby/templates/article.erb +15 -0
- data/webby/templates/book.erb +16 -0
- data/webby/templates/page.erb +9 -0
- metadata +302 -24
- data/bin/surpass-info +0 -20
- data/lib/excel_formula.rb +0 -6
@@ -0,0 +1,277 @@
|
|
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 :: bitmap.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>bitmap.rb</h2>
|
36
|
+
<div class="highlight"><pre><span class="k">class</span> <span class="nc">ObjBmpRecord</span> <span class="o"><</span> <span class="no">BiffRecord</span>
|
37
|
+
<span class="no">RECORD_ID</span> <span class="o">=</span> <span class="mh">0x005D</span> <span class="c1"># Record identifier</span>
|
38
|
+
|
39
|
+
<span class="k">def</span> <span class="nf">initialize</span><span class="p">(</span><span class="n">row</span><span class="p">,</span> <span class="n">col</span><span class="p">,</span> <span class="n">sheet</span><span class="p">,</span> <span class="n">im_data_bmp</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">scale_x</span><span class="p">,</span> <span class="n">scale_y</span><span class="p">)</span>
|
40
|
+
<span class="n">width</span> <span class="o">=</span> <span class="n">im_data_bmp</span><span class="o">.</span><span class="n">width</span> <span class="o">*</span> <span class="n">scale_x</span>
|
41
|
+
<span class="n">height</span> <span class="o">=</span> <span class="n">im_data_bmp</span><span class="o">.</span><span class="n">height</span> <span class="o">*</span> <span class="n">scale_y</span>
|
42
|
+
|
43
|
+
<span class="n">col_start</span><span class="p">,</span> <span class="n">x1</span><span class="p">,</span> <span class="n">row_start</span><span class="p">,</span> <span class="n">y1</span><span class="p">,</span> <span class="n">col_end</span><span class="p">,</span> <span class="n">x2</span><span class="p">,</span> <span class="n">row_end</span><span class="p">,</span> <span class="n">y2</span> <span class="o">=</span> <span class="n">position_image</span><span class="p">(</span><span class="n">sheet</span><span class="p">,</span> <span class="n">row</span><span class="p">,</span> <span class="n">col</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">width</span><span class="p">,</span> <span class="n">height</span><span class="p">)</span>
|
44
|
+
|
45
|
+
<span class="c1"># Store the OBJ record that precedes an IMDATA record. This could be generalise</span>
|
46
|
+
<span class="c1"># to support other Excel objects.</span>
|
47
|
+
<span class="n">cobj</span> <span class="o">=</span> <span class="mh">0x0001</span> <span class="c1"># count of objects in file (set to 1)</span>
|
48
|
+
<span class="n">ot</span> <span class="o">=</span> <span class="mh">0x0008</span> <span class="c1"># object type. 8 = picture</span>
|
49
|
+
<span class="nb">id</span> <span class="o">=</span> <span class="mh">0x0001</span> <span class="c1"># object id</span>
|
50
|
+
<span class="n">grbit</span> <span class="o">=</span> <span class="mh">0x0614</span> <span class="c1"># option flags</span>
|
51
|
+
<span class="n">coll</span> <span class="o">=</span> <span class="n">col_start</span> <span class="c1"># col containing upper left corner of object</span>
|
52
|
+
<span class="n">dxl</span> <span class="o">=</span> <span class="n">x1</span> <span class="c1"># distance from left side of cell</span>
|
53
|
+
<span class="n">rwt</span> <span class="o">=</span> <span class="n">row_start</span> <span class="c1"># row containing top left corner of object</span>
|
54
|
+
<span class="n">dyt</span> <span class="o">=</span> <span class="n">y1</span> <span class="c1"># distance from top of cell</span>
|
55
|
+
<span class="n">colr</span> <span class="o">=</span> <span class="n">col_end</span> <span class="c1"># col containing lower right corner of object</span>
|
56
|
+
<span class="n">dxr</span> <span class="o">=</span> <span class="n">x2</span> <span class="c1"># distance from right of cell</span>
|
57
|
+
<span class="n">rwb</span> <span class="o">=</span> <span class="n">row_end</span> <span class="c1"># row containing bottom right corner of object</span>
|
58
|
+
<span class="n">dyb</span> <span class="o">=</span> <span class="n">y2</span> <span class="c1"># distance from bottom of cell</span>
|
59
|
+
<span class="n">cbmacro</span> <span class="o">=</span> <span class="mh">0x0000</span> <span class="c1"># length of fmla structure</span>
|
60
|
+
<span class="n">reserved1</span> <span class="o">=</span> <span class="mh">0x0000</span> <span class="c1"># reserved</span>
|
61
|
+
<span class="n">reserved2</span> <span class="o">=</span> <span class="mh">0x0000</span> <span class="c1"># reserved</span>
|
62
|
+
<span class="n">icvback</span> <span class="o">=</span> <span class="mh">0x09</span> <span class="c1"># background colour</span>
|
63
|
+
<span class="n">icvfore</span> <span class="o">=</span> <span class="mh">0x09</span> <span class="c1"># foreground colour</span>
|
64
|
+
<span class="n">fls</span> <span class="o">=</span> <span class="mh">0x00</span> <span class="c1"># fill pattern</span>
|
65
|
+
<span class="n">fauto</span> <span class="o">=</span> <span class="mh">0x00</span> <span class="c1"># automatic fill</span>
|
66
|
+
<span class="n">icv</span> <span class="o">=</span> <span class="mh">0x08</span> <span class="c1"># line colour</span>
|
67
|
+
<span class="n">lns</span> <span class="o">=</span> <span class="mh">0xff</span> <span class="c1"># line style</span>
|
68
|
+
<span class="n">lnw</span> <span class="o">=</span> <span class="mh">0x01</span> <span class="c1"># line weight</span>
|
69
|
+
<span class="n">fautob</span> <span class="o">=</span> <span class="mh">0x00</span> <span class="c1"># automatic border</span>
|
70
|
+
<span class="n">frs</span> <span class="o">=</span> <span class="mh">0x0000</span> <span class="c1"># frame style</span>
|
71
|
+
<span class="n">cf</span> <span class="o">=</span> <span class="mh">0x0009</span> <span class="c1"># image format, 9 = bitmap</span>
|
72
|
+
<span class="n">reserved3</span> <span class="o">=</span> <span class="mh">0x0000</span> <span class="c1"># reserved</span>
|
73
|
+
<span class="n">cbpictfmla</span> <span class="o">=</span> <span class="mh">0x0000</span> <span class="c1"># length of fmla structure</span>
|
74
|
+
<span class="n">reserved4</span> <span class="o">=</span> <span class="mh">0x0000</span> <span class="c1"># reserved</span>
|
75
|
+
<span class="n">grbit2</span> <span class="o">=</span> <span class="mh">0x0001</span> <span class="c1"># option flags</span>
|
76
|
+
<span class="n">reserved5</span> <span class="o">=</span> <span class="mh">0x0000</span> <span class="c1"># reserved</span>
|
77
|
+
|
78
|
+
<span class="n">args</span> <span class="o">=</span> <span class="o">[</span><span class="n">cobj</span><span class="p">,</span> <span class="n">ot</span><span class="p">,</span> <span class="nb">id</span><span class="p">,</span> <span class="n">grbit</span><span class="p">,</span> <span class="n">coll</span><span class="p">,</span> <span class="n">dxl</span><span class="p">,</span> <span class="n">rwt</span><span class="p">,</span> <span class="n">dyt</span><span class="p">,</span> <span class="n">colr</span><span class="p">,</span> <span class="n">dxr</span><span class="p">,</span> <span class="n">rwb</span><span class="p">,</span> <span class="n">dyb</span><span class="p">,</span> <span class="n">cbmacro</span><span class="p">,</span> <span class="n">reserved1</span><span class="p">,</span> <span class="n">reserved2</span><span class="p">,</span> <span class="n">icvback</span><span class="p">,</span> <span class="n">icvfore</span><span class="p">,</span> <span class="n">fls</span><span class="p">,</span> <span class="n">fauto</span><span class="p">,</span> <span class="n">icv</span><span class="p">,</span> <span class="n">lns</span><span class="p">,</span> <span class="n">lnw</span><span class="p">,</span> <span class="n">fautob</span><span class="p">,</span> <span class="n">frs</span><span class="p">,</span> <span class="n">cf</span><span class="p">,</span> <span class="n">reserved3</span><span class="p">,</span> <span class="n">cbpictfmla</span><span class="p">,</span> <span class="n">reserved4</span><span class="p">,</span> <span class="n">grbit2</span><span class="p">,</span> <span class="n">reserved5</span><span class="o">]</span>
|
79
|
+
<span class="vi">@record_data</span> <span class="o">=</span> <span class="n">args</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s1">'L v12 L v C8 v L v4 L'</span><span class="p">)</span>
|
80
|
+
<span class="k">end</span>
|
81
|
+
|
82
|
+
<span class="c1"># Calculate the vertices that define the position of the image as required by</span>
|
83
|
+
<span class="c1"># the OBJ record.</span>
|
84
|
+
<span class="c1"># </span>
|
85
|
+
<span class="c1"># +------------+------------+</span>
|
86
|
+
<span class="c1"># | A | B |</span>
|
87
|
+
<span class="c1"># +-----+------------+------------+</span>
|
88
|
+
<span class="c1"># | |(x1,y1) | |</span>
|
89
|
+
<span class="c1"># | 1 |(A1)._______|______ |</span>
|
90
|
+
<span class="c1"># | | | | |</span>
|
91
|
+
<span class="c1"># | | | | |</span>
|
92
|
+
<span class="c1"># +-----+----| BITMAP |-----+</span>
|
93
|
+
<span class="c1"># | | | | |</span>
|
94
|
+
<span class="c1"># | 2 | |______________. |</span>
|
95
|
+
<span class="c1"># | | | (B2)|</span>
|
96
|
+
<span class="c1"># | | | (x2,y2)|</span>
|
97
|
+
<span class="c1"># +---- +------------+------------+</span>
|
98
|
+
<span class="c1"># </span>
|
99
|
+
<span class="c1"># Example of a bitmap that covers some of the area from cell A1 to cell B2.</span>
|
100
|
+
<span class="c1"># </span>
|
101
|
+
<span class="c1"># Based on the width and height of the bitmap we need to calculate 8 vars:</span>
|
102
|
+
<span class="c1"># col_start, row_start, col_end, row_end, x1, y1, x2, y2.</span>
|
103
|
+
<span class="c1"># The width and height of the cells are also variable and have to be taken into</span>
|
104
|
+
<span class="c1"># account.</span>
|
105
|
+
<span class="c1"># The values of col_start and row_start are passed in from the calling</span>
|
106
|
+
<span class="c1"># function. The values of col_end and row_end are calculated by subtracting</span>
|
107
|
+
<span class="c1"># the width and height of the bitmap from the width and height of the</span>
|
108
|
+
<span class="c1"># underlying cells.</span>
|
109
|
+
<span class="c1"># The vertices are expressed as a percentage of the underlying cell width as</span>
|
110
|
+
<span class="c1"># follows (rhs values are in pixels):</span>
|
111
|
+
<span class="c1"># </span>
|
112
|
+
<span class="c1"># x1 = X / W *1024</span>
|
113
|
+
<span class="c1"># y1 = Y / H *256</span>
|
114
|
+
<span class="c1"># x2 = (X-1) / W *1024</span>
|
115
|
+
<span class="c1"># y2 = (Y-1) / H *256</span>
|
116
|
+
<span class="c1"># </span>
|
117
|
+
<span class="c1"># Where: X is distance from the left side of the underlying cell</span>
|
118
|
+
<span class="c1"># Y is distance from the top of the underlying cell</span>
|
119
|
+
<span class="c1"># W is the width of the cell</span>
|
120
|
+
<span class="c1"># H is the height of the cell</span>
|
121
|
+
<span class="c1"># </span>
|
122
|
+
<span class="c1"># Note: the SDK incorrectly states that the height should be expressed as a</span>
|
123
|
+
<span class="c1"># percentage of 1024.</span>
|
124
|
+
<span class="c1"># </span>
|
125
|
+
<span class="c1"># col_start - Col containing upper left corner of object</span>
|
126
|
+
<span class="c1"># row_start - Row containing top left corner of object</span>
|
127
|
+
<span class="c1"># x1 - Distance to left side of object</span>
|
128
|
+
<span class="c1"># y1 - Distance to top of object</span>
|
129
|
+
<span class="c1"># width - Width of image frame</span>
|
130
|
+
<span class="c1"># height - Height of image frame</span>
|
131
|
+
<span class="k">def</span> <span class="nf">position_image</span><span class="p">(</span><span class="n">sheet</span><span class="p">,</span> <span class="n">row_start</span><span class="p">,</span> <span class="n">col_start</span><span class="p">,</span> <span class="n">x1</span><span class="p">,</span> <span class="n">y1</span><span class="p">,</span> <span class="n">width</span><span class="p">,</span> <span class="n">height</span><span class="p">)</span>
|
132
|
+
<span class="k">while</span> <span class="n">x1</span> <span class="o">>=</span> <span class="n">size_col</span><span class="p">(</span><span class="n">sheet</span><span class="p">,</span> <span class="n">col_start</span><span class="p">)</span> <span class="k">do</span>
|
133
|
+
<span class="n">x1</span> <span class="o">-=</span> <span class="n">size_col</span><span class="p">(</span><span class="n">sheet</span><span class="p">,</span> <span class="n">col_start</span><span class="p">)</span>
|
134
|
+
<span class="n">col_start</span> <span class="o">+=</span> <span class="mi">1</span>
|
135
|
+
<span class="k">end</span>
|
136
|
+
|
137
|
+
<span class="c1"># Adjust start row for offsets that are greater than the row height</span>
|
138
|
+
<span class="k">while</span> <span class="n">y1</span> <span class="o">>=</span> <span class="n">size_row</span><span class="p">(</span><span class="n">sheet</span><span class="p">,</span> <span class="n">row_start</span><span class="p">)</span> <span class="k">do</span>
|
139
|
+
<span class="n">y1</span> <span class="o">-=</span> <span class="n">size_row</span><span class="p">(</span><span class="n">sheet</span><span class="p">,</span> <span class="n">row_start</span><span class="p">)</span>
|
140
|
+
<span class="n">row_start</span> <span class="o">+=</span> <span class="mi">1</span>
|
141
|
+
<span class="k">end</span>
|
142
|
+
|
143
|
+
<span class="c1"># Initialise end cell to the same as the start cell</span>
|
144
|
+
<span class="n">row_end</span> <span class="o">=</span> <span class="n">row_start</span> <span class="c1"># Row containing bottom right corner of object</span>
|
145
|
+
<span class="n">col_end</span> <span class="o">=</span> <span class="n">col_start</span> <span class="c1"># Col containing lower right corner of object</span>
|
146
|
+
<span class="n">width</span> <span class="o">=</span> <span class="n">width</span> <span class="o">+</span> <span class="n">x1</span> <span class="o">-</span> <span class="mi">1</span>
|
147
|
+
<span class="n">height</span> <span class="o">=</span> <span class="n">height</span> <span class="o">+</span> <span class="n">y1</span> <span class="o">-</span> <span class="mi">1</span>
|
148
|
+
|
149
|
+
<span class="c1"># Subtract the underlying cell widths to find the end cell of the image</span>
|
150
|
+
<span class="k">while</span> <span class="p">(</span><span class="n">width</span> <span class="o">>=</span> <span class="n">size_col</span><span class="p">(</span><span class="n">sheet</span><span class="p">,</span> <span class="n">col_end</span><span class="p">))</span> <span class="k">do</span>
|
151
|
+
<span class="n">width</span> <span class="o">-=</span> <span class="n">size_col</span><span class="p">(</span><span class="n">sheet</span><span class="p">,</span> <span class="n">col_end</span><span class="p">)</span>
|
152
|
+
<span class="n">col_end</span> <span class="o">+=</span> <span class="mi">1</span>
|
153
|
+
<span class="k">end</span>
|
154
|
+
|
155
|
+
<span class="c1"># Subtract the underlying cell heights to find the end cell of the image</span>
|
156
|
+
<span class="k">while</span> <span class="p">(</span><span class="n">height</span> <span class="o">>=</span> <span class="n">size_row</span><span class="p">(</span><span class="n">sheet</span><span class="p">,</span> <span class="n">row_end</span><span class="p">))</span> <span class="k">do</span>
|
157
|
+
<span class="n">height</span> <span class="o">-=</span> <span class="n">size_row</span><span class="p">(</span><span class="n">sheet</span><span class="p">,</span> <span class="n">row_end</span><span class="p">)</span>
|
158
|
+
<span class="n">row_end</span> <span class="o">+=</span> <span class="mi">1</span>
|
159
|
+
<span class="k">end</span>
|
160
|
+
|
161
|
+
<span class="c1"># Bitmap isn't allowed to start or finish in a hidden cell, i.e. a cell</span>
|
162
|
+
<span class="c1"># with zero height or width.</span>
|
163
|
+
<span class="n">starts_or_ends_in_hidden_cell</span> <span class="o">=</span> <span class="p">((</span><span class="n">size_col</span><span class="p">(</span><span class="n">sheet</span><span class="p">,</span> <span class="n">col_start</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="ow">or</span> <span class="p">(</span><span class="n">size_col</span><span class="p">(</span><span class="n">sheet</span><span class="p">,</span> <span class="n">col_end</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="ow">or</span> <span class="p">(</span><span class="n">size_row</span><span class="p">(</span><span class="n">sheet</span><span class="p">,</span> <span class="n">row_start</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="ow">or</span> <span class="p">(</span><span class="n">size_row</span><span class="p">(</span><span class="n">sheet</span><span class="p">,</span> <span class="n">row_end</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">))</span>
|
164
|
+
<span class="k">return</span> <span class="k">if</span> <span class="n">starts_or_ends_in_hidden_cell</span>
|
165
|
+
|
166
|
+
<span class="c1"># Convert the pixel values to the percentage value expected by Excel</span>
|
167
|
+
<span class="n">x1</span> <span class="o">=</span> <span class="p">(</span><span class="n">x1</span><span class="o">.</span><span class="n">to_f</span> <span class="o">/</span> <span class="n">size_col</span><span class="p">(</span><span class="n">sheet</span><span class="p">,</span> <span class="n">col_start</span><span class="p">)</span> <span class="o">*</span> <span class="mi">1024</span><span class="p">)</span><span class="o">.</span><span class="n">to_i</span>
|
168
|
+
<span class="n">y1</span> <span class="o">=</span> <span class="p">(</span><span class="n">y1</span><span class="o">.</span><span class="n">to_f</span> <span class="o">/</span> <span class="n">size_row</span><span class="p">(</span><span class="n">sheet</span><span class="p">,</span> <span class="n">row_start</span><span class="p">)</span> <span class="o">*</span> <span class="mi">256</span><span class="p">)</span><span class="o">.</span><span class="n">to_i</span>
|
169
|
+
<span class="c1"># Distance to right side of object</span>
|
170
|
+
<span class="n">x2</span> <span class="o">=</span> <span class="p">(</span><span class="n">width</span><span class="o">.</span><span class="n">to_f</span> <span class="o">/</span> <span class="n">size_col</span><span class="p">(</span><span class="n">sheet</span><span class="p">,</span> <span class="n">col_end</span><span class="p">)</span> <span class="o">*</span> <span class="mi">1024</span><span class="p">)</span><span class="o">.</span><span class="n">to_i</span>
|
171
|
+
<span class="c1"># Distance to bottom of object</span>
|
172
|
+
<span class="n">y2</span> <span class="o">=</span> <span class="p">(</span><span class="n">height</span><span class="o">.</span><span class="n">to_f</span> <span class="o">/</span> <span class="n">size_row</span><span class="p">(</span><span class="n">sheet</span><span class="p">,</span> <span class="n">row_end</span><span class="p">)</span> <span class="o">*</span> <span class="mi">256</span><span class="p">)</span><span class="o">.</span><span class="n">to_i</span>
|
173
|
+
|
174
|
+
<span class="o">[</span><span class="n">col_start</span><span class="p">,</span> <span class="n">x1</span><span class="p">,</span> <span class="n">row_start</span><span class="p">,</span> <span class="n">y1</span><span class="p">,</span> <span class="n">col_end</span><span class="p">,</span> <span class="n">x2</span><span class="p">,</span> <span class="n">row_end</span><span class="p">,</span> <span class="n">y2</span><span class="o">]</span>
|
175
|
+
<span class="k">end</span>
|
176
|
+
|
177
|
+
<span class="k">def</span> <span class="nf">size_col</span><span class="p">(</span><span class="n">sheet</span><span class="p">,</span> <span class="n">col</span><span class="p">)</span>
|
178
|
+
<span class="n">sheet</span><span class="o">.</span><span class="n">col_width</span><span class="p">(</span><span class="n">col</span><span class="p">)</span>
|
179
|
+
<span class="k">end</span>
|
180
|
+
|
181
|
+
<span class="k">def</span> <span class="nf">size_row</span><span class="p">(</span><span class="n">sheet</span><span class="p">,</span> <span class="n">row</span><span class="p">)</span>
|
182
|
+
<span class="n">sheet</span><span class="o">.</span><span class="n">row_height</span><span class="p">(</span><span class="n">row</span><span class="p">)</span>
|
183
|
+
<span class="k">end</span>
|
184
|
+
<span class="k">end</span>
|
185
|
+
|
186
|
+
<span class="k">class</span> <span class="nc">ImDataBmpRecord</span> <span class="o"><</span> <span class="no">BiffRecord</span>
|
187
|
+
<span class="no">RECORD_ID</span> <span class="o">=</span> <span class="mh">0x007F</span>
|
188
|
+
|
189
|
+
<span class="kp">attr_accessor</span> <span class="ss">:width</span>
|
190
|
+
<span class="kp">attr_accessor</span> <span class="ss">:height</span>
|
191
|
+
<span class="kp">attr_accessor</span> <span class="ss">:size</span>
|
192
|
+
|
193
|
+
<span class="c1"># Insert a 24bit bitmap image in a worksheet. The main record required is</span>
|
194
|
+
<span class="c1"># IMDATA but it must be proceeded by a OBJ record to define its position.</span>
|
195
|
+
<span class="k">def</span> <span class="nf">initialize</span><span class="p">(</span><span class="n">filename</span><span class="p">)</span>
|
196
|
+
<span class="vi">@width</span><span class="p">,</span> <span class="vi">@height</span><span class="p">,</span> <span class="vi">@size</span><span class="p">,</span> <span class="n">data</span> <span class="o">=</span> <span class="n">process_bitmap</span><span class="p">(</span><span class="n">filename</span><span class="p">)</span>
|
197
|
+
|
198
|
+
<span class="n">cf</span> <span class="o">=</span> <span class="mh">0x09</span>
|
199
|
+
<span class="n">env</span> <span class="o">=</span> <span class="mh">0x01</span>
|
200
|
+
<span class="n">lcb</span> <span class="o">=</span> <span class="vi">@size</span>
|
201
|
+
|
202
|
+
<span class="vi">@record_data</span> <span class="o">=</span> <span class="o">[</span><span class="n">cf</span><span class="p">,</span> <span class="n">env</span><span class="p">,</span> <span class="n">lcb</span><span class="o">].</span><span class="n">pack</span><span class="p">(</span><span class="s1">'v2L'</span><span class="p">)</span> <span class="o">+</span> <span class="n">data</span>
|
203
|
+
<span class="k">end</span>
|
204
|
+
|
205
|
+
<span class="c1"># Convert a 24 bit bitmap into the modified internal format used by Windows.</span>
|
206
|
+
<span class="c1"># This is described in BITMAPCOREHEADER and BITMAPCOREINFO structures in the</span>
|
207
|
+
<span class="c1"># MSDN library.</span>
|
208
|
+
<span class="k">def</span> <span class="nf">process_bitmap</span><span class="p">(</span><span class="n">filename</span><span class="p">)</span>
|
209
|
+
<span class="n">data</span> <span class="o">=</span> <span class="kp">nil</span>
|
210
|
+
<span class="no">File</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="s2">"rb"</span><span class="p">)</span> <span class="k">do</span> <span class="o">|</span><span class="n">f</span><span class="o">|</span>
|
211
|
+
<span class="n">data</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">read</span>
|
212
|
+
<span class="k">end</span>
|
213
|
+
|
214
|
+
<span class="k">raise</span> <span class="s2">"bitmap </span><span class="si">#{</span><span class="n">filename</span><span class="si">}</span><span class="s2"> doesn't contain enough data"</span> <span class="k">if</span> <span class="n">data</span><span class="o">.</span><span class="n">length</span> <span class="o"><=</span> <span class="mh">0x36</span>
|
215
|
+
<span class="k">raise</span> <span class="s2">"bitmap </span><span class="si">#{</span><span class="n">filename</span><span class="si">}</span><span class="s2"> is not valid"</span> <span class="k">unless</span> <span class="n">data</span><span class="o">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">2</span><span class="o">]</span> <span class="o">===</span> <span class="s2">"BM"</span>
|
216
|
+
|
217
|
+
<span class="c1"># Remove bitmap data: ID.</span>
|
218
|
+
<span class="n">data</span> <span class="o">=</span> <span class="n">data</span><span class="o">[</span><span class="mi">2</span><span class="o">.</span><span class="n">.</span><span class="o">-</span><span class="mi">1</span><span class="o">]</span>
|
219
|
+
|
220
|
+
<span class="c1"># Read and remove the bitmap size. This is more reliable than reading</span>
|
221
|
+
<span class="c1"># the data size at offset 0x22.</span>
|
222
|
+
<span class="n">size</span> <span class="o">=</span> <span class="n">data</span><span class="o">[</span><span class="mi">0</span><span class="p">,</span><span class="mi">4</span><span class="o">].</span><span class="n">unpack</span><span class="p">(</span><span class="s1">'L'</span><span class="p">)</span><span class="o">[</span><span class="mi">0</span><span class="o">]</span>
|
223
|
+
<span class="n">size</span> <span class="o">-=</span> <span class="mh">0x36</span> <span class="c1"># Subtract size of bitmap header.</span>
|
224
|
+
<span class="n">size</span> <span class="o">+=</span> <span class="mh">0x0C</span> <span class="c1"># Add size of BIFF header.</span>
|
225
|
+
|
226
|
+
<span class="n">data</span> <span class="o">=</span> <span class="n">data</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>
|
227
|
+
<span class="c1"># Remove bitmap data: reserved, offset, header length.</span>
|
228
|
+
<span class="n">data</span> <span class="o">=</span> <span class="n">data</span><span class="o">[</span><span class="mi">12</span><span class="o">.</span><span class="n">.</span><span class="o">-</span><span class="mi">1</span><span class="o">]</span>
|
229
|
+
<span class="c1"># Read and remove the bitmap width and height. Verify the sizes.</span>
|
230
|
+
<span class="n">width</span><span class="p">,</span> <span class="n">height</span> <span class="o">=</span> <span class="n">data</span><span class="o">[</span><span class="mi">0</span><span class="p">,</span><span class="mi">8</span><span class="o">].</span><span class="n">unpack</span><span class="p">(</span><span class="s1">'L2'</span><span class="p">)</span>
|
231
|
+
<span class="n">data</span> <span class="o">=</span> <span class="n">data</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>
|
232
|
+
<span class="k">raise</span> <span class="s2">"bitmap </span><span class="si">#{</span><span class="n">filename</span><span class="si">}</span><span class="s2"> largest image width supported is 65k."</span> <span class="k">if</span> <span class="p">(</span><span class="n">width</span> <span class="o">></span> <span class="mh">0xFFFF</span><span class="p">)</span>
|
233
|
+
<span class="k">raise</span> <span class="s2">"bitmap </span><span class="si">#{</span><span class="n">filename</span><span class="si">}</span><span class="s2"> largest image height supported is 65k."</span> <span class="k">if</span> <span class="p">(</span><span class="n">height</span> <span class="o">></span> <span class="mh">0xFFFF</span><span class="p">)</span>
|
234
|
+
|
235
|
+
<span class="c1"># Read and remove the bitmap planes and bpp data. Verify them.</span>
|
236
|
+
<span class="n">planes</span><span class="p">,</span> <span class="n">bitcount</span> <span class="o">=</span> <span class="n">data</span><span class="o">[</span><span class="mi">0</span><span class="p">,</span><span class="mi">4</span><span class="o">].</span><span class="n">unpack</span><span class="p">(</span><span class="s1">'v2'</span><span class="p">)</span>
|
237
|
+
<span class="n">data</span> <span class="o">=</span> <span class="n">data</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>
|
238
|
+
<span class="k">raise</span> <span class="s2">"bitmap </span><span class="si">#{</span><span class="n">filename</span><span class="si">}</span><span class="s2"> isn't a 24bit true color bitmap."</span> <span class="k">if</span> <span class="p">(</span><span class="n">bitcount</span> <span class="o">!=</span> <span class="mi">24</span><span class="p">)</span>
|
239
|
+
<span class="k">raise</span> <span class="s2">"bitmap </span><span class="si">#{</span><span class="n">filename</span><span class="si">}</span><span class="s2"> only 1 plane supported in bitmap image."</span> <span class="k">if</span> <span class="p">(</span><span class="n">planes</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">)</span>
|
240
|
+
|
241
|
+
<span class="c1"># Read and remove the bitmap compression. Verify compression.</span>
|
242
|
+
<span class="n">compression</span> <span class="o">=</span> <span class="n">data</span><span class="o">[</span><span class="mi">0</span><span class="p">,</span><span class="mi">4</span><span class="o">].</span><span class="n">unpack</span><span class="p">(</span><span class="s1">'L'</span><span class="p">)</span><span class="o">[</span><span class="mi">0</span><span class="o">]</span>
|
243
|
+
<span class="n">data</span> <span class="o">=</span> <span class="n">data</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>
|
244
|
+
<span class="k">raise</span> <span class="s2">"bitmap </span><span class="si">#{</span><span class="n">filename</span><span class="si">}</span><span class="s2"> compression not supported in bitmap image."</span> <span class="k">if</span> <span class="p">(</span><span class="n">compression</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">)</span>
|
245
|
+
|
246
|
+
<span class="c1"># Remove bitmap data: data size, hres, vres, colours, imp. colours.</span>
|
247
|
+
<span class="n">data</span> <span class="o">=</span> <span class="n">data</span><span class="o">[</span><span class="mi">20</span><span class="o">.</span><span class="n">.</span><span class="o">-</span><span class="mi">1</span><span class="o">]</span>
|
248
|
+
<span class="c1"># Add the BITMAPCOREHEADER data</span>
|
249
|
+
<span class="n">header</span> <span class="o">=</span> <span class="o">[</span><span class="mh">0x000c</span><span class="p">,</span> <span class="n">width</span><span class="p">,</span> <span class="n">height</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0x18</span><span class="o">].</span><span class="n">pack</span><span class="p">(</span><span class="s1">'Lv4'</span><span class="p">)</span>
|
250
|
+
|
251
|
+
<span class="o">[</span><span class="n">width</span><span class="p">,</span> <span class="n">height</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">header</span> <span class="o">+</span> <span class="n">data</span><span class="o">]</span>
|
252
|
+
<span class="k">end</span>
|
253
|
+
<span class="k">end</span>
|
254
|
+
</pre></div>
|
255
|
+
|
256
|
+
|
257
|
+
</div>
|
258
|
+
<div id="right">
|
259
|
+
<ul id="nav">
|
260
|
+
<li><a href="surpass-manual-0-0-5.pdf">Download PDF Manual</a></li>
|
261
|
+
<li><a href="http://rubyforge.org/projects/surpass">Rubyforge Project Page</a></li>
|
262
|
+
</ul>
|
263
|
+
<div class="box">
|
264
|
+
<h2 style="margin-top:17px">Latest News</h2>
|
265
|
+
<ul>
|
266
|
+
<li>...</li>
|
267
|
+
</ul>
|
268
|
+
</div>
|
269
|
+
</div>
|
270
|
+
<div id="clear"></div></div>
|
271
|
+
<div id="footer">
|
272
|
+
<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> & <a href="http://validator.w3.org/check?uri=referer" rel="external">XHTML</a></p>
|
273
|
+
</div>
|
274
|
+
</div>
|
275
|
+
|
276
|
+
</body>
|
277
|
+
</html>
|