diff options
Diffstat (limited to 'doc/README.html')
-rw-r--r-- | doc/README.html | 670 |
1 files changed, 670 insertions, 0 deletions
diff --git a/doc/README.html b/doc/README.html new file mode 100644 index 0000000..53be918 --- /dev/null +++ b/doc/README.html @@ -0,0 +1,670 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + <meta content="text/html; charset=utf-8" http-equiv="Content-Type" /> + + <title>File: README [RDoc Documentation]</title> + + <link type="text/css" media="screen" href="./rdoc.css" rel="stylesheet" /> + + <script src="./js/jquery.js" type="text/javascript" + charset="utf-8"></script> + <script src="./js/thickbox-compressed.js" type="text/javascript" + charset="utf-8"></script> + <script src="./js/quicksearch.js" type="text/javascript" + charset="utf-8"></script> + <script src="./js/darkfish.js" type="text/javascript" + charset="utf-8"></script> +</head> + +<body class="file"> + <div id="metadata"> + <div id="project-metadata"> + + + <div id="fileindex-section" class="section project-section"> + <h3 class="section-header">Files</h3> + <ul> + + <li class="file"><a href="./README.html">README</a></li> + + </ul> + </div> + + + <div id="classindex-section" class="section project-section"> + <h3 class="section-header">Class Index + <span class="search-toggle"><img src="./images/find.png" + height="16" width="16" alt="[+]" + title="show/hide quicksearch" /></span></h3> + <form action="#" method="get" accept-charset="utf-8" class="initially-hidden"> + <fieldset> + <legend>Quicksearch</legend> + <input type="text" name="quicksearch" value="" + class="quicksearch-field" /> + </fieldset> + </form> + + <ul class="link-list"> + + <li><a href="./JSON.html">JSON</a></li> + + <li><a href="./JSON/CircularDatastructure.html">JSON::CircularDatastructure</a></li> + + <li><a href="./JSON/Editor.html">JSON::Editor</a></li> + + <li><a href="./JSON/Editor/EditMenu.html">JSON::Editor::EditMenu</a></li> + + <li><a href="./JSON/Editor/FileMenu.html">JSON::Editor::FileMenu</a></li> + + <li><a href="./JSON/Editor/Gtk.html">JSON::Editor::Gtk</a></li> + + <li><a href="./JSON/Editor/Gtk/TreeIter.html">JSON::Editor::Gtk::TreeIter</a></li> + + <li><a href="./JSON/Editor/JSONTreeView.html">JSON::Editor::JSONTreeView</a></li> + + <li><a href="./JSON/Editor/MainWindow.html">JSON::Editor::MainWindow</a></li> + + <li><a href="./JSON/Editor/MenuExtension.html">JSON::Editor::MenuExtension</a></li> + + <li><a href="./JSON/Editor/OptionsMenu.html">JSON::Editor::OptionsMenu</a></li> + + <li><a href="./JSON/Editor/PopUpMenu.html">JSON::Editor::PopUpMenu</a></li> + + <li><a href="./JSON/Ext.html">JSON::Ext</a></li> + + <li><a href="./JSON/Ext/Generator.html">JSON::Ext::Generator</a></li> + + <li><a href="./JSON/Ext/Generator/GeneratorMethods.html">JSON::Ext::Generator::GeneratorMethods</a></li> + + <li><a href="./JSON/Ext/Generator/GeneratorMethods/Array.html">JSON::Ext::Generator::GeneratorMethods::Array</a></li> + + <li><a href="./JSON/Ext/Generator/GeneratorMethods/FalseClass.html">JSON::Ext::Generator::GeneratorMethods::FalseClass</a></li> + + <li><a href="./JSON/Ext/Generator/GeneratorMethods/Float.html">JSON::Ext::Generator::GeneratorMethods::Float</a></li> + + <li><a href="./JSON/Ext/Generator/GeneratorMethods/Hash.html">JSON::Ext::Generator::GeneratorMethods::Hash</a></li> + + <li><a href="./JSON/Ext/Generator/GeneratorMethods/Integer.html">JSON::Ext::Generator::GeneratorMethods::Integer</a></li> + + <li><a href="./JSON/Ext/Generator/GeneratorMethods/NilClass.html">JSON::Ext::Generator::GeneratorMethods::NilClass</a></li> + + <li><a href="./JSON/Ext/Generator/GeneratorMethods/Object.html">JSON::Ext::Generator::GeneratorMethods::Object</a></li> + + <li><a href="./JSON/Ext/Generator/GeneratorMethods/String.html">JSON::Ext::Generator::GeneratorMethods::String</a></li> + + <li><a href="./JSON/Ext/Generator/GeneratorMethods/String/Extend.html">JSON::Ext::Generator::GeneratorMethods::String::Extend</a></li> + + <li><a href="./JSON/Ext/Generator/GeneratorMethods/TrueClass.html">JSON::Ext::Generator::GeneratorMethods::TrueClass</a></li> + + <li><a href="./JSON/Ext/Generator/State.html">JSON::Ext::Generator::State</a></li> + + <li><a href="./JSON/Ext/Parser.html">JSON::Ext::Parser</a></li> + + <li><a href="./JSON/GeneratorError.html">JSON::GeneratorError</a></li> + + <li><a href="./JSON/JSONError.html">JSON::JSONError</a></li> + + <li><a href="./JSON/MissingUnicodeSupport.html">JSON::MissingUnicodeSupport</a></li> + + <li><a href="./JSON/NestingError.html">JSON::NestingError</a></li> + + <li><a href="./JSON/ParserError.html">JSON::ParserError</a></li> + + <li><a href="./JSON/Pure.html">JSON::Pure</a></li> + + <li><a href="./JSON/Pure/Generator.html">JSON::Pure::Generator</a></li> + + <li><a href="./JSON/Pure/Generator/GeneratorMethods.html">JSON::Pure::Generator::GeneratorMethods</a></li> + + <li><a href="./JSON/Pure/Generator/GeneratorMethods/Array.html">JSON::Pure::Generator::GeneratorMethods::Array</a></li> + + <li><a href="./JSON/Pure/Generator/GeneratorMethods/FalseClass.html">JSON::Pure::Generator::GeneratorMethods::FalseClass</a></li> + + <li><a href="./JSON/Pure/Generator/GeneratorMethods/Float.html">JSON::Pure::Generator::GeneratorMethods::Float</a></li> + + <li><a href="./JSON/Pure/Generator/GeneratorMethods/Hash.html">JSON::Pure::Generator::GeneratorMethods::Hash</a></li> + + <li><a href="./JSON/Pure/Generator/GeneratorMethods/Integer.html">JSON::Pure::Generator::GeneratorMethods::Integer</a></li> + + <li><a href="./JSON/Pure/Generator/GeneratorMethods/NilClass.html">JSON::Pure::Generator::GeneratorMethods::NilClass</a></li> + + <li><a href="./JSON/Pure/Generator/GeneratorMethods/Object.html">JSON::Pure::Generator::GeneratorMethods::Object</a></li> + + <li><a href="./JSON/Pure/Generator/GeneratorMethods/String.html">JSON::Pure::Generator::GeneratorMethods::String</a></li> + + <li><a href="./JSON/Pure/Generator/GeneratorMethods/String/Extend.html">JSON::Pure::Generator::GeneratorMethods::String::Extend</a></li> + + <li><a href="./JSON/Pure/Generator/GeneratorMethods/TrueClass.html">JSON::Pure::Generator::GeneratorMethods::TrueClass</a></li> + + <li><a href="./JSON/Pure/Generator/State.html">JSON::Pure::Generator::State</a></li> + + <li><a href="./JSON/Pure/Parser.html">JSON::Pure::Parser</a></li> + + <li><a href="./Class.html">Class</a></li> + + <li><a href="./Date.html">Date</a></li> + + <li><a href="./DateTime.html">DateTime</a></li> + + <li><a href="./Enumerable.html">Enumerable</a></li> + + <li><a href="./Exception.html">Exception</a></li> + + <li><a href="./Kernel.html">Kernel</a></li> + + <li><a href="./Object.html">Object</a></li> + + <li><a href="./Range.html">Range</a></li> + + <li><a href="./Regexp.html">Regexp</a></li> + + <li><a href="./Struct.html">Struct</a></li> + + <li><a href="./Symbol.html">Symbol</a></li> + + <li><a href="./Time.html">Time</a></li> + + </ul> + <div id="no-class-search-results" style="display: none;">No matching classes.</div> + </div> + + + </div> + </div> + + <div id="documentation"> + <h2>json - <a href="JSON.html">JSON</a> Implementation for Ruby</h2> +<h3>Description</h3> +<p> +This is a implementation of the <a href="JSON.html">JSON</a> specification +according to RFC 4627 <a +href="http://www.ietf.org/rfc/rfc4627.txt">www.ietf.org/rfc/rfc4627.txt</a> +. Starting from version 1.0.0 on there will be two variants available: +</p> +<ul> +<li>A pure ruby variant, that relies on the iconv and the stringscan +extensions, which are both part of the ruby standard library. + +</li> +<li>The quite a bit faster C extension variant, which is in parts implemented +in C and comes with its own unicode conversion functions and a parser +generated by the ragel state machine compiler <a +href="http://www.cs.queensu.ca/~thurston/ragel">www.cs.queensu.ca/~thurston/ragel</a> +. + +</li> +</ul> +<p> +Both variants of the <a href="JSON.html">JSON</a> generator escape all +non-ASCII and control characters with uXXXX escape sequences, and support +UTF-16 surrogate pairs in order to be able to generate the whole range of +unicode code points. This means that generated <a href="JSON.html">JSON</a> +document is encoded as UTF-8 (because ASCII is a subset of UTF-8) and at +the same time avoids decoding problems for receiving endpoints, that +don’t expect UTF-8 encoded texts. On the negative side this may lead +to a bit longer strings than necessarry. +</p> +<p> +All strings, that are to be encoded as <a href="JSON.html">JSON</a> +strings, should be UTF-8 byte sequences on the Ruby side. To encode raw +binary strings, that aren’t UTF-8 encoded, please use the +to_json_raw_object method of String (which produces an object, that +contains a byte array) and decode the result on the receiving endpoint. +</p> +<p> +The <a href="JSON.html">JSON</a> parsers can parse UTF-8, UTF-16BE, +UTF-16LE, UTF-32BE, and UTF-32LE <a href="JSON.html">JSON</a> documents +under Ruby 1.8. Under Ruby 1.9 they take advantage of Ruby’s M17n +features and can parse all documents which have the correct String#encoding +set. If a document string has ASCII-8BIT as an encoding the parser attempts +to figure out which of the UTF encodings from above it is and trys to parse +it. +</p> +<h3>Installation</h3> +<p> +It’s recommended to use the extension variant of <a +href="JSON.html">JSON</a>, because it’s faster than the pure ruby +variant. If you cannot build it on your system, you can settle for the +latter. +</p> +<p> +Just type into the command line as root: +</p> +<pre> + # rake install +</pre> +<p> +The above command will build the extensions and install them on your +system. +</p> +<pre> + # rake install_pure +</pre> +<p> +or +</p> +<pre> + # ruby install.rb +</pre> +<p> +will just install the pure ruby implementation of <a +href="JSON.html">JSON</a>. +</p> +<p> +If you use Rubygems you can type +</p> +<pre> + # gem install json +</pre> +<p> +instead, to install the newest <a href="JSON.html">JSON</a> version. +</p> +<p> +There is also a pure ruby json only variant of the gem, that can be +installed with: +</p> +<pre> + # gem install json_pure +</pre> +<h3>Compiling the extensions yourself</h3> +<p> +If you want to build the extensions yourself you need rake: +</p> +<pre> + You can get it from rubyforge: + http://rubyforge.org/projects/rake + + or just type + + # gem install rake + + for the installation via rubygems. +</pre> +<p> +If you want to create the parser.c file from its parser.rl file or draw +nice graphviz images of the state machines, you need ragel from: <a +href="http://www.cs.queensu.ca/~thurston/ragel">www.cs.queensu.ca/~thurston/ragel</a> +</p> +<h3>Usage</h3> +<p> +To use <a href="JSON.html">JSON</a> you can +</p> +<pre> + require 'json' +</pre> +<p> +to load the installed variant (either the extension ‘json’ or +the pure variant ‘json_pure’). If you have installed the +extension variant, you can pick either the extension variant or the pure +variant by typing +</p> +<pre> + require 'json/ext' +</pre> +<p> +or +</p> +<pre> + require 'json/pure' +</pre> +<p> +Now you can parse a <a href="JSON.html">JSON</a> document into a ruby data +structure by calling +</p> +<pre> + JSON.parse(document) +</pre> +<p> +If you want to generate a <a href="JSON.html">JSON</a> document from a ruby +data structure call +</p> +<pre> + JSON.generate(data) +</pre> +<p> +You can also use the pretty_generate method (which formats the output more +verbosely and nicely) or fast_generate (which doesn’t do any of the +security checks generate performs, e. g. nesting deepness checks). +</p> +<p> +To create a valid <a href="JSON.html">JSON</a> document you have to make +sure, that the output is embedded in either a <a href="JSON.html">JSON</a> +array [] or a <a href="JSON.html">JSON</a> object {}. The easiest way to do +this, is by putting your values in a Ruby Array or Hash instance. +</p> +<p> +There are also the <a href="JSON.html">JSON</a> and JSON[] methods which +use parse on a String or generate a <a href="JSON.html">JSON</a> document +from an array or hash: +</p> +<pre> + document = JSON 'test' => 23 # => "{\"test\":23}" + document = JSON['test'] => 23 # => "{\"test\":23}" +</pre> +<p> +and +</p> +<pre> + data = JSON '{"test":23}' # => {"test"=>23} + data = JSON['{"test":23}'] # => {"test"=>23} +</pre> +<p> +You can choose to load a set of common additions to ruby core’s +objects if you +</p> +<pre> + require 'json/add/core' +</pre> +<p> +After requiring this you can, e. g., serialise/deserialise Ruby ranges: +</p> +<pre> + JSON JSON(1..10) # => 1..10 +</pre> +<p> +To find out how to add <a href="JSON.html">JSON</a> support to other or +your own classes, read the section “More Examples” below. +</p> +<p> +To get the best compatibility to rails’ <a href="JSON.html">JSON</a> +implementation, you can +</p> +<pre> + require 'json/add/rails' +</pre> +<p> +Both of the additions attempt to require ‘json’ (like above) +first, if it has not been required yet. +</p> +<h3>More Examples</h3> +<p> +To create a <a href="JSON.html">JSON</a> document from a ruby data +structure, you can call <a href="JSON.html#M000026">JSON.generate</a> like +that: +</p> +<pre> + json = JSON.generate [1, 2, {"a"=>3.141}, false, true, nil, 4..10] + # => "[1,2,{\"a\":3.141},false,true,null,\"4..10\"]" +</pre> +<p> +To get back a ruby data structure from a <a href="JSON.html">JSON</a> +document, you have to call <a href="JSON.html#M000024">JSON.parse</a> on +it: +</p> +<pre> + JSON.parse json + # => [1, 2, {"a"=>3.141}, false, true, nil, "4..10"] +</pre> +<p> +Note, that the range from the original data structure is a simple string +now. The reason for this is, that <a href="JSON.html">JSON</a> +doesn’t support ranges or arbitrary classes. In this case the json +library falls back to call <a +href="Object.html#M000001">Object#to_json</a>, which is the same as +to_s.to_json. +</p> +<p> +It’s possible to add <a href="JSON.html">JSON</a> support +serialization to arbitrary classes by simply implementing a more +specialized version of the to_json method, that should return a <a +href="JSON.html">JSON</a> object (a hash converted to <a +href="JSON.html">JSON</a> with to_json) like this (don’t forget the +*a for all the arguments): +</p> +<pre> + class Range + def to_json(*a) + { + 'json_class' => self.class.name, # = 'Range' + 'data' => [ first, last, exclude_end? ] + }.to_json(*a) + end + end +</pre> +<p> +The hash key ‘json_class’ is the class, that will be asked to +deserialise the <a href="JSON.html">JSON</a> representation later. In this +case it’s ‘Range’, but any namespace of the form +‘A::B’ or ’::A::B’ will do. All other keys are +arbitrary and can be used to store the necessary data to configure the +object to be deserialised. +</p> +<p> +If a the key ‘json_class’ is found in a <a +href="JSON.html">JSON</a> object, the <a href="JSON.html">JSON</a> parser +checks if the given class responds to the json_create class method. If so, +it is called with the <a href="JSON.html">JSON</a> object converted to a +Ruby hash. So a range can be deserialised by implementing <a +href="Range.html#M000012">Range.json_create</a> like this: +</p> +<pre> + class Range + def self.json_create(o) + new(*o['data']) + end + end +</pre> +<p> +Now it possible to serialise/deserialise ranges as well: +</p> +<pre> + json = JSON.generate [1, 2, {"a"=>3.141}, false, true, nil, 4..10] + # => "[1,2,{\"a\":3.141},false,true,null,{\"json_class\":\"Range\",\"data\":[4,10,false]}]" + JSON.parse json + # => [1, 2, {"a"=>3.141}, false, true, nil, 4..10] +</pre> +<p> +<a href="JSON.html#M000026">JSON.generate</a> always creates the shortest +possible string representation of a ruby data structure in one line. This +is good for data storage or network protocols, but not so good for humans +to read. Fortunately there’s also <a +href="JSON.html#M000028">JSON.pretty_generate</a> (or <a +href="JSON.html#M000028">JSON.pretty_generate</a>) that creates a more +readable output: +</p> +<pre> + puts JSON.pretty_generate([1, 2, {"a"=>3.141}, false, true, nil, 4..10]) + [ + 1, + 2, + { + "a": 3.141 + }, + false, + true, + null, + { + "json_class": "Range", + "data": [ + 4, + 10, + false + ] + } + ] +</pre> +<p> +There are also the methods <a href="Kernel.html#M000036">Kernel#j</a> for +generate, and <a href="Kernel.html#M000037">Kernel#jj</a> for +pretty_generate output to the console, that work analogous to Core +Ruby’s p and the pp library’s pp methods. +</p> +<p> +The script tools/server.rb contains a small example if you want to test, +how receiving a <a href="JSON.html">JSON</a> object from a webrick server +in your browser with the javasript prototype library <a +href="http://www.prototypejs.org">www.prototypejs.org</a> works. +</p> +<h3>Speed Comparisons</h3> +<p> +I have created some benchmark results (see the benchmarks/data-p4-3Ghz +subdir of the package) for the JSON-parser to estimate the speed up in the +C extension: +</p> +<pre> + Comparing times (call_time_mean): + 1 ParserBenchmarkExt#parser 900 repeats: + 553.922304770 ( real) -> 21.500x + 0.001805307 + 2 ParserBenchmarkYAML#parser 1000 repeats: + 224.513358139 ( real) -> 8.714x + 0.004454078 + 3 ParserBenchmarkPure#parser 1000 repeats: + 26.755020642 ( real) -> 1.038x + 0.037376163 + 4 ParserBenchmarkRails#parser 1000 repeats: + 25.763381731 ( real) -> 1.000x + 0.038814780 + calls/sec ( time) -> speed covers + secs/call +</pre> +<p> +In the table above 1 is <a +href="JSON/Ext/Parser.html">JSON::Ext::Parser</a>, 2 is YAML.load with YAML +compatbile <a href="JSON.html">JSON</a> document, 3 is is <a +href="JSON/Pure/Parser.html">JSON::Pure::Parser</a>, and 4 is +ActiveSupport::JSON.decode. The ActiveSupport JSON-decoder converts the +input first to YAML and then uses the YAML-parser, the conversion seems to +slow it down so much that it is only as fast as the <a +href="JSON/Pure/Parser.html">JSON::Pure::Parser</a>! +</p> +<p> +If you look at the benchmark data you can see that this is mostly caused by +the frequent high outliers - the median of the Rails-parser runs is still +overall smaller than the median of the <a +href="JSON/Pure/Parser.html">JSON::Pure::Parser</a> runs: +</p> +<pre> + Comparing times (call_time_median): + 1 ParserBenchmarkExt#parser 900 repeats: + 800.592479481 ( real) -> 26.936x + 0.001249075 + 2 ParserBenchmarkYAML#parser 1000 repeats: + 271.002390644 ( real) -> 9.118x + 0.003690004 + 3 ParserBenchmarkRails#parser 1000 repeats: + 30.227910865 ( real) -> 1.017x + 0.033082008 + 4 ParserBenchmarkPure#parser 1000 repeats: + 29.722384421 ( real) -> 1.000x + 0.033644676 + calls/sec ( time) -> speed covers + secs/call +</pre> +<p> +I have benchmarked the JSON-Generator as well. This generated a few more +values, because there are different modes that also influence the achieved +speed: +</p> +<pre> + Comparing times (call_time_mean): + 1 GeneratorBenchmarkExt#generator_fast 1000 repeats: + 547.354332608 ( real) -> 15.090x + 0.001826970 + 2 GeneratorBenchmarkExt#generator_safe 1000 repeats: + 443.968212317 ( real) -> 12.240x + 0.002252414 + 3 GeneratorBenchmarkExt#generator_pretty 900 repeats: + 375.104545883 ( real) -> 10.341x + 0.002665923 + 4 GeneratorBenchmarkPure#generator_fast 1000 repeats: + 49.978706968 ( real) -> 1.378x + 0.020008521 + 5 GeneratorBenchmarkRails#generator 1000 repeats: + 38.531868759 ( real) -> 1.062x + 0.025952543 + 6 GeneratorBenchmarkPure#generator_safe 1000 repeats: + 36.927649925 ( real) -> 1.018x 7 (>=3859) + 0.027079979 + 7 GeneratorBenchmarkPure#generator_pretty 1000 repeats: + 36.272134441 ( real) -> 1.000x 6 (>=3859) + 0.027569373 + calls/sec ( time) -> speed covers + secs/call +</pre> +<p> +In the table above 1-3 are <a +href="JSON/Ext/Generator.html">JSON::Ext::Generator</a> methods. 4, 6, and +7 are <a href="JSON/Pure/Generator.html">JSON::Pure::Generator</a> methods +and 5 is the Rails <a href="JSON.html">JSON</a> generator. It is now a bit +faster than the generator_safe and generator_pretty methods of the pure +variant but slower than the others. +</p> +<p> +To achieve the fastest <a href="JSON.html">JSON</a> document output, you +can use the fast_generate method. Beware, that this will disable the +checking for circular Ruby data structures, which may cause <a +href="JSON.html">JSON</a> to go into an infinite loop. +</p> +<p> +Here are the median comparisons for completeness’ sake: +</p> +<pre> + Comparing times (call_time_median): + 1 GeneratorBenchmarkExt#generator_fast 1000 repeats: + 708.258020939 ( real) -> 16.547x + 0.001411915 + 2 GeneratorBenchmarkExt#generator_safe 1000 repeats: + 569.105020353 ( real) -> 13.296x + 0.001757145 + 3 GeneratorBenchmarkExt#generator_pretty 900 repeats: + 482.825371244 ( real) -> 11.280x + 0.002071142 + 4 GeneratorBenchmarkPure#generator_fast 1000 repeats: + 62.717626652 ( real) -> 1.465x + 0.015944481 + 5 GeneratorBenchmarkRails#generator 1000 repeats: + 43.965681162 ( real) -> 1.027x + 0.022745013 + 6 GeneratorBenchmarkPure#generator_safe 1000 repeats: + 43.929073409 ( real) -> 1.026x 7 (>=3859) + 0.022763968 + 7 GeneratorBenchmarkPure#generator_pretty 1000 repeats: + 42.802514491 ( real) -> 1.000x 6 (>=3859) + 0.023363113 + calls/sec ( time) -> speed covers + secs/call +</pre> +<h3>Author</h3> +<p> +Florian Frank <<a href="mailto:flori@ping.de">flori@ping.de</a>> +</p> +<h3>License</h3> +<p> +Ruby License, see the COPYING file included in the source distribution. The +Ruby License includes the GNU General Public License (GPL), Version 2, so +see the file GPL as well. +</p> +<h3>Download</h3> +<p> +The latest version of this library can be downloaded at +</p> +<ul> +<li><a +href="http://rubyforge.org/frs?group_id=953">rubyforge.org/frs?group_id=953</a> + +</li> +</ul> +<p> +Online Documentation should be located at +</p> +<ul> +<li><a href="http://json.rubyforge.org">json.rubyforge.org</a> + +</li> +</ul> + + </div> + + <div id="validator-badges"> + <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p> + <p><small>Generated with the <a href="http://deveiate.org/projects/Darkfish-Rdoc/">Darkfish + Rdoc Generator</a> 1.1.6</small>.</p> + </div> +</body> +</html> + |