diff --git a/website/.well-known/genid/index.html b/website/.well-known/genid/index.html new file mode 100644 index 0000000..931619f --- /dev/null +++ b/website/.well-known/genid/index.html @@ -0,0 +1,4 @@ +@prefix dc: . +@prefix rdfs: . + dc:creator . + rdfs:seeAlso . diff --git a/website/;/index.html b/website/;/index.html new file mode 100644 index 0000000..d29d411 --- /dev/null +++ b/website/;/index.html @@ -0,0 +1,7 @@ + + +404 Not Found + +

Not Found

+

The requested URL /; was not found on this server.

+ diff --git a/website/a/index.html b/website/a/index.html new file mode 100644 index 0000000..d17ab67 --- /dev/null +++ b/website/a/index.html @@ -0,0 +1,7 @@ + + +404 Not Found + +

Not Found

+

The requested URL /a was not found on this server.

+ diff --git a/website/about/index.html b/website/about/index.html new file mode 100644 index 0000000..f47eecb --- /dev/null +++ b/website/about/index.html @@ -0,0 +1,72 @@ + + + + + + 4store - About + + + + + +
+
4store
+
+

About 4store

+

4store is a database storage and query engine that holds RDF data. It has been used by Garlik as their primary RDF platform for three years, and has proved itself to be robust and secure.

+

4store's main strengths are its performance, scalability and stability. +It does not provide many features over and above RDF storage and SPARQL +queries, but if your are looking for a scalable, secure, fast and efficient RDF store, +then 4store should be on your shortlist.

+

License

+

4store is available under the GNU General Public Licence, version 3.

+

Platform

+

It is written in ANSI C99, and designed to run on UNIX-like systems.

+

4store is optimised to run on shared–nothing clusters of up to 32 nodes, linked with gigabit Ethernet. However, it will also work on single machines, if your data requirements are not large.

+

Portability

+

4store is primarily intended to run on Linux platforms, but it is known to work on single Mac OS X machines. It depends on the Avahi multicast DNS library for its clustering support, which is not easily available on Mac OS X.

+

Performance

+

When configured as a cluster, import performances of 120 kT/s are easily achievable. Query times for relatively simple queries are often in the low milliseconds, even over the standard HTTP SPARQL protocol.

+

Security

+

Some of the features commonly found in RDF stores pose security risks +when deployed inside typical enterprise computing environments. Significant +effort has gone into ensuring that 4store does not pose a risk by being a +vector for relay or amplification attacks.

+
+
+
+
Summary
+
+
    +
  • Free software (GPL v3)
  • +
  • Scalable
  • +
  • Secure
  • +
  • Fast
  • +
  • Robust
  • +
+
+
+
+ + +
+ + diff --git a/website/contact/index.html b/website/contact/index.html new file mode 100644 index 0000000..dd5eb3e --- /dev/null +++ b/website/contact/index.html @@ -0,0 +1,51 @@ + + + + + + 4store - Contact Us + + + + + +
+
4store
+
+

Contact Us

+

Support Questions

+

Please direct support questions to the 4store mailing list or IRC channel.

+

If you have a support account, contact us via the email address supplied for expedited support.

+

Licencing and Consultancy Questions

+

We're happy to offer support and consulting services to organisations that want to make use of 4store.

+

If you have any questions in this area, please contact Steve Harris directly at .

+

Talks and Technical Information

+

Also feel free to contact Steve on if you want him to speak about 4store, Garlik's use of Semantic Web technologies in general, or would like technical information about the design of 4store.

+

Microblog

+

We have feeds on Identi.ca and Twitter. Currently these are used to show commits to the Git repository.

+
+
+
+ + +
+ + diff --git a/website/developers/index.html b/website/developers/index.html new file mode 100644 index 0000000..382e8d7 --- /dev/null +++ b/website/developers/index.html @@ -0,0 +1,55 @@ + + + + + + 4store - Developers + + + + + +
+
4store
+
+

Developers

+

History

+

4store was designed by Steve Harris at Garlik from 2006 onwards. The original design brief was a RDF store to hold one billion triples, an ambitious goal at that time. The final system was capable of holding 10+ billion triples, and has been a core part of the Garlik infrastructure ever since. Steve can be contacted at if you have any questions about the design.

+

4store was primarily developed by Steve Harris and Nick Lamb. Nick did the work on the clustering infrastructure, HTTP server and protocol. Steve mainly worked on the query engine and low-level index storage code.

+

4store is the logical successor to 3store, though it shares no code or design in common. For it's time, 3store was considered scalable (around 50MT was achievable on a single server in 2002).

+

Contributing

+

If you would like to contribute work to 4store, please contact the developers on the mailing list for advice, or look at the TODO list.

+
+
+
+
Semantic Web
+
The Semantic Web is an evolving extension of the World Wide Web in which the semantics of information and services on the web is defined, making it possible for the web to understand and satisfy the requests of people and machines to use the web content. [read more]
+
RDF
+
RDF is a data language used to express triples, expressing the data underlying the Semantic Web. [read more]
+
SPARQL
+
SPARQL is a RDF Query Language, a key Semantic Web technology. 4store uses SPARQL and the SPARQL Protocol for access to all it's internal data. [read more]
+
+
+ + +
+ + diff --git a/website/doap.rdf b/website/doap.rdf new file mode 100644 index 0000000..f739c3a --- /dev/null +++ b/website/doap.rdf @@ -0,0 +1,40 @@ + + 4store + 4store + RDF/SPARQL store + A scalable, cluster-capable RDF/SPARQL store written in C, designed for UNIX-like operating systems. + + + Linux + Mac OS X + UNIX + C + + + + Steve Harris + + 26a374ad4de937252c044f7dd45aa48ecbdb4f16 + + + + + Nick Lamb + + e602382c17fcef66132630ca26476e427b1c33fe + + + + + Mischa Tuffield + + 01561a512d2a2e067b70ad9d0ea8b28d73cd9ed7 + + + + + + + + + diff --git a/website/doap.ttl b/website/doap.ttl new file mode 100644 index 0000000..4710aa2 --- /dev/null +++ b/website/doap.ttl @@ -0,0 +1,37 @@ +@prefix : . +@prefix foaf: . + +[] + a :Project; + :name "4store"; + :shortname "4store"; + :shortdesc "RDF/SPARQL store"; + :description "A scalable, cluster-capable RDF/SPARQL store written in C, designed for UNIX-like operating systems."; + :homepage ; + :download-page ; + :os "Linux", "Mac OS X", "UNIX"; + :programming-language "C"; + :license ; + :maintainer [ + a foaf:Person; + foaf:name "Steve Harris"; + foaf:homepage ; + foaf:mbox_sha1sum "26a374ad4de937252c044f7dd45aa48ecbdb4f16" + ]; + :developer [ + a foaf:Person; + foaf:name "Nick Lamb"; + foaf:homepage ; + foaf:mbox_sha1sum "e602382c17fcef66132630ca26476e427b1c33fe" + ]; + :helper [ + a foaf:Person; + foaf:name "Mischa Tuffield"; + foaf:homepage ; + foaf:mbox_sha1sum "01561a512d2a2e067b70ad9d0ea8b28d73cd9ed7" + ]; + :repository [ + a :GitRepository; + :browse ; + :location + ] . diff --git a/website/download/4store-v0.9.1.tar.gz b/website/download/4store-v0.9.1.tar.gz new file mode 100644 index 0000000..ea1763c Binary files /dev/null and b/website/download/4store-v0.9.1.tar.gz differ diff --git a/website/download/4store-v0.9.2.tar.gz b/website/download/4store-v0.9.2.tar.gz new file mode 100644 index 0000000..d9c7bad Binary files /dev/null and b/website/download/4store-v0.9.2.tar.gz differ diff --git a/website/download/4store-v0.9.3.tar.gz b/website/download/4store-v0.9.3.tar.gz new file mode 100644 index 0000000..0b4c511 Binary files /dev/null and b/website/download/4store-v0.9.3.tar.gz differ diff --git a/website/download/4store-v0.9.4.tar.gz b/website/download/4store-v0.9.4.tar.gz new file mode 100644 index 0000000..e0cf735 Binary files /dev/null and b/website/download/4store-v0.9.4.tar.gz differ diff --git a/website/download/4store-v0.9.5.tar.gz b/website/download/4store-v0.9.5.tar.gz new file mode 100644 index 0000000..79d788a Binary files /dev/null and b/website/download/4store-v0.9.5.tar.gz differ diff --git a/website/download/4store-v0.9.6.tar.gz b/website/download/4store-v0.9.6.tar.gz new file mode 100644 index 0000000..4159604 Binary files /dev/null and b/website/download/4store-v0.9.6.tar.gz differ diff --git a/website/download/4store-v0.9.7.tar.gz b/website/download/4store-v0.9.7.tar.gz new file mode 100644 index 0000000..701a535 Binary files /dev/null and b/website/download/4store-v0.9.7.tar.gz differ diff --git a/website/download/4store-v0.9.8.tar.gz b/website/download/4store-v0.9.8.tar.gz new file mode 100644 index 0000000..d4422c2 Binary files /dev/null and b/website/download/4store-v0.9.8.tar.gz differ diff --git a/website/download/4store-v1.0.0.tar.gz b/website/download/4store-v1.0.0.tar.gz new file mode 100644 index 0000000..2b7fa14 Binary files /dev/null and b/website/download/4store-v1.0.0.tar.gz differ diff --git a/website/download/4store-v1.0.2.tar.gz b/website/download/4store-v1.0.2.tar.gz new file mode 100644 index 0000000..c0f2a7b Binary files /dev/null and b/website/download/4store-v1.0.2.tar.gz differ diff --git a/website/download/4store-v1.0.3.tar.gz b/website/download/4store-v1.0.3.tar.gz new file mode 100644 index 0000000..1973ce8 Binary files /dev/null and b/website/download/4store-v1.0.3.tar.gz differ diff --git a/website/download/4store-v1.0.4.tar.gz b/website/download/4store-v1.0.4.tar.gz new file mode 100644 index 0000000..a89ba6a Binary files /dev/null and b/website/download/4store-v1.0.4.tar.gz differ diff --git a/website/download/4store-v1.0.5.tar.gz b/website/download/4store-v1.0.5.tar.gz new file mode 100644 index 0000000..ca17e5a Binary files /dev/null and b/website/download/4store-v1.0.5.tar.gz differ diff --git a/website/download/4store-v1.0.6.tar.gz b/website/download/4store-v1.0.6.tar.gz new file mode 100644 index 0000000..f1eee89 Binary files /dev/null and b/website/download/4store-v1.0.6.tar.gz differ diff --git a/website/download/4store-v1.1.0.tar.gz b/website/download/4store-v1.1.0.tar.gz new file mode 100644 index 0000000..6522cbf Binary files /dev/null and b/website/download/4store-v1.1.0.tar.gz differ diff --git a/website/download/4store-v1.1.1.tar.gz b/website/download/4store-v1.1.1.tar.gz new file mode 100644 index 0000000..1fd87fd Binary files /dev/null and b/website/download/4store-v1.1.1.tar.gz differ diff --git a/website/download/4store-v1.1.2.tar.gz b/website/download/4store-v1.1.2.tar.gz new file mode 100644 index 0000000..e5b6185 Binary files /dev/null and b/website/download/4store-v1.1.2.tar.gz differ diff --git a/website/download/4store-v1.1.3.tar.gz b/website/download/4store-v1.1.3.tar.gz new file mode 100644 index 0000000..c1c5f1f Binary files /dev/null and b/website/download/4store-v1.1.3.tar.gz differ diff --git a/website/download/4store-v1.1.4.tar.gz b/website/download/4store-v1.1.4.tar.gz new file mode 100644 index 0000000..942325f Binary files /dev/null and b/website/download/4store-v1.1.4.tar.gz differ diff --git a/website/download/4store-v1.1.5.tar.gz b/website/download/4store-v1.1.5.tar.gz new file mode 100644 index 0000000..e1d9bb6 Binary files /dev/null and b/website/download/4store-v1.1.5.tar.gz differ diff --git a/website/download/index.html b/website/download/index.html new file mode 100644 index 0000000..ede5284 --- /dev/null +++ b/website/download/index.html @@ -0,0 +1,34 @@ + + + + Index of /download + + +

Index of /download

+ + + + + + + + + + + + + + + + + + + + + + + + + +
[ICO]NameLast modifiedSizeDescription

[DIR]Parent Directory  -  
[   ]4store-v0.9.1.tar.gz16-Jul-2009 13:49 5.1M 
[   ]4store-v0.9.2.tar.gz14-Jul-2009 10:20 5.1M 
[   ]4store-v0.9.3.tar.gz16-Jul-2009 13:49 5.1M 
[   ]4store-v0.9.4.tar.gz23-Jul-2009 22:10 5.1M 
[   ]4store-v0.9.5.tar.gz31-Jul-2009 13:04 5.3M 
[   ]4store-v0.9.6.tar.gz04-Sep-2009 16:36 5.2M 
[   ]4store-v0.9.7.tar.gz11-Sep-2009 11:18 5.2M 
[   ]4store-v0.9.8.tar.gz17-Sep-2009 15:00 5.2M 
[   ]4store-v1.0.0.tar.gz17-Oct-2009 21:05 5.2M 
[   ]4store-v1.0.2.tar.gz24-Nov-2009 18:23 5.5M 
[   ]4store-v1.0.3.tar.gz15-Feb-2010 17:43 5.5M 
[   ]4store-v1.0.4.tar.gz10-Sep-2010 13:10 5.3M 
[   ]4store-v1.0.5.tar.gz18-Nov-2010 14:49 5.1M 
[   ]4store-v1.0.6.tar.gz18-Jan-2011 21:56 5.1M 
[   ]4store-v1.1.0.tar.gz18-Jan-2011 22:50 5.1M 
[   ]4store-v1.1.1.tar.gz31-Jan-2011 12:28 5.1M 
[   ]4store-v1.1.2.tar.gz16-Feb-2011 11:24 5.1M 
[   ]4store-v1.1.3.tar.gz06-May-2011 14:17 5.3M 
[   ]4store-v1.1.4.tar.gz20-Sep-2011 21:59 5.3M 
[   ]4store-v1.1.5.tar.gz10-Jul-2012 16:51 5.3M 
[DIR]linux/18-Feb-2011 17:36 -  
[DIR]macosx/10-Jul-2012 16:58 -  

+ diff --git a/website/download/linux/centos5/4store-v1.1.2-1.x86_64.rpm b/website/download/linux/centos5/4store-v1.1.2-1.x86_64.rpm new file mode 100644 index 0000000..2391a2b Binary files /dev/null and b/website/download/linux/centos5/4store-v1.1.2-1.x86_64.rpm differ diff --git a/website/download/linux/centos5/gmp-4.3.1-5.x86_64.rpm b/website/download/linux/centos5/gmp-4.3.1-5.x86_64.rpm new file mode 100644 index 0000000..216080f Binary files /dev/null and b/website/download/linux/centos5/gmp-4.3.1-5.x86_64.rpm differ diff --git a/website/download/linux/centos5/gmp-devel-4.3.1-5.x86_64.rpm b/website/download/linux/centos5/gmp-devel-4.3.1-5.x86_64.rpm new file mode 100644 index 0000000..b290b12 Binary files /dev/null and b/website/download/linux/centos5/gmp-devel-4.3.1-5.x86_64.rpm differ diff --git a/website/download/linux/centos5/gmp-static-4.3.1-5.x86_64.rpm b/website/download/linux/centos5/gmp-static-4.3.1-5.x86_64.rpm new file mode 100644 index 0000000..73c8387 Binary files /dev/null and b/website/download/linux/centos5/gmp-static-4.3.1-5.x86_64.rpm differ diff --git a/website/download/linux/centos5/index.html b/website/download/linux/centos5/index.html new file mode 100644 index 0000000..c63faeb --- /dev/null +++ b/website/download/linux/centos5/index.html @@ -0,0 +1,22 @@ + + + + Index of /download/linux/centos5 + + +

Index of /download/linux/centos5

+ + + + + + + + + + + + + +
[ICO]NameLast modifiedSizeDescription

[DIR]Parent Directory  -  
[   ]4store-v1.1.2-1.x86_64.rpm18-Feb-2011 17:35 1.0M 
[   ]gmp-4.3.1-5.x86_64.rpm18-Feb-2011 17:43 737K 
[   ]gmp-devel-4.3.1-5.x86_64.rpm18-Feb-2011 17:43 175K 
[   ]gmp-static-4.3.1-5.x86_64.rpm18-Feb-2011 17:43 355K 
[   ]mpfr-2.4.1-1.x86_64.rpm18-Feb-2011 17:42 371K 
[   ]mpfr-devel-2.4.1-1.x86_64.rpm18-Feb-2011 17:41 54K 
[   ]raptor2-2.0.0-0.x86_64.rpm18-Feb-2011 17:40 580K 
[   ]raptor2-devel-2.0.0-0.x86_64.rpm18-Feb-2011 17:40 173K 
[   ]rasqal-0.9.24-1.x86_64.rpm18-Feb-2011 17:35 592K 
[   ]rasqal-devel-0.9.24-1.x86_64.rpm18-Feb-2011 17:35 333K 

+ diff --git a/website/download/linux/centos5/mpfr-2.4.1-1.x86_64.rpm b/website/download/linux/centos5/mpfr-2.4.1-1.x86_64.rpm new file mode 100644 index 0000000..0630c06 Binary files /dev/null and b/website/download/linux/centos5/mpfr-2.4.1-1.x86_64.rpm differ diff --git a/website/download/linux/centos5/mpfr-devel-2.4.1-1.x86_64.rpm b/website/download/linux/centos5/mpfr-devel-2.4.1-1.x86_64.rpm new file mode 100644 index 0000000..9a8935a Binary files /dev/null and b/website/download/linux/centos5/mpfr-devel-2.4.1-1.x86_64.rpm differ diff --git a/website/download/linux/centos5/raptor2-2.0.0-0.x86_64.rpm b/website/download/linux/centos5/raptor2-2.0.0-0.x86_64.rpm new file mode 100644 index 0000000..5b0ba39 Binary files /dev/null and b/website/download/linux/centos5/raptor2-2.0.0-0.x86_64.rpm differ diff --git a/website/download/linux/centos5/raptor2-devel-2.0.0-0.x86_64.rpm b/website/download/linux/centos5/raptor2-devel-2.0.0-0.x86_64.rpm new file mode 100644 index 0000000..1a76325 Binary files /dev/null and b/website/download/linux/centos5/raptor2-devel-2.0.0-0.x86_64.rpm differ diff --git a/website/download/linux/centos5/rasqal-0.9.24-1.x86_64.rpm b/website/download/linux/centos5/rasqal-0.9.24-1.x86_64.rpm new file mode 100644 index 0000000..9a0e8fe Binary files /dev/null and b/website/download/linux/centos5/rasqal-0.9.24-1.x86_64.rpm differ diff --git a/website/download/linux/centos5/rasqal-devel-0.9.24-1.x86_64.rpm b/website/download/linux/centos5/rasqal-devel-0.9.24-1.x86_64.rpm new file mode 100644 index 0000000..1ee9257 Binary files /dev/null and b/website/download/linux/centos5/rasqal-devel-0.9.24-1.x86_64.rpm differ diff --git a/website/download/linux/index.html b/website/download/linux/index.html new file mode 100644 index 0000000..33ca368 --- /dev/null +++ b/website/download/linux/index.html @@ -0,0 +1,13 @@ + + + + Index of /download/linux + + +

Index of /download/linux

+ + + + +
[ICO]NameLast modifiedSizeDescription

[DIR]Parent Directory  -  
[DIR]centos5/18-Feb-2011 17:43 -  

+ diff --git a/website/download/macosx/4store-0.9.6.dmg b/website/download/macosx/4store-0.9.6.dmg new file mode 100644 index 0000000..eb66d07 Binary files /dev/null and b/website/download/macosx/4store-0.9.6.dmg differ diff --git a/website/download/macosx/4store-0.9.7.dmg b/website/download/macosx/4store-0.9.7.dmg new file mode 100644 index 0000000..d2b9e86 Binary files /dev/null and b/website/download/macosx/4store-0.9.7.dmg differ diff --git a/website/download/macosx/4store-0.9.8.dmg b/website/download/macosx/4store-0.9.8.dmg new file mode 100644 index 0000000..0ec7295 Binary files /dev/null and b/website/download/macosx/4store-0.9.8.dmg differ diff --git a/website/download/macosx/4store-1.0.0.dmg b/website/download/macosx/4store-1.0.0.dmg new file mode 100644 index 0000000..192981d Binary files /dev/null and b/website/download/macosx/4store-1.0.0.dmg differ diff --git a/website/download/macosx/4store-1.0.2.dmg b/website/download/macosx/4store-1.0.2.dmg new file mode 100644 index 0000000..3e7d346 Binary files /dev/null and b/website/download/macosx/4store-1.0.2.dmg differ diff --git a/website/download/macosx/4store-1.0.3.dmg b/website/download/macosx/4store-1.0.3.dmg new file mode 100644 index 0000000..577745f Binary files /dev/null and b/website/download/macosx/4store-1.0.3.dmg differ diff --git a/website/download/macosx/4store-1.0.4.dmg b/website/download/macosx/4store-1.0.4.dmg new file mode 100644 index 0000000..11e721a Binary files /dev/null and b/website/download/macosx/4store-1.0.4.dmg differ diff --git a/website/download/macosx/4store-1.0.5.dmg b/website/download/macosx/4store-1.0.5.dmg new file mode 100644 index 0000000..54449fa Binary files /dev/null and b/website/download/macosx/4store-1.0.5.dmg differ diff --git a/website/download/macosx/4store-1.1.0.dmg b/website/download/macosx/4store-1.1.0.dmg new file mode 100644 index 0000000..553ec0d Binary files /dev/null and b/website/download/macosx/4store-1.1.0.dmg differ diff --git a/website/download/macosx/4store-1.1.1.dmg b/website/download/macosx/4store-1.1.1.dmg new file mode 100644 index 0000000..f954f0a Binary files /dev/null and b/website/download/macosx/4store-1.1.1.dmg differ diff --git a/website/download/macosx/4store-1.1.3.dmg b/website/download/macosx/4store-1.1.3.dmg new file mode 100644 index 0000000..d5aa02d Binary files /dev/null and b/website/download/macosx/4store-1.1.3.dmg differ diff --git a/website/download/macosx/4store-1.1.4-beta1.dmg b/website/download/macosx/4store-1.1.4-beta1.dmg new file mode 100644 index 0000000..eae4c2b Binary files /dev/null and b/website/download/macosx/4store-1.1.4-beta1.dmg differ diff --git a/website/download/macosx/4store-1.1.4.dmg b/website/download/macosx/4store-1.1.4.dmg new file mode 100644 index 0000000..d8396f8 Binary files /dev/null and b/website/download/macosx/4store-1.1.4.dmg differ diff --git a/website/download/macosx/4store-1.1.5.dmg b/website/download/macosx/4store-1.1.5.dmg new file mode 100644 index 0000000..8122c08 Binary files /dev/null and b/website/download/macosx/4store-1.1.5.dmg differ diff --git a/website/download/macosx/index.html b/website/download/macosx/index.html new file mode 100644 index 0000000..3a552e6 --- /dev/null +++ b/website/download/macosx/index.html @@ -0,0 +1,26 @@ + + + + Index of /download/macosx + + +

Index of /download/macosx

+ + + + + + + + + + + + + + + + + +
[ICO]NameLast modifiedSizeDescription

[DIR]Parent Directory  -  
[   ]4store-0.9.6.dmg04-Sep-2009 17:44 7.1M 
[   ]4store-0.9.7.dmg11-Sep-2009 13:45 7.4M 
[   ]4store-0.9.8.dmg17-Sep-2009 15:12 7.4M 
[   ]4store-1.0.0.dmg17-Oct-2009 21:05 7.4M 
[   ]4store-1.0.2.dmg24-Nov-2009 18:27 7.4M 
[   ]4store-1.0.3.dmg15-Feb-2010 17:43 7.6M 
[   ]4store-1.0.4.dmg10-Sep-2010 13:12 7.9M 
[   ]4store-1.0.5.dmg18-Nov-2010 14:51 6.1M 
[   ]4store-1.1.0.dmg18-Jan-2011 23:04 5.9M 
[   ]4store-1.1.1.dmg31-Jan-2011 12:47 5.9M 
[   ]4store-1.1.3.dmg06-May-2011 14:36 6.0M 
[   ]4store-1.1.4-beta1.dmg19-Sep-2011 22:47 13M 
[   ]4store-1.1.4.dmg05-Jan-2012 11:52 14M 
[   ]4store-1.1.5.dmg10-Jul-2012 17:01 15M 

+ diff --git a/website/faqs/index.html b/website/faqs/index.html new file mode 100644 index 0000000..36442fd --- /dev/null +++ b/website/faqs/index.html @@ -0,0 +1,78 @@ + + + + + + 4store - FAQs + + + + + +
+
4store
+
+

Frequently Asked Questions

+

A bit bare at the moment, but we'll update this based on mailing list and IRC conversations.

+
+
Q: Why use 4store?
+
There are many other RDF stores available, but 4store is one of the +few that has been proven in a secure, production enterprise environment. It +occupies the “Big Dumb Triplestore” space, with few features, but good +performance, and being very simple to use, once installed.
+
4store was designed to handle loads of 1GT and up, stored on small clusters of generic multi-core 64bit x86 servers, but is also capable of handling smaller datasets running on a single server.
+
Q: How many triples can 4store hold?
+
It really depends on how complex the data is, and how fast you want it to be.
+
In Garlik, the largest production system we've run is a cluster of 9 machines, with 8GB of RAM each, holding 15GT in total. At that size performance isn't at it's peak, but it was more than adequate for our application. With more RAM it would have run at full speed.
+
Due to the storage algorithms used there is the possibility of hash collisions are large sizes, the risk becomes significiant as the number of unique resources (c.f. 4s-size) approaches 10 billion, this is typically around the 50-70GT mark.
+
Q: Why did Garlik decide to release 4store under an Open Source licence?
+
Though still very capable, 4store is no longer Garlik's primary RDF store. It still works well in scales up to around 10 billion triples, and has a sophisitacted query optimiser by SPARQL standards. We would like to make RDF deployments in large organisations and coporate environments easier, so to that end we decided to release 4store under the GPL licence.
+
The replacement for 4store is called 5store, it's not available under a open source licence, but we are willing to commercially licence it to 3rd parties.
+
Q: What software do I need?
+
It's easiest to install on Linux systems, we recommend CentOS 5 or +newer, RedHat Enterprise 5+, or Fedora Core. But it's known to work fine on +Ubuntu, Debian and Gentoo distributions. We only have experience of running it on RedHat derived +systems though.
+
Other than things provided by the OS (Ubuntu has Raptor and Rasqal as debs), you'll need Dave Beckett's Raptor and Rasqal libraries.
+
Q: I get “ld: duplicate symbol _g_bit_nth_lsf” when trying to build backend.o and server.o on Mac OS X
+
This is due to a bug in GLib, you can fix it by replacing the block of macros that refer to G_INLINE_FUNC with:
+
#define G_INLINE_FUNC static inline
+
in .../glib-2.0/glib/gutils.h
+
Q: My build fails with a compiler error concerning the symbol 'wrong_glib_headers' e.g. results.c:27: error: size of array ‘wrong_glib_headers’ is too large
+
This indicates that you are trying to use the 32-bit glib2 headers to compile 4store against 64-bit libraries. Check that you have the 64-bit development package for glib2 installed, and that your PKG_CONFIG_PATH is set appropriately.
+
+
+ + + +
+ + diff --git a/website/favicon.ico b/website/favicon.ico new file mode 100644 index 0000000..e69de29 diff --git a/website/garlik.com%3fsubject=4store b/website/garlik.com%3fsubject=4store new file mode 100644 index 0000000..d6ffbb0 --- /dev/null +++ b/website/garlik.com%3fsubject=4store @@ -0,0 +1,9 @@ + + +404 Not Found + +

Not Found

+

The requested URL /garlik.com was not found on this server.

+
+
Apache/2.2.3 (CentOS) Server at 4store.org Port 80
+ diff --git a/website/icons/back.gif b/website/icons/back.gif new file mode 100644 index 0000000..a694ae1 Binary files /dev/null and b/website/icons/back.gif differ diff --git a/website/icons/blank.gif b/website/icons/blank.gif new file mode 100644 index 0000000..0ccf01e Binary files /dev/null and b/website/icons/blank.gif differ diff --git a/website/icons/compressed.gif b/website/icons/compressed.gif new file mode 100644 index 0000000..39e7327 Binary files /dev/null and b/website/icons/compressed.gif differ diff --git a/website/icons/folder.gif b/website/icons/folder.gif new file mode 100644 index 0000000..4826460 Binary files /dev/null and b/website/icons/folder.gif differ diff --git a/website/icons/unknown.gif b/website/icons/unknown.gif new file mode 100644 index 0000000..32b1ea2 Binary files /dev/null and b/website/icons/unknown.gif differ diff --git a/website/images/4store.png b/website/images/4store.png new file mode 100644 index 0000000..044057b Binary files /dev/null and b/website/images/4store.png differ diff --git a/website/images/buttons/btn-signin-down.png b/website/images/buttons/btn-signin-down.png new file mode 100644 index 0000000..1140f94 --- /dev/null +++ b/website/images/buttons/btn-signin-down.png @@ -0,0 +1,9 @@ + + +404 Not Found + +

Not Found

+

The requested URL /images/buttons/btn-signin-down.png was not found on this server.

+
+
Apache/2.2.3 (CentOS) Server at 4store.org Port 80
+ diff --git a/website/images/buttons/btn-signin-over.png b/website/images/buttons/btn-signin-over.png new file mode 100644 index 0000000..911a469 --- /dev/null +++ b/website/images/buttons/btn-signin-over.png @@ -0,0 +1,9 @@ + + +404 Not Found + +

Not Found

+

The requested URL /images/buttons/btn-signin-over.png was not found on this server.

+
+
Apache/2.2.3 (CentOS) Server at 4store.org Port 80
+ diff --git a/website/images/email.png b/website/images/email.png new file mode 100644 index 0000000..68f6226 Binary files /dev/null and b/website/images/email.png differ diff --git a/website/images/favico.png b/website/images/favico.png new file mode 100644 index 0000000..ab18b8f Binary files /dev/null and b/website/images/favico.png differ diff --git a/website/images/favicon.png b/website/images/favicon.png new file mode 100644 index 0000000..9c895b4 --- /dev/null +++ b/website/images/favicon.png @@ -0,0 +1,7 @@ + + +404 Not Found + +

Not Found

+

The requested URL /images/favicon.png was not found on this server.

+ diff --git a/website/images/garlik.gif b/website/images/garlik.gif new file mode 100644 index 0000000..c5c8281 Binary files /dev/null and b/website/images/garlik.gif differ diff --git a/website/index.html b/website/index.html new file mode 100644 index 0000000..736cda8 --- /dev/null +++ b/website/index.html @@ -0,0 +1,106 @@ + + + + + + 4store - Scalable RDF storage + + + + + +
+
4store
+ +
+

4store, an efficient, scalable and stable RDF database

+

4store was designed by Steve Harris and developed at Garlik to underpin their Semantic Web applications. It has been providing the base platform for around 3 years. At times holding and running queries over databases of 15GT, supporting a Web application used by thousands of people.

+ + +
+ +
+
+
What makes 4store special?
+
Read about some of the features of 4store.
+
Download
+
Go to the download section.
+
Documentation
+
Read some documentation covering how to setup and use 4store.
+
4store in Use
+
Read about some projects that use 4store.
+
Contact Us
+
We'd really appreciate feedback on 4store, and there are a variety of ways to contact us.
+
+
+ + + +
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + diff --git a/website/presentations/qmul-2009-09-17/1.2em b/website/presentations/qmul-2009-09-17/1.2em new file mode 100644 index 0000000..e50697e --- /dev/null +++ b/website/presentations/qmul-2009-09-17/1.2em @@ -0,0 +1,9 @@ + + +404 Not Found + +

Not Found

+

The requested URL /presentations/qmul-2009-09-17/1.2em was not found on this server.

+
+
Apache/2.2.3 (CentOS) Server at 4store.org Port 80
+ diff --git a/website/presentations/qmul-2009-09-17/application/x-shockwave-flash/index.html b/website/presentations/qmul-2009-09-17/application/x-shockwave-flash/index.html new file mode 100644 index 0000000..7b4f55d --- /dev/null +++ b/website/presentations/qmul-2009-09-17/application/x-shockwave-flash/index.html @@ -0,0 +1,9 @@ + + +404 Not Found + +

Not Found

+

The requested URL /presentations/qmul-2009-09-17/application/x-shockwave-flash was not found on this server.

+
+
Apache/2.2.3 (CentOS) Server at 4store.org Port 80
+ diff --git a/website/presentations/qmul-2009-09-17/image/svg+xml/index.html b/website/presentations/qmul-2009-09-17/image/svg+xml/index.html new file mode 100644 index 0000000..57e3f77 --- /dev/null +++ b/website/presentations/qmul-2009-09-17/image/svg+xml/index.html @@ -0,0 +1,9 @@ + + +404 Not Found + +

Not Found

+

The requested URL /presentations/qmul-2009-09-17/image/svg+xml was not found on this server.

+
+
Apache/2.2.3 (CentOS) Server at 4store.org Port 80
+ diff --git a/website/presentations/qmul-2009-09-17/images/4s-size.png b/website/presentations/qmul-2009-09-17/images/4s-size.png new file mode 100644 index 0000000..3637428 Binary files /dev/null and b/website/presentations/qmul-2009-09-17/images/4s-size.png differ diff --git a/website/presentations/qmul-2009-09-17/images/cluster.png b/website/presentations/qmul-2009-09-17/images/cluster.png new file mode 100644 index 0000000..dc9b596 Binary files /dev/null and b/website/presentations/qmul-2009-09-17/images/cluster.png differ diff --git a/website/presentations/qmul-2009-09-17/images/fs_layout.png b/website/presentations/qmul-2009-09-17/images/fs_layout.png new file mode 100644 index 0000000..1b2e3a8 Binary files /dev/null and b/website/presentations/qmul-2009-09-17/images/fs_layout.png differ diff --git a/website/presentations/qmul-2009-09-17/images/ls-screenshot.png b/website/presentations/qmul-2009-09-17/images/ls-screenshot.png new file mode 100644 index 0000000..9c17987 Binary files /dev/null and b/website/presentations/qmul-2009-09-17/images/ls-screenshot.png differ diff --git a/website/presentations/qmul-2009-09-17/images/ptreedump-screenshot.png b/website/presentations/qmul-2009-09-17/images/ptreedump-screenshot.png new file mode 100644 index 0000000..4ec1a7b Binary files /dev/null and b/website/presentations/qmul-2009-09-17/images/ptreedump-screenshot.png differ diff --git a/website/presentations/qmul-2009-09-17/images/rhashdump-screenshot.png b/website/presentations/qmul-2009-09-17/images/rhashdump-screenshot.png new file mode 100644 index 0000000..85ff26e Binary files /dev/null and b/website/presentations/qmul-2009-09-17/images/rhashdump-screenshot.png differ diff --git a/website/presentations/qmul-2009-09-17/index.html b/website/presentations/qmul-2009-09-17/index.html new file mode 100644 index 0000000..4ee9685 --- /dev/null +++ b/website/presentations/qmul-2009-09-17/index.html @@ -0,0 +1,774 @@ + + + + +4store Tutorial + + + + + + + + +
+ +
+ + + +
+

4store Tutorial

+

Garlik Ltd.

+
    +
  • Steve Harris
  • +
  • Nick Lamb
  • +
  • Mischa Tuffield
  • +
  • Luke Wilson-Mawer
  • +
+

More info at 4store.org and
#4store on irc.freenode.net

+
+ +
+

Introduction

+

In this tutorial we plan to cover:

+
    +
  • Install and setup of 4store
  • +
  • Cluster configuration
  • +
  • Performance tips and tricks
  • +

    and maybe

    +
  • Diagnostics
  • +
+

Please interrupt if you have questions

+
We'll try and cover everything, but might have to skip a few things if we run out of time.
+
+ +
+

Setup - Requirements

+
    +
  • 64-bit for production
  • +
    • 4store uses memory mapping, limited address space
    + +
    • but 10s of millions of triples without
    +
  • Most tested on x86-64 with CentOS 5
  • +
  • RAM > CPU > disk
  • +
    • but remember to allow for raw RDF data
    +
  • ./configure
  • +
    • checks source code dependencies, not autoconf
    +
+
+ +
+

Setup - installation

+
    +
  • source install
  • +
    • (Hopefully binary packages are similar but easier)
    • +
    • /usr/local/lib(64) + ldconfig
    • +
    • /var/lib/4store
    • +
    +
  • Use a separate 4store user ?
  • +
    • Not essential, avoids permissions problems, alternative is chmod 777
    + +
    • 4s-httpd / 4s-query / 4s-import doesn't need access
    +
+
+ +
+

Setup - backend settings

+

4s-backend-setup ...

+
    +
  • 4s-backend-setup
  • +
  • --node 0
  • +
  • --cluster 1
  • +
  • --segments 16
  • +
  • --mirror
  • +
+

Security

+
    +
  • 4s-backend-setup --password sesame
  • +
  • Shared secret
  • +
  • Link is not encrypted
  • +
+
+ + + +
+

Clusters - Principles

+
    +
  • Fast local network
  • +
    • Low-latency, 100Mbit ok, Gbit better
    +
  • Same LAN for DNS-SD
  • +
    • Could go beyond LAN, but untested, performance would suffer on slow links
    +
  • High-bandwidth operations are unicast
  • +
    • So you don't need a smart (expensive) switch that groks multicast
    +
+
+ +
+

Clusters - Diagram

+

Cluster

+ +
+ +
+

Clusters - Tools

+
    +
  • SSH based - /etc/4s-cluster
  • +
  • operations initiated from 'master'
  • +
  • Public key infrastructure +
      +
    • manual (with Agent forwarding)
    • +
    • shosts
    • +
    • pre-seed keys to master or use DNSSEC
    • +
  • +
+
+ +
+

Clusters - Tools

+
    +
  • 4s-cluster-create
  • +
  • 4s-cluster-start
  • +
  • 4s-cluster-stop
  • +
  • 4s-cluster-destroy
  • +
+
+
    +
  • 4s-cluster-info
  • +
  • 4s-cluster-copy (must be quiescent)
  • +
+
+ +
+

Clusters - Practice

+ +
    +
  • Many identical installs so e.g. Kickstart
  • +
    • Building a reliable script is tricky, but once it works it is pretty reliable
    +
    • Try to avoid doing unattended installs until you're comfortable
    + +
+ +

Decisions

+
    +
  • DHCP? LLv4? (or IPv6)
  • +
  • DNS? mDNS? (want nss-mdns)
  • +
  • NFS? rsync? package updates
  • +
    NFS binary updating problem
    +
  • NIS?
  • +
    Maybe, if you already use it, but 4store user set up by Kickstart may be enough
    +
+
+ +
+

Clusters - Demo

+
    +
  • LLv4 + mDNS
  • +
    Same user on every machine - or something?
    +
    +

    Don't try this at home !

    +
    Protocol version compatibility, debug nightmare etc.
    + + +
+
+ + + + +
+

Filesystem Layout

+
    +
  • 4store places its data in : /var/lib/4store/
  • +
  • A directory is created for example KB present : /var/lib/4store/[KBNAME]/
  • +
+

ls of file system

+
+ +
+

Metadata turtle file (1)

+
    +
  • Can be found /var/lib/4store/library/metadata.nt
  • +
  • +
    +@base <file:///var/lib/4store/library/metadata.nt> .
    +@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
    +
    +<>
    +    <http://4store.org/metadata#bnode> "1" ;
    +    <http://4store.org/metadata#hash> "none" ;
    +    <http://4store.org/metadata#hash_function> "UMAC" ;
    +    <http://4store.org/metadata#kb_name> "library" ;
    +    <http://4store.org/metadata#model_data> "true" ;
    +    <http://4store.org/metadata#model_files> "false" ;
    +    <http://4store.org/metadata#num_segments> "2" ;
    +    <http://4store.org/metadata#salt> "0" ;
    +    <http://4store.org/metadata#segment_p> "0", "1" ;
    +    <http://4store.org/metadata#store_type> "native" ;
    +    <http://4store.org/metadata#version> "11" .
    +   
    +
  • +
+
+ +
+

Metadata turtle file (2)

+
    +
  • Where by these are the only important fields: +
       
    +    <http://4store.org/metadata#num_segments> "2" ;
    +    <http://4store.org/metadata#segment_p> "0", "1" ;
    +   
    +
  • +
  • These related to the directories below:
  • +
+

ls of file system

+ +
+ + +
+

Backup

+
    +
  • Single Node Instance: +
      +
    • 4s-file-backup [KB_NAME] > ~/something.tar.gz
    • +
    +
  • +
  • Clustered Instance: +
      +
    • 4s-cluster-file-backup
    • +
    • Creates a tar ball on a machine named backup (/etc/host) or .sshconfig which basically tar balls all of them to ~/4store/
    • +
    • 4store/$1.$node.$datestamp.tar.gz
    • +
    • Can cause problems if there are imports ongoing
    • +
    • Perl script which goes through, and writes out triples to one file per graph (this is safe with lots of importing going on -- a la qdos)
    • +
    • You can hand mangle directories in /var/lib/4store
    • +
    +
  • +
  • Could be done in a similar manner using rsync, should be very similar to 4s-cluster-file-backup script
  • +
+
+ +
+

Restoring

+
    +
  • Perl file method restore, very simple, parse file and reimport +
      +
    • HTTP Daemon
    • +
    • 4s-import (faster)
    • +
    +
  • +
  • Or grab and put the tar balls created back into /var/lib/4store/
  • +
+
+ +
+

Logging

+
    +
  • /var/log/messages (redhat flavoured linux), /var/log/system.log (mac), or whatever your syslogger is called
  • +
  • Give us log file output if possible, when creating a bug report
  • +
  • Query Logs: +
      +
    • /var/log/4store/query-[KB_NAME].log
    • +
    • -D stops the httpd from daemonising, and it runs to the terminal
    • +
    +
  • +
+
+ +
+

Percentage of free disk space

+
    +
  • Environment Variable : FS_DISK_LIMIT
  • +
  • Read by 4s-backend when when started
  • +
  • This allows sysadmin to dictate behaviour of 4store when machine starts running out of free disk space
  • +
+
+ + + + +
+

Importing Data

+
    +
  • RDF parsed using Raptor
  • +
    Any parser bugs that can be reproduced with rapper aren't our fault
    +
    Your raptor install may have more/ less format support
    +
  • e.g. RDF/XML, Turtle, N-triples, TriG
  • +
    Not all RDF formats are created equal
    +
  • performance varies by RDF format
  • +
    Parser CPU use limits import rate in many cases
    +
  • file size limit (2G) for Turtle family
  • +
    • but not N-Triples
    +
+
+ +
+

Import Methods

+
    +
  • "offline" command line tools
  • +
  • "online" HTTP
  • +
    Two methods with advantages / disadvantages
    +
+

Operations:

+
    +
  • insert / replace whole graph
  • +
  • add to existing graph
  • +
+
+ +
+

Import - command line

+

4s-import

+
    +
  • parser is local
  • +
    CPU intensive parsing
    +
  • can import from a URI by default
  • +
  • reassuring progress indication with -v
  • +

    BUT...

    +
  • exclusive lock of KB
  • +
    No query access to this KB during import
    +
+
+ +
+

Import - HTTP

+

PUT / POST

+
    +
  • somewhat standard
  • +
  • serialised, but no lock
  • +
    Queries can run in parallel
    +
  • parsed by 4s-httpd
  • +
    May want to transform to fastest RDF format
    +
  • poorer RDF error reporting
  • +
    Need and out-of-band process to diagnose RDF syntax errors
    +
  • safe default choice
  • +
+
+ +
+

Import - HTTP

+
    +
  • PUT uri (see HTTP spec) +
    • some HTTP libraries don't support this, so ...
  • +
  • PUT /data/uri-encode-graph
  • +
  • DELETE (urls as for PUT)
  • +
  • POST /data/ (add to existing graph)
  • +
  • POST /update/ (SPARUL : W3C member submission)
  • +
+
+ +
+

Import - SPARUL subset

+
    +
  • DROP and CLEAR (treated the same)
  • +
  • LOAD
  • +
  • LOAD INTO
  • +
+
+ +
+

Import - Client libraries

+

No need to roll your own

+
    +
  • Links from the 4store.org wiki
  • +
  • PHP, Python, and Ruby
  • +
  • also do SPARQL queries
  • +
+
+ + + + + +
+

Hash collisions

+
    +
  • Unique Resources 4billion ~ before collision becomes likely
  • +
  • Separate value spaces for both URIs and Literals
  • +
  • 4store likes storing bnodes, it can handle far more
  • +
  • This determines the upper limit of data which can be imported
  • +
+

4s-size output

+
+ +
+

RAM consumption, out of RAM effects.

+
    +
  • maxi-density ~64bytes per quad
  • +
  • du -hs /var/lib/4store/[KB_NAME] to get how much RAM is being used +
      +
    • This is the worst case, as indexes are not always all paged in
    • +
    +
  • +
  • When running out of RAM, queries become very slow, but import should be OK
  • +
  • If you are using 32bit and you go over 2gigs of indexes per segment it then goes bang
  • +
+
+ +
+

Quantity of predicates.

+
    +
  • For example, dbpedia 1.0 had loads of predicates, which becomes slow
  • +
  • dbpedia 3.1 has 49122 properties, but it is stressed that that is a lot for an ontology
  • +
  • This can cause problems with using operations that have to traverse all predicates or complex operations focused around predicates
  • +
  • Covered in detail in the Query Section
  • +
  • After 300 predicates steady drop off in performance, not problem unless you use lots of predicates in queries
  • +
+
+ + + +
+

Querying

+
    +
  • Two ways to issue queries:
  • +
      +
    • Using the 4s-query command line tool
    • +
    • Over HTTP using SPARQL protocol
    • +
    +
  • SPARQL is usually more efficient
  • +
  • Can connect to 4s-query as a pipeline (-P)
  • +
      +
    • More efficient for lots of small queries
    • +
    • Non-standard
    • +
    +
+
+ +
+

Result formats

+
    +
  • There are a handful of result formats
  • +
  • Can be chosen with 4s-query -f, Accept: header, or output CGI argument
  • +
  • In decreasing order of efficiency:
  • +
      +
    • Tab Separated (“text”, text/tab-separated-values)
    • +
    • JSON (“json”, application/sparql-results+json)
    • +
    • SPARQL XML (default, “sparql”, application/sparql-results+xml)
    • +
    +
+
+ +
+

Result formats — TSV

+
    +
  • Non-standard
  • +
  • Efficient to generate
  • +
  • Quick to parse
  • +
+
?x        ?y
+"foo"     "12"^^<http://www.w3.org/2000/10/XMLSchema#integer>
+"bar"@EN  <http://4store.org/>
+
+ +
+

Result formats — JSON

+ +
{"head":{"vars":["x","y"]},
+ "results": {
+  "bindings":[
+   {"x":{"type":"literal","value":"foo"},
+    "y":{"type":"literal","value":"12",
+         "datatype":"http://www.w3.org/2001/XMLSchema#integer"}},
+   {"x":{"type":"literal","value":"bar","xml:lang":"EN"},
+    "y":{"type":"uri","value":"http://4store.org/"}}
+  ]
+ }
+}
+
+ +
+

Result formats — SPARQL

+
    +
  • Standard
  • +
  • Fairly efficient to generate
  • +
  • Can be expensive to parse
  • +
+
<?xml version="1.0"?>
+<sparql xmlns="http://www.w3.org/2005/sparql-results#">
+  <head>
+    <variable name="x"/>
+    <variable name="y"/>
+  </head>
+  <results>
+    <result>
+      <binding name="x"><literal>foo</literal></binding>
+      <binding name="y"><literal datatype="http://www.w3.org/2001/XMLSchema#integer">12</literal></binding>
+    </result>
+    <result>
+      <binding name="x"><literal xml:lang="EN">bar</literal></binding>
+      <binding name="y"><uri>http://4store.org/</uri></binding>
+    </result>
+  </results>
+</sparql>
+
+ +
+

Query Quirks

+

A handful of things that 4store does, which you might not be expecting

+
+ +
+

Default graph (1)

+
    +
  • Normally 4store does not have the behaviour as defined in the spec.
  • +
  • When dealing with lots of data with complex provenance, spec. behaviour is awkward
  • +
  • If you load a.rdf, b.rdf, and c.rdf:
  • +
      +
    • The default graph will contain the merge of a.rdf, b.rdf, and c.rdf, so: +
      SELECT * WHERE { ?x ?y ?z }
      will return all triples in the system +
      SELECT * WHERE { GRAPH <a.rdf> { ?x ?y ?z } }
      will just return triples in a.rdf
    • +
    +
+
+ +
+

Default graph (2)

+
    +
  • If you want the behaviour as defined in the spec:
  • +
      +
    • Import default graph data to <default:>
    • +
        +
      • e.g. 4s-import -M default: a.rdf b.rdf
      • +
      +
    • Run queries with 4s-query -d, or
    • +
    • Start the HTTP server with 4s-httpd -d
    • +
    +
  • Then +
    SELECT * WHERE { ?x ?y ?z }
    will return only the default graph. +
    SELECT * WHERE { GRAPH ?g { ?x ?y ?z } }
    will return everything else.
  • +
+
+ +
+

FROM (NAMED)

+
    +
  • FROM might not do what you expect
  • +
  • Rather than loading the URI given, it just restricts answers to be +taken from that/those graph(s)
  • +
  • e.g. SELECT * FROM <a.rdf> WHERE { ?x ?y ?z }
    will only draw answers from a.rdf.
  • +
  • It's very similar to
    SELECT * WHERE { GRAPH <a.rdf> { ?x ?y ?z } }
    but allows you to list many graphs.
  • +
  • FROM NAMED isn't implemented at all
  • +
+
+ +
+

Soft Limits

+
    +
  • When dealing with very large datasets, it's common to encounter queries that return millions of rows
  • +
  • Because HTTP is generally used as a transport it's difficult to stop the query processors, even if you realise in time (ctrl-C won't cut it!)
  • +
  • The soft limit constrains the amount of effort the query engine will put into answering any query, it limits the size of the working-set of the query.
  • +
  • Use &soft-limit=N to control it, it defaults to about 1000
  • +
  • Queries that have been constrained by the soft limit will be indicated with a warning in the results [demo]
  • +
+
+ +
+

Public SPARQL Endpoints

+
    +
  • One of the design goals of 4store was to allow this, but we've never +done it in anger
  • +
      +
    • Can't promise that it's safe to do
    • +
    • Make sure you set a soft-limit explicitly in the HTTP call
    • +
    • Make sure you set restricted
    • +
    • Good luck, and tell us how you get on
    • +
    +
+
+ +
+

Known Bugs

+
    +
  • Bottom-up queries aren't executed correctly
  • +
      +
    • In practice you'll probably never see this
    • +
    +
  • Certain combinations of LIMIT, FILTER, OPTIONAL and ORDER BY can result in incorrect ordering
  • +
+
+ + + +
+

Optimising queries

+

Some experiences of how to make 4store queries run quickly, and how to diagnose performance problems if you find them

+

We will also cover some unusual or unexpected optimisations

+
+ +
+

FILTERs slow, patterns fast

+
    +
  • As a rule of thumb, FILTER expressions are not optimised
  • +
    SELECT * WHERE { ?x :p ?val . FILTER(?val > 1 && ?val < 4) }
    +

    is very slow, but

    +
    SELECT * WHERE { { ?x :p 2 } UNION { ?x :p 3 } }
    +

    will be very quick

    +
  • This might come as a surprise to people familiar with relational databases
  • +
+
+ +
+

FILTER disjunctions

+
    +
  • An exception to the “FILTERs slow” rule of thumb
  • +
  • FILTERs of the form +
    ?x = K || ?x = L || ?x = M || …
    + can often be optimised, and are usually faster than the equivalent UNION, e.g.: +
    SELECT ?name
    +WHERE {
    +  <s> ?p ?name .
    +  FILTER(?p = foaf:name || ?p = foaf:nick)
    +}
    + is typically faster than +
    SELECT ?name
    +WHERE {
    +  { <s> foaf:name ?name . } UNION { <s> foaf:nick ?name . }
    +}
  • +
+
+ +
+

Known predicates

+
    +
  • Queries with non-constant predicates, e.g. +
    SELECT * WHERE { <s> ?p ?o }
    + can be expensive to run, especially if you have a lot of predicates
  • +
  • Limiting the query to a few predicates, eg. +
    SELECT *
    +WHERE {
    +  <s> ?p ?o .
    +  FILTER(?p = foaf:name || ?p = foaf:mbox || ?p = foaf:openid)
    +}
    + is usually more efficient, if that's all you need. +
  • +
+
+ +
+

Constant Object Triple Groups

+
    +
  • In systems with several segments, or clustered systems there's a big performance gain for this type of query: +
    SELECT ?x WHERE {
    +  ?x :givenName "John" ;
    +     :familyName "Smith" ;
    +     :yearOfBirth 1973 .
    +}
  • +
  • Might expect it to be slow, but can be parallelised very efficiently [demo]
  • +
  • Also works for cases like +
    SELECT ?x WHERE {
    +  <person> :givenName ?given ;
    +           :familyName ?family .
    +  ?x :givenName ?given ;
    +     :familyName ?family ;
    +     :yearOfBirth 1973 .
    + as long as there's only one binding each for ?family and ?given.
  • +
+
+ +
+

CONSTRUCT and Linked Data services

+
    +
  • An exception to the “Variable predicates” rule of thumb is +
    … WHERE { GRAPH K { ?s ?p ?o } }
  • +
  • This is especially useful for CONSTRUCT, returning whole graphs, e.g. +
    CONSTRUCT { ?s ?p ?o }
    +WHERE {
    +  GRAPH <http://foo.com/x.rdf> { ?s ?p ?o }
    +}
  • +
  • Which can be executed very quickly [demo]
  • +
+
+ +
+

LIMIT and OFFSET

+
    +
  • LIMIT and OFFSET are not optimised in any way
  • +
  • If you need to paginate results like: +
    SELECT *
    +WHERE {
    +  ?x :title ?title .
    +  ?x :rank ?rank
    +}
    +ORDER BY ?rank
    +LIMIT 10 OFFSET N x 10
  • +
  • If you want to do that it might be faster to get a big block of results, cache and paginate in your app, rather than issue loads of queries
  • +
+
+ +
+

The End

+

Thanks for your attention, we hope you now have a clearer idea of how 4store works.

+

We also have a few more slides on more complex internal issues and diagnosis, if you've not had enough already.

+
+ +
+

Really Advanced Stuff

+

Things that are pretty complex, and we might have time to touch on

+
+ +
+

EXPLAIN syntax

+
    +
  • EXPLAIN only works from 4s-query (a bug/omission) and you need LAQRS support compiled into Rasqal
  • +
  • Syntax: +
    PREFIX …
    +EXPLAIN SELECT … WHERE …
    +
  • +
  • Example: +
    $ 4s-query loadtest
    +'EXPLAIN SELECT ?a ?b WHERE { <local:a> ?y ?z . ?a ?b ?z }'
    +
    +execute: triple(uri<local:a>, variable(y), variable(z)) LIMIT 998
    +mmmms (_,_[e7c9e444a4b5e52e],_,?) -> 2
    +2 bindings (2)
    +execute: triple(variable(a), variable(b), variable(z)) LIMIT 998
    +NNNNo (_,?,?,?[67ea9ed287a80d87 5b8e6e8d1ed39a5c]) -> 2
    +2 bindings (6)
  • +
+
+ +
+

Index Files

+ +
    +
  • There are a number of different indexes in the 4store segment directory
  • +
      +
    • rhash*, ptrees, an mhash, and a tbchain
    • +
    +
+
+ +
+

RHash Diagnostics

+ +
+ +
+

PTree Diagnostics

+ +
+ + + diff --git a/website/presentations/qmul-2009-09-17/slidy/bullet-fold-dim.gif b/website/presentations/qmul-2009-09-17/slidy/bullet-fold-dim.gif new file mode 100644 index 0000000..bce1a2a Binary files /dev/null and b/website/presentations/qmul-2009-09-17/slidy/bullet-fold-dim.gif differ diff --git a/website/presentations/qmul-2009-09-17/slidy/bullet-fold.gif b/website/presentations/qmul-2009-09-17/slidy/bullet-fold.gif new file mode 100644 index 0000000..d4b063c Binary files /dev/null and b/website/presentations/qmul-2009-09-17/slidy/bullet-fold.gif differ diff --git a/website/presentations/qmul-2009-09-17/slidy/bullet-nofold-dim.gif b/website/presentations/qmul-2009-09-17/slidy/bullet-nofold-dim.gif new file mode 100644 index 0000000..98a4c39 Binary files /dev/null and b/website/presentations/qmul-2009-09-17/slidy/bullet-nofold-dim.gif differ diff --git a/website/presentations/qmul-2009-09-17/slidy/bullet-unfold-dim.gif b/website/presentations/qmul-2009-09-17/slidy/bullet-unfold-dim.gif new file mode 100644 index 0000000..b758cbe Binary files /dev/null and b/website/presentations/qmul-2009-09-17/slidy/bullet-unfold-dim.gif differ diff --git a/website/presentations/qmul-2009-09-17/slidy/bullet-unfold.gif b/website/presentations/qmul-2009-09-17/slidy/bullet-unfold.gif new file mode 100644 index 0000000..e5ecd5b Binary files /dev/null and b/website/presentations/qmul-2009-09-17/slidy/bullet-unfold.gif differ diff --git a/website/presentations/qmul-2009-09-17/slidy/fold-dim.gif b/website/presentations/qmul-2009-09-17/slidy/fold-dim.gif new file mode 100644 index 0000000..346fcbf Binary files /dev/null and b/website/presentations/qmul-2009-09-17/slidy/fold-dim.gif differ diff --git a/website/presentations/qmul-2009-09-17/slidy/fold.gif b/website/presentations/qmul-2009-09-17/slidy/fold.gif new file mode 100644 index 0000000..133e594 Binary files /dev/null and b/website/presentations/qmul-2009-09-17/slidy/fold.gif differ diff --git a/website/presentations/qmul-2009-09-17/slidy/garlik.css b/website/presentations/qmul-2009-09-17/slidy/garlik.css new file mode 100644 index 0000000..8dacd80 --- /dev/null +++ b/website/presentations/qmul-2009-09-17/slidy/garlik.css @@ -0,0 +1,509 @@ +/* w3c-blue.css + + Copyright (c) 2005 W3C (MIT, ERCIM, Keio), All Rights Reserved. + W3C liability, trademark, document use and software licensing + rules apply, see: + + http://www.w3.org/Consortium/Legal/copyright-documents + http://www.w3.org/Consortium/Legal/copyright-software +*/ +body +{ + margin: 0 0 0 0; + padding: 0 0 0 0; + width: 100%; + height: 100%; + color: black; + background-color: white; + font-family: "Gill Sans MT", "Gill Sans", GillSans, sans-serif; + font-size: 14pt; +} + +div.toolbar { + position: fixed; z-index: 200; + top: auto; bottom: 0; left: 0; right: 0; + height: 1.2em; text-align: right; + padding-left: 1em; + padding-right: 1em; + font-size: 60%; + color: red; background: rgb(240,240,240); +} + +div.background { + display: none; +} + +div.handout { + margin-left: 20px; + margin-right: 20px; +} + +div.slide.titlepage { + text-align: center; +} + +div.slide.titlepage.h1 { + padding-top: 40%; +} + +div.slide { + z-index: 20; + margin: 0 0 0 0; + padding: 0; + border-width: 0; + top: 0; + bottom: 0; + left: 0; + right: 0; + line-height: 120%; + background-color: transparent; +} + +div.background { + z-index: 1; + position: absolute; + vertical-align: bottom; + left: 0; + right: 0; + top: 0; + bottom: auto; + height: 4.1em; + padding: 0 0 0 0.2em; + margin: 0 0 0 0; + border-width: 0; + background-color: #fff; +} + +div.background img { + height: 4em; +} + +/* this rule is hidden from IE which doesn't support + selector */ +div.slide + div[class].slide { page-break-before: always;} + +div.slide h1 { + padding-left: 0.1em; + padding-right: 0; + padding-top: 0.1em; + margin-bottom: 0.8em; + margin-top: -0.05em; + margin-left: 3em; + margin-right: 5em; + min-height: 2.3em; + color: black; + height: 2.2em; + font-size: 160%; + line-height: 1.1em; + background: #fff; +} + +div.slide h1 a { + color: #6d6453; + text-decoration: none; +} + +div.slide h1 a:link { + color: #6d6453; + text-decoration: none; +} + +div.slide h1 a:visited { + color: #6d6453; + text-decoration: none; +} + +div.slide h1 a:hover { + color: yellow; + text-decoration: underline; +} + +div.slide h1 a:active { + color: red; + text-decoration: underline; +} + +#head-icon { + margin-top: 0.5em; + margin-bottom: 0; + margin-left: 0; + margin-right: 1em; + background: #fff; + border-width: 0; + height: 3em; + max-width: 3em; + z-index: 2; + float: left; +} + +#head-logo { + margin: 0; + margin-top: 0.25em; + padding-top: 0.25em; + padding-bottom: 0.2em; + padding-left: 0; + padding-right: 0.2em; + height: 3.2em; + width: 6.5em; + float: right; + z-index: 2; + background: #fff; +} + +#head-logo-fallback { + margin: 0; + padding: 0; + margin-top: -0.8em; + width: 4.8em; + float: right; + z-index: 2; +} + +/* the next two classes support vertical and horizontal centering */ +div.vbox { + float: left; + height: 40%; + width: 50%; + margin-top: -240px; +} +div.hbox { + width:60%; + margin-top: 0; + margin-left:auto; + margin-right:auto; + height: 60%; + border:1px solid silver; + background:#F0F0F0; + overflow:auto; + text-align:left; + clear:both; +} + +/* styling for named background */ +div.background.slanty { + z-index: 2; + bottom: 0; + height: 100%; + background: transparent; +} + +div.background.slanty img { margin-top: 4em; width: 100%; height: 80% } + +/* the following makes the pre background translucent */ +/* opacity is a CSS3 property but supported by Mozilla family */ +/* filter is an IE specific feature that also requires width */ +div.slide.slanty pre { + width: 93%; /* needed for IE filter to work */ + opacity: .8; + filter: alpha(opacity=80); +} + +img.withBorder { + border: 2px solid #c60; + padding: 4px; +} + +li pre { margin-left: 0; } + +@media print { pre { font-size: 60% } } + +blockquote { font-style: italic } + +img { background-color: transparent } + +p.copyright { font-size: smaller } + +.center { text-align: center } +.footnote { font-size: smaller; margin-left: 2em; } + +a img { border-width: 0; border-style: none } + +a:visited { color: #6d6453} +a:link { color: #6d6453} +a:hover { color: red; text-decoration: underline } +a:active { color: red; text-decoration: underline } + +a {text-decoration: none} +.navbar a:link {color: white} +.navbar a:visited {color: yellow} +.navbar a:active {color: red} +.navbar a:hover {color: red} + +ul { list-style-type: square; } +ul ul { list-style-type: disc; } +ul ul ul { list-style-type: circle; } +ul ul ul ul { list-style-type: disc; } +li { margin-left: 0.5em; margin-top: 0.5em; } +li li { font-size: 85%; font-style: italic } +li li li { font-size: 85%; font-style: normal } + +div dt +{ + margin-left: 0; + margin-top: 1em; + margin-bottom: 0.5em; + font-weight: bold; +} +div dd +{ + margin-left: 2em; + margin-bottom: 0.5em; +} + + +p,pre,ul,ol,blockquote,h2,h3,h4,h5,h6,dl,table { + margin-left: 1em; + margin-right: 1em; +} + +p.subhead { font-weight: bold; margin-top: 2em; } + +div.cover p.explanation { + font-style: italic; + margin-top: 3em; +} + + +.smaller { font-size: smaller } + +td,th { padding: 0.2em } + +ul { + margin: 0.5em 1.5em 0.5em 1.5em; + padding: 0; +} + +ol { + margin: 0.5em 1.5em 0.5em 1.5em; + padding: 0; +} + +ul { list-style-type: square; } +ul ul { list-style-type: disc; } +ul ul ul { list-style-type: circle; } +ul ul ul ul { list-style-type: disc; } +li { margin-left: 0.5em; margin-top: 0.5em; } +li li { font-size: 85%; font-style: italic } +li li li { font-size: 85%; font-style: normal } + + +ul li { + list-style: none; + margin: 0.1em 0em 0.6em 1em; + padding: 0 0 0 0px; + list-style-type: square; + background: transparent; + line-height: 140%; +} + +/* workaround IE's failure to support background on li for print media */ +@media print { ul li { list-style: disc; padding-left: 0; background: none; } } + +ol li { + margin: 0.1em 0em 0.6em 1.5em; + padding: 0 0 0 0px; + line-height: 140%; +} + +li li { + font-size: 85%; + font-style: italic; + list-style-type: disc; + background: transparent; + padding: 0 0 0 0; +} +li li li { + font-size: 85%; + font-style: normal; + list-style-type: circle; + background: transparent; + padding: 0 0 0 0; +} +li li li li { + list-style-type: disc; + background: transparent; + padding: 0 0 0 0; +} + +/* rectangular blue bullet + unfold/nofold/fold widget */ + +/* + setting class="outline on ol or ul makes it behave as an + ouline list where blocklevel content in li elements is + hidden by default and can be expanded or collapsed with + mouse click. Set class="expand" on li to override default +*/ + +ol.outline li:hover { cursor: pointer } +ol.outline li.nofold:hover { cursor: default } + +ul.outline li:hover { cursor: pointer } +ul.outline li.nofold:hover { cursor: default } + +ol.outline { list-style:decimal; } +ol.outline ol { list-style-type:lower-alpha } + +ol.outline li.nofold { + padding: 0 0 0 20px; + background: transparent url(nofold-dim.gif) no-repeat 0px 0.3em; +} +ol.outline li.unfolded { + padding: 0 0 0 20px; + background: transparent url(fold-dim.gif) no-repeat 0px 0.3em; +} +ol.outline li.folded { + padding: 0 0 0 20px; + background: transparent url(unfold-dim.gif) no-repeat 0px 0.3em; +} +ol.outline li.unfolded:hover { + padding: 0 0 0 20px; + background: transparent url(fold.gif) no-repeat 0px 0.3em; +} +ol.outline li.folded:hover { + padding: 0 0 0 20px; + background: transparent url(unfold.gif) no-repeat 0px 0.3em; +} + +ul.outline li.nofold { + padding: 0 0 0 52px; + background: transparent url(bullet-nofold-dim.gif) no-repeat 5px 0.3em; +} +ul.outline li.unfolded { + padding: 0 0 0 52px; + background: transparent url(bullet-fold-dim.gif) no-repeat 5px 0.3em; +} +ul.outline li.folded { + padding: 0 0 0 52px; + background: transparent url(bullet-unfold-dim.gif) no-repeat 5px 0.3em; +} +ul.outline li.unfolded:hover { + padding: 0 0 0 52px; + background: transparent url(bullet-fold.gif) no-repeat 5px 0.3em; +} +ul.outline li.folded:hover { + padding: 0 0 0 52px; + background: transparent url(bullet-unfold.gif) no-repeat 5px 0.3em; +} + +li ul.outline li.nofold { + padding: 0 0 0 21px; + background: transparent url(nofold-dim.gif) no-repeat 5px 0.3em; +} +li ul.outline li.unfolded { + padding: 0 0 0 21px; + background: transparent url(fold-dim.gif) no-repeat 5px 0.3em; +} +li ul.outline li.folded { + padding: 0 0 0 21px; + background: transparent url(unfold-dim.gif) no-repeat 5px 0.3em; +} +li ul.outline li.unfolded:hover { + padding: 0 0 0 21px; + background: transparent url(fold.gif) no-repeat 5px 0.3em; +} +li ul.outline li.folded:hover { + padding: 0 0 0 21px; + background: transparent url(unfold.gif) no-repeat 5px 0.3em; +} + +img.withBorder { + border: 2px solid #c60; + padding: 4px; +} + +div.header { + position: absolute; + z-index: 2; + left: 0; + right: 0; + top: 0; + bottom: auto; + height: 2.95em; + width: 100%; + padding: 0 0 0 0; + margin: 0 0 0 0; + border-width: 0; + border-style: solid; + background-color: #005A9C; + border-bottom-width: thick; + border-bottom-color: #95ABD0; +} + +div.footer { + position: absolute; + z-index: 80; + left: 0; + right: 0; + top: auto; + bottom: 0; + height: 3.5em; + margin: 0; + font-size: 80%; + font-weight: bold; + padding-left: 1em; + padding-right: 0; + padding-top: 0.3em; + padding-bottom: 0; + color: #003366; + background-color: #95ABD0; +} + +/* this is a hack to hide property from IE6 and below */ +div[class="footer"] { + position: fixed; +} + +#hidden-bullet { + visibility: hidden; + display: none; +} + +div.slide.cover { + color: black; + background-color: #fff; + padding-top: 0; + padding-right: 0; + padding-left: 3em; + height: 100%; +} + +div.slide.cover h1 { + margin: 0; + padding: 0.5em; + color: black; + height: auto; +} + +div.slide.cover h2 { + color: black; +} + +div.slide.cover a { + color: #6d6453; +} + +div.slide.cover a:visited { color: #6d6453} +div.slide.cover a:link { color: #6d6453 } +div.slide.cover a:hover { color: yellow; text-decoration: underline } +div.slide.cover a:active { color: yellow; text-decoration: underline } + +div.slide.cover a:hover, div.slide.cover a:active { + color: yellow; text-decoration: underline; +} + +div.slide.cover img.cover { + margin: 0 0 0 0; + float: right; + padding-bottom: 4em; + width: 50%; + overflow: hidden; +} + +div.slide.cover a:hover, div.slide.cover a:active { + color: yellow; text-decoration: underline; +} + +/* for Bert as an ardent user of the old W3C slidemaker tool */ + +div.comment { display: none; visibility: hidden } + +@media print { div.comment { display: block; visibility: visible; padding: 1ex; border: solid 1px black } } diff --git a/website/presentations/qmul-2009-09-17/slidy/garlik.gif b/website/presentations/qmul-2009-09-17/slidy/garlik.gif new file mode 100644 index 0000000..c5c8281 Binary files /dev/null and b/website/presentations/qmul-2009-09-17/slidy/garlik.gif differ diff --git a/website/presentations/qmul-2009-09-17/slidy/nofold-dim.gif b/website/presentations/qmul-2009-09-17/slidy/nofold-dim.gif new file mode 100644 index 0000000..996fb5e Binary files /dev/null and b/website/presentations/qmul-2009-09-17/slidy/nofold-dim.gif differ diff --git a/website/presentations/qmul-2009-09-17/slidy/slidy.css b/website/presentations/qmul-2009-09-17/slidy/slidy.css new file mode 100644 index 0000000..4ddf74c --- /dev/null +++ b/website/presentations/qmul-2009-09-17/slidy/slidy.css @@ -0,0 +1,317 @@ +/* slidy.css + + Copyright (c) 2005 W3C (MIT, ERCIM, Keio), All Rights Reserved. + W3C liability, trademark, document use and software licensing + rules apply, see: + + http://www.w3.org/Consortium/Legal/copyright-documents + http://www.w3.org/Consortium/Legal/copyright-software +*/ +body +{ + margin: 0 0 0 0; + padding: 0 0 0 0; + width: 100%; + height: 100%; + color: black; + background-color: white; + font-family: "Gill Sans MT", "Gill Sans", GillSans, sans-serif; + font-size: 14pt; +} + +.hidden { display: none; visibility: hidden } + +div.toolbar { + position: fixed; z-index: 200; + top: auto; bottom: 0; left: 0; right: 0; + height: 1.2em; text-align: right; + padding-left: 1em; + padding-right: 1em; + font-size: 60%; + color: red; background: rgb(240,240,240); +} + +div.background { + display: none; +} + +div.handout { + margin-left: 20px; + margin-right: 20px; +} + +div.slide.titlepage { + text-align: center; +} + +div.slide.titlepage.h1 { + padding-top: 40%; +} + +div.slide { + z-index: 20; + margin: 0 0 0 0; + padding-top: 0; + padding-bottom: 0; + padding-left: 20px; + padding-right: 20px; + border-width: 0; + top: 0; + bottom: 0; + left: 0; + right: 0; + line-height: 120%; + background-color: transparent; +} + +/* this rule is hidden from IE 6 and below which don't support + selector */ +div.slide + div[class].slide { page-break-before: always;} + +div.slide h1 { + padding-left: 0; + padding-right: 20pt; + padding-top: 4pt; + padding-bottom: 4pt; + margin-top: 0; + margin-left: 0; + margin-right: 60pt; + margin-bottom: 0.5em; + display: block; + font-size: 160%; + line-height: 1.2em; + background: transparent; +} + +div.toc { + position: absolute; + top: auto; + bottom: 4em; + left: 4em; + right: auto; + width: 60%; + max-width: 30em; + height: 30em; + border: solid thin black; + padding: 1em; + background: rgb(240,240,240); + color: black; + z-index: 300; + overflow: auto; + display: block; + visibility: visible; +} + +div.toc-heading { + width: 100%; + border-bottom: solid 1px rgb(180,180,180); + margin-bottom: 1em; + text-align: center; +} + +pre { + font-size: 80%; + font-weight: bold; + line-height: 120%; + padding-top: 0.2em; + padding-bottom: 0.2em; + padding-left: 1em; + padding-right: 1em; + border-style: solid; + border-left-width: 1em; + border-top-width: thin; + border-right-width: thin; + border-bottom-width: thin; + border-color: #95ABD0; + color: #00428C; + background-color: #E4E5E7; +} + +li pre { margin-left: 0; } + +@media print { + div.slide { + display: block; + visibility: visible; + position: relative; + border-top-style: solid; + border-top-width: thin; + border-top-color: black; + } + div.slide pre { font-size: 60%; padding-left: 0.5em; } + div.handout { display: block; visibility: visible; } +} + +blockquote { font-style: italic } + +img { background-color: transparent } + +p.copyright { font-size: smaller } + +.center { text-align: center } +.footnote { font-size: smaller; margin-left: 2em; } + +a img { border-width: 0; border-style: none } + +a:visited { color: navy } +a:link { color: navy } +a:hover { color: red; text-decoration: underline } +a:active { color: red; text-decoration: underline } + +a {text-decoration: none} +.navbar a:link {color: white} +.navbar a:visited {color: yellow} +.navbar a:active {color: red} +.navbar a:hover {color: red} + +ul { list-style-type: square; } +ul ul { list-style-type: disc; } +ul ul ul { list-style-type: circle; } +ul ul ul ul { list-style-type: disc; } +li { margin-left: 0.5em; margin-top: 0.5em; } +li li { font-size: 85%; font-style: italic } +li li li { font-size: 85%; font-style: normal } + +div dt +{ + margin-left: 0; + margin-top: 1em; + margin-bottom: 0.5em; + font-weight: bold; +} +div dd +{ + margin-left: 2em; + margin-bottom: 0.5em; +} + + +p,pre,ul,ol,blockquote,h2,h3,h4,h5,h6,dl,table { + margin-left: 1em; + margin-right: 1em; +} + +p.subhead { font-weight: bold; margin-top: 2em; } + +.smaller { font-size: smaller } +.bigger { font-size: 130% } + +td,th { padding: 0.2em } + +ul { + margin: 0.5em 1.5em 0.5em 1.5em; + padding: 0; +} + +ol { + margin: 0.5em 1.5em 0.5em 1.5em; + padding: 0; +} + +ul { list-style-type: square; } +ul ul { list-style-type: disc; } +ul ul ul { list-style-type: circle; } +ul ul ul ul { list-style-type: disc; } + +ul li { + list-style: square; + margin: 0.1em 0em 0.6em 0; + padding: 0 0 0 0; + line-height: 140%; +} + +ol li { + margin: 0.1em 0em 0.6em 1.5em; + padding: 0 0 0 0px; + line-height: 140%; + list-style-type: decimal; +} + +li ul li { + font-size: 85%; + font-style: italic; + list-style-type: disc; + background: transparent; + padding: 0 0 0 0; +} +li li ul li { + font-size: 85%; + font-style: normal; + list-style-type: circle; + background: transparent; + padding: 0 0 0 0; +} +li li li ul li { + list-style-type: disc; + background: transparent; + padding: 0 0 0 0; +} + +li ol li { + list-style-type: decimal; +} + + +li li ol li { + list-style-type: decimal; +} + +/* + setting class="outline on ol or ul makes it behave as an + ouline list where blocklevel content in li elements is + hidden by default and can be expanded or collapsed with + mouse click. Set class="expand" on li to override default +*/ + +ol.outline li:hover { cursor: pointer } +ol.outline li.nofold:hover { cursor: default } + +ul.outline li:hover { cursor: pointer } +ul.outline li.nofold:hover { cursor: default } + +ol.outline { list-style:decimal; } +ol.outline ol { list-style-type:lower-alpha } + +ol.outline li.nofold { + padding: 0 0 0 20px; + background: transparent url(nofold-dim.gif) no-repeat 0px 0.5em; +} +ol.outline li.unfolded { + padding: 0 0 0 20px; + background: transparent url(fold-dim.gif) no-repeat 0px 0.5em; +} +ol.outline li.folded { + padding: 0 0 0 20px; + background: transparent url(unfold-dim.gif) no-repeat 0px 0.5em; +} +ol.outline li.unfolded:hover { + padding: 0 0 0 20px; + background: transparent url(fold.gif) no-repeat 0px 0.5em; +} +ol.outline li.folded:hover { + padding: 0 0 0 20px; + background: transparent url(unfold.gif) no-repeat 0px 0.5em; +} + +ul.outline li.nofold { + padding: 0 0 0 20px; + background: transparent url(nofold-dim.gif) no-repeat 0px 0.5em; +} +ul.outline li.unfolded { + padding: 0 0 0 20px; + background: transparent url(fold-dim.gif) no-repeat 0px 0.5em; +} +ul.outline li.folded { + padding: 0 0 0 20px; + background: transparent url(unfold-dim.gif) no-repeat 0px 0.5em; +} +ul.outline li.unfolded:hover { + padding: 0 0 0 20px; + background: transparent url(fold.gif) no-repeat 0px 0.5em; +} +ul.outline li.folded:hover { + padding: 0 0 0 20px; + background: transparent url(unfold.gif) no-repeat 0px 0.5em; +} + +/* for slides with class "title" in table of contents */ +a.titleslide { font-weight: bold; font-style: italic } diff --git a/website/presentations/qmul-2009-09-17/slidy/slidy.js b/website/presentations/qmul-2009-09-17/slidy/slidy.js new file mode 100644 index 0000000..aa1892e --- /dev/null +++ b/website/presentations/qmul-2009-09-17/slidy/slidy.js @@ -0,0 +1,2930 @@ +/* slidy.js + + Copyright (c) 2005-2009 W3C (MIT, ERCIM, Keio), All Rights Reserved. + W3C liability, trademark, document use and software licensing + rules apply, see: + + http://www.w3.org/Consortium/Legal/copyright-documents + http://www.w3.org/Consortium/Legal/copyright-software +*/ + +var ns_pos = (typeof window.pageYOffset!='undefined'); +var khtml = ((navigator.userAgent).indexOf("KHTML") >= 0 ? true : false); +var opera = ((navigator.userAgent).indexOf("Opera") >= 0 ? true : false); +var ie = (typeof document.all != "undefined" && !opera); +var ie7 = (!ns_pos && navigator.userAgent.indexOf("MSIE 7") != -1); +var ie8 = (!ns_pos && navigator.userAgent.indexOf("MSIE 8") != -1); +var slidy_started = false; + +if (ie && !ie8) + document.write(""); + +// IE only event handlers to ensure all slides are printed +// I don't yet know how to emulate these for other browsers +if (typeof beforePrint != 'undefined') +{ + window.onbeforeprint = beforePrint; + window.onafterprint = afterPrint; +} + +// to avoid a clash with other scripts or onload attribute on +// we use something smarter than window.onload +//window.onload = startup; + + +if (ie) + setTimeout(ieSlidyInit, 100); +else if (document.addEventListener) + document.addEventListener("DOMContentLoaded", startup, false); + +function ieSlidyInit() +{ + if (//document.readyState == "interactive" || + document.readyState == "complete" || + document.readyState == "loaded") + { + startup(); + } + else + { + setTimeout(ieSlidyInit, 100); + } +} + +setTimeout(hideSlides, 50); + +function hideSlides() +{ + if (document.body) + document.body.style.visibility = "hidden"; + else + setTimeout(hideSlides, 50); +} + +var slidenum = 0; // integer slide count: 0, 1, 2, ... +var slides; // set to array of slide div's +var slideNumElement; // element containing slide number +var notes; // set to array of handout div's +var backgrounds; // set to array of background div's +var toolbar; // element containing toolbar +var title; // document title +var lastShown = null; // last incrementally shown item +var eos = null; // span element for end of slide indicator +var toc = null; // table of contents +var outline = null; // outline element with the focus +var selectedTextLen; // length of drag selection on document + +var viewAll = 0; // 1 to view all slides + handouts +var wantToolbar = 1; // 0 if toolbar isn't wanted +var mouseClickEnabled = true; // enables left click for next slide +var scrollhack = 0; // IE work around for position: fixed + +var helpAnchor; // used for keyboard focus hack in showToolbar() +var helpPage = "http://www.w3.org/Talks/Tools/Slidy/help.html"; +var helpText = "Navigate with mouse click, space bar, Cursor Left/Right, " + + "or Pg Up and Pg Dn. Use S and B to change font size."; + +var sizeIndex = 0; +var sizeAdjustment = 0; +var sizes = new Array("10pt", "12pt", "14pt", "16pt", "18pt", "20pt", + "22pt", "24pt", "26pt", "28pt", "30pt", "32pt"); +var okayForIncremental = incrementalElementList(); + +// needed for efficient resizing +var lastWidth = 0; +var lastHeight = 0; + +// Needed for cross browser support for relative width/height on +// object elements. The work around is to save width/height attributes +// and then to recompute absolute width/height dimensions on resizing +var objects; + +// updated to language specified by html file +var lang = "en"; + +//var localize = {}; + +// for each language there is an associative array +var strings_es = { + "slide":"pág.", + "help?":"Ayuda", + "contents?":"Índice", + "table of contents":"tabla de contenidos", + "Table of Contents":"Tabla de Contenidos", + "restart presentation":"Reiniciar presentación", + "restart?":"Inicio" + }; + +strings_es[helpText] = + "Utilice el ratón, barra espaciadora, teclas Izda/Dcha, " + + "o Re pág y Av pág. Use S y B para cambiar el tamaño de fuente."; + +var strings_ca = { + "slide":"pàg..", + "help?":"Ajuda", + "contents?":"Índex", + "table of contents":"taula de continguts", + "Table of Contents":"Taula de Continguts", + "restart presentation":"Reiniciar presentació", + "restart?":"Inici" + }; + +strings_ca[helpText] = + "Utilitzi el ratolí, barra espaiadora, tecles Esq./Dta. " + + "o Re pàg y Av pàg. Usi S i B per canviar grandària de font."; + +var strings_nl = { + "slide":"pagina", + "help?":"Help?", + "contents?":"Inhoud?", + "table of contents":"inhoudsopgave", + "Table of Contents":"Inhoudsopgave", + "restart presentation":"herstart presentatie", + "restart?":"Herstart?" + }; + +strings_nl[helpText] = + "Navigeer d.m.v. het muis, spatiebar, Links/Rechts toetsen, " + + "of PgUp en PgDn. Gebruik S en B om de karaktergrootte te veranderen."; + +var strings_de = { + "slide":"Seite", + "help?":"Hilfe", + "contents?":"Übersicht", + "table of contents":"Inhaltsverzeichnis", + "Table of Contents":"Inhaltsverzeichnis", + "restart presentation":"Präsentation neu starten", + "restart?":"Neustart" + }; + +strings_de[helpText] = + "Benutzen Sie die Maus, Leerschlag, die Cursortasten links/rechts oder " + + "Page up/Page Down zum Wechseln der Seiten und S und B für die Schriftgrösse."; + +var strings_pl = { + "slide":"slajd", + "help?":"pomoc?", + "contents?":"spis treści?", + "table of contents":"spis treści", + "Table of Contents":"Spis Treści", + "restart presentation":"Restartuj prezentację", + "restart?":"restart?" + }; + +strings_pl[helpText] = + "Zmieniaj slajdy klikając myszą, naciskając spację, strzałki lewo/prawo" + + "lub PgUp / PgDn. Użyj klawiszy S i B, aby zmienić rozmiar czczionki."; + +var strings_fr = { + "slide":"page", + "help?":"Aide", + "contents?":"Index", + "table of contents":"table des matières", + "Table of Contents":"Table des matières", + "restart presentation":"Recommencer l'exposé", + "restart?":"Début" + }; + +strings_fr[helpText] = + "Naviguez avec la souris, la barre d'espace, les flèches " + + "gauche/droite ou les touches Pg Up, Pg Dn. Utilisez " + + "les touches S et B pour modifier la taille de la police."; + +var strings_hu = { + "slide":"oldal", + "help?":"segítség", + "contents?":"tartalom", + "table of contents":"tartalomjegyzék", + "Table of Contents":"Tartalomjegyzék", + "restart presentation":"bemutató újraindítása", + "restart?":"újraindítás" + }; + +strings_hu[helpText] = + "Az oldalak közti lépkedéshez kattintson az egérrel, vagy " + + "használja a szóköz, a bal, vagy a jobb nyíl, illetve a Page Down, " + + "Page Up billentyűket. Az S és a B billentyűkkel változtathatja " + + "a szöveg méretét."; + +var strings_it = { + "slide":"pag.", + "help?":"Aiuto", + "contents?":"Indice", + "table of contents":"indice", + "Table of Contents":"Indice", + "restart presentation":"Ricominciare la presentazione", + "restart?":"Inizio" + }; + +strings_it[helpText] = + "Navigare con mouse, barra spazio, frecce sinistra/destra o " + + "PgUp e PgDn. Usare S e B per cambiare la dimensione dei caratteri."; + +var strings_el = { + "slide":"σελίδα", + "help?":"βοήθεια;", + "contents?":"περιεχόμενα;", + "table of contents":"πίνακας περιεχομένων", + "Table of Contents":"Πίνακας Περιεχομένων", + "restart presentation":"επανεκκίνηση παρουσίασης", + "restart?":"επανεκκίνηση;" + }; + +strings_el[helpText] = + "Πλοηγηθείτε με το κλίκ του ποντικιού, το space, τα βέλη αριστερά/δεξιά, " + + "ή Page Up και Page Down. Χρησιμοποιήστε τα πλήκτρα S και B για να αλλάξετε " + + "το μέγεθος της γραμματοσειράς."; + +var strings_ja = { + "slide":"スライド", + "help?":"ヘルプ", + "contents?":"目次", + "table of contents":"目次を表示", + "Table of Contents":"目次", + "restart presentation":"最初から再生", + "restart?":"最初から" +}; + +strings_ja[helpText] = + "マウス左クリック ・ スペース ・ 左右キー " + + "または Page Up ・ Page Downで操作, S ・ Bでフォントサイズ変更"; + +var strings_zh = { + "slide":"幻灯片", + "help?":"帮助?", + "contents?":"内容?", + "table of contents":"目录", + "Table of Contents":"目录", + "restart presentation":"重新启动展示", + "restart?":"重新启动?" +}; + +strings_zh[helpText] = + "用鼠标点击, 空格条, 左右箭头, Pg Up 和 Pg Dn 导航. " + + "用 S, B 改变字体大小."; + +var strings_ru = { + "slide":"слайд", + "help?":"помощь?", + "contents?":"содержание?", + "table of contents":"оглавление", + "Table of Contents":"Оглавление", + "restart presentation":"перезапустить презентацию", + "restart?":"перезапуск?" + }; + +strings_ru[helpText] = + "Перемещайтесь кликая мышкой, используя клавишу пробел, стрелки" + + "влево/вправо или Pg Up и Pg Dn. Клавиши S и B меняют размер шрифта."; + + +// each such language array is declared in the localize array +// used indirectly as in help.innerHTML = "help".localize(); +var localize = { + "es":strings_es, + "ca":strings_ca, + "nl":strings_nl, + "de":strings_de, + "pl":strings_pl, + "fr":strings_fr, + "hu":strings_hu, + "it":strings_it, + "el":strings_el, + "jp":strings_ja, + "zh":strings_zh, + "ru":strings_ru + }; + +/* general initialization */ +function startup() +{ + if (slidy_started) + { + alert("already started"); + return; + } + slidy_started = true; + + // find human language from html element + // for use in localizing strings + lang = document.body.parentNode.getAttribute("lang"); + + if (!lang) + lang = document.body.parentNode.getAttribute("xml:lang"); + + if (!lang) + lang = "en"; + + document.body.style.visibility = "visible"; + title = document.title; + toolbar = addToolbar(); + wrapImplicitSlides(); + slides = collectSlides(); + notes = collectNotes(); + objects = document.body.getElementsByTagName("object"); + backgrounds = collectBackgrounds(); + patchAnchors(); + + slidenum = findSlideNumber(location.href); + window.offscreenbuffering = true; + sizeAdjustment = findSizeAdjust(); + hideImageToolbar(); // suppress IE image toolbar popup + initOutliner(); // activate fold/unfold support + + if (slides.length > 0) + { + var slide = slides[slidenum]; + slide.style.position = "absolute"; + + if (slidenum > 0) + { + setVisibilityAllIncremental("visible"); + lastShown = previousIncrementalItem(null); + setEosStatus(true); + } + else + { + lastShown = null; + setVisibilityAllIncremental("hidden"); + setEosStatus(!nextIncrementalItem(lastShown)); + } + + setLocation(); + } + + toc = tableOfContents(); + hideTableOfContents(); + + // bind event handlers + document.onclick = mouseButtonClick; + document.onmouseup = mouseButtonUp; + document.onkeydown = keyDown; + window.onresize = resized; + window.onscroll = scrolled; + window.onunload = unloaded; + singleSlideView(); + + + setLocation(); + resized(); + + if (ie7) + setTimeout("ieHack()", 100); + + showToolbar(); + setInterval("checkLocation()", 200); // for back button detection +} + +// add localize method to all strings for use +// as in help.innerHTML = "help".localize(); +String.prototype.localize = function() +{ + if (this == "") + return this; + + // try full language code, e.g. en-US + var s, lookup = localize[lang]; + + if (lookup) + { + s = lookup[this]; + + if (s) + return s; + } + + // try en if undefined for en-US + var lg = lang.split("-"); + + if (lg.length > 1) + { + lookup = localize[lg[0]]; + + if (lookup) + { + s = lookup[this]; + + if (s) + return s; + } + } + + // otherwise string as is + return this; +} + +// suppress IE's image toolbar pop up +function hideImageToolbar() +{ + if (!ns_pos) + { + var images = document.getElementsByTagName("IMG"); + + for (var i = 0; i < images.length; ++i) + images[i].setAttribute("galleryimg", "no"); + } +} + +// hack to persuade IE to compute correct document height +// as needed for simulating fixed positioning of toolbar +function ieHack() +{ + window.resizeBy(0,-1); + window.resizeBy(0, 1); +} + +function unloaded(e) +{ + //alert("unloaded"); +} + +// Firefox reload SVG bug work around +function reload(e) +{ + if (!e) + var e = window.event; + + hideBackgrounds(); + setTimeout("document.reload();", 100); + + stopPropagation(e); + e.cancel = true; + e.returnValue = false; + + return false; +} + +// Safari and Konqueror don't yet support getComputedStyle() +// and they always reload page when location.href is updated +function isKHTML() +{ + var agent = navigator.userAgent; + return (agent.indexOf("KHTML") >= 0 ? true : false); +} + +function resized() +{ + var width = 0; + + if ( typeof( window.innerWidth ) == 'number' ) + width = window.innerWidth; // Non IE browser + else if (document.documentElement && document.documentElement.clientWidth) + width = document.documentElement.clientWidth; // IE6 + else if (document.body && document.body.clientWidth) + width = document.body.clientWidth; // IE4 + + var height = 0; + + if ( typeof( window.innerHeight ) == 'number' ) + height = window.innerHeight; // Non IE browser + else if (document.documentElement && document.documentElement.clientHeight) + height = document.documentElement.clientHeight; // IE6 + else if (document.body && document.body.clientHeight) + height = document.body.clientHeight; // IE4 + + if (height && (width/height > 1.05*1024/768)) + { + width = height * 1024.0/768; + } + + // IE fires onresize even when only font size is changed! + // so we do a check to avoid blocking < and > actions + if (width != lastWidth || height != lastHeight) + { + if (width >= 1100) + sizeIndex = 5; // 4 + else if (width >= 1000) + sizeIndex = 4; // 3 + else if (width >= 800) + sizeIndex = 3; // 2 + else if (width >= 600) + sizeIndex = 2; // 1 + else if (width) + sizeIndex = 0; + + // add in font size adjustment from meta element e.g. + // + // useful when slides have too much content ;-) + + if (0 <= sizeIndex + sizeAdjustment && + sizeIndex + sizeAdjustment < sizes.length) + sizeIndex = sizeIndex + sizeAdjustment; + + // enables cross browser use of relative width/height + // on object elements for use with SVG and Flash media + adjustObjectDimensions(width, height); + + document.body.style.fontSize = sizes[sizeIndex]; + + lastWidth = width; + lastHeight = height; + + // force reflow to work around Mozilla bug + //if (ns_pos) + { + var slide = slides[slidenum]; + hideSlide(slide); + showSlide(slide); + } + + // force correct positioning of toolbar + refreshToolbar(200); + } +} + +function scrolled() +{ + if (toolbar && !ns_pos && !ie7) + { + hackoffset = scrollXOffset(); + // hide toolbar + toolbar.style.display = "none"; + + // make it reappear later + if (scrollhack == 0 && !viewAll) + { + setTimeout(showToolbar, 1000); + scrollhack = 1; + } + } +} + +// used to ensure IE refreshes toolbar in correct position +function refreshToolbar(interval) +{ + if (!ns_pos && !ie7) + { + hideToolbar(); + setTimeout(showToolbar, interval); + } +} + +// restores toolbar after short delay +function showToolbar() +{ + if (wantToolbar) + { + if (!ns_pos) + { + // adjust position to allow for scrolling + var xoffset = scrollXOffset(); + toolbar.style.left = xoffset; + toolbar.style.right = xoffset; + + // determine vertical scroll offset + //var yoffset = scrollYOffset(); + + // bottom is doc height - window height - scroll offset + //var bottom = documentHeight() - lastHeight - yoffset + + //if (yoffset > 0 || documentHeight() > lastHeight) + // bottom += 16; // allow for height of scrollbar + + toolbar.style.bottom = 0; //bottom; + } + + toolbar.style.display = "block"; + toolbar.style.visibility = "visible"; + } + + scrollhack = 0; + + + // set the keyboard focus to the help link on the + // toolbar to ensure that document has the focus + // IE doesn't always work with window.focus() + // and this hack has benefit of Enter for help + + try + { + if (!opera) + helpAnchor.focus(); + } + catch (e) + { + } +} + +function hideToolbar() +{ + toolbar.style.display = "none"; + toolbar.style.visibility = "hidden"; + window.focus(); +} + +// invoked via F key +function toggleToolbar() +{ + if (!viewAll) + { + if (toolbar.style.display == "none") + { + toolbar.style.display = "block"; + toolbar.style.visibility = "visible"; + wantToolbar = 1; + } + else + { + toolbar.style.display = "none"; + toolbar.style.visibility = "hidden"; + wantToolbar = 0; + } + } +} + +function scrollXOffset() +{ + if (window.pageXOffset) + return self.pageXOffset; + + if (document.documentElement && + document.documentElement.scrollLeft) + return document.documentElement.scrollLeft; + + if (document.body) + return document.body.scrollLeft; + + return 0; +} + + +function scrollYOffset() +{ + if (window.pageYOffset) + return self.pageYOffset; + + if (document.documentElement && + document.documentElement.scrollTop) + return document.documentElement.scrollTop; + + if (document.body) + return document.body.scrollTop; + + return 0; +} + +// looking for a way to determine height of slide content +// the slide itself is set to the height of the window +function optimizeFontSize() +{ + var slide = slides[slidenum]; + + //var dh = documentHeight(); //getDocHeight(document); + var dh = slide.scrollHeight; + var wh = getWindowHeight(); + var u = 100 * dh / wh; + + alert("window utilization = " + u + "% (doc " + + dh + " win " + wh + ")"); +} + +function getDocHeight(doc) // from document object +{ + if (!doc) + doc = document; + + if (doc && doc.body && doc.body.offsetHeight) + return doc.body.offsetHeight; // ns/gecko syntax + + if (doc && doc.body && doc.body.scrollHeight) + return doc.body.scrollHeight; + + alert("couldn't determine document height"); +} + +function getWindowHeight() +{ + if ( typeof( window.innerHeight ) == 'number' ) + return window.innerHeight; // Non IE browser + + if (document.documentElement && document.documentElement.clientHeight) + return document.documentElement.clientHeight; // IE6 + + if (document.body && document.body.clientHeight) + return document.body.clientHeight; // IE4 +} + + + +function documentHeight() +{ + var sh, oh; + + sh = document.body.scrollHeight; + oh = document.body.offsetHeight; + + if (sh && oh) + { + return (sh > oh ? sh : oh); + } + + // no idea! + return 0; +} + +function smaller() +{ + if (sizeIndex > 0) + { + --sizeIndex; + } + + toolbar.style.display = "none"; + document.body.style.fontSize = sizes[sizeIndex]; + var slide = slides[slidenum]; + hideSlide(slide); + showSlide(slide); + setTimeout(showToolbar, 300); +} + +function bigger() +{ + if (sizeIndex < sizes.length - 1) + { + ++sizeIndex; + } + + toolbar.style.display = "none"; + document.body.style.fontSize = sizes[sizeIndex]; + var slide = slides[slidenum]; + hideSlide(slide); + showSlide(slide); + setTimeout(showToolbar, 300); +} + +// enables cross browser use of relative width/height +// on object elements for use with SVG and Flash media +// with thanks to Ivan Herman for the suggestion +function adjustObjectDimensions(width, height) +{ + for( var i = 0; i < objects.length; i++ ) + { + var obj = objects[i]; + var mimeType = obj.getAttribute("type"); + + if (mimeType == "image/svg+xml" || mimeType == "application/x-shockwave-flash") + { + if ( !obj.initialWidth ) + obj.initialWidth = obj.getAttribute("width"); + + if ( !obj.initialHeight ) + obj.initialHeight = obj.getAttribute("height"); + + if ( obj.initialWidth && obj.initialWidth.charAt(obj.initialWidth.length-1) == "%" ) + { + var w = parseInt(obj.initialWidth.slice(0, obj.initialWidth.length-1)); + var newW = width * (w/100.0); + obj.setAttribute("width",newW); + } + + if ( obj.initialHeight && obj.initialHeight.charAt(obj.initialHeight.length-1) == "%" ) + { + var h = parseInt(obj.initialHeight.slice(0, obj.initialHeight.length-1)); + var newH = height * (h/100.0); + obj.setAttribute("height", newH); + } + } + } +} + +function cancel(event) +{ + if (event) + { + event.cancel = true; + event.returnValue = false; + + if (event.preventDefault) + event.preventDefault(); + } + + return false; +} + +// See e.g. http://www.quirksmode.org/js/events/keys.html for keycodes +function keyDown(event) +{ + var key; + + if (!event) + var event = window.event; + + // kludge around NS/IE differences + if (window.event) + key = window.event.keyCode; + else if (event.which) + key = event.which; + else + return true; // Yikes! unknown browser + + // ignore event if key value is zero + // as for alt on Opera and Konqueror + if (!key) + return true; + + // check for concurrent control/command/alt key + // but are these only present on mouse events? + + if (event.ctrlKey || event.altKey || event.metaKey) + return true; + + // dismiss table of contents if visible + if (isShownToc() && key != 9 && key != 16 && key != 38 && key != 40) + { + hideTableOfContents(); + + if (key == 27 || key == 84 || key == 67) + return cancel(event); + } + + if (key == 34) // Page Down + { + if (viewAll) + return true; + + nextSlide(false); + return cancel(event); + } + else if (key == 33) // Page Up + { + if (viewAll) + return true; + + previousSlide(false); + return cancel(event); + } + else if (key == 32) // space bar + { + nextSlide(true); + return cancel(event); + } + else if (key == 37) // Left arrow + { + previousSlide(!event.shiftKey); + return cancel(event); + } + else if (key == 36) // Home + { + firstSlide(); + return cancel(event); + } + else if (key == 35) // End + { + lastSlide(); + return cancel(event); + } + else if (key == 39) // Right arrow + { + nextSlide(!event.shiftKey); + return cancel(event); + } + else if (key == 13) // Enter + { + if (outline) + { + if (outline.visible) + fold(outline); + else + unfold(outline); + + return cancel(event); + } + } + else if (key == 188) // < for smaller fonts + { + smaller(); + return cancel(event); + } + else if (key == 190) // > for larger fonts + { + bigger(); + return cancel(event); + } + else if (key == 189 || key == 109) // - for smaller fonts + { + smaller(); + return cancel(event); + } + else if (key == 187 || key == 191 || key == 107) // = + for larger fonts + { + bigger(); + return cancel(event); + } + else if (key == 83) // S for smaller fonts + { + smaller(); + return cancel(event); + } + else if (key == 66) // B for larger fonts + { + bigger(); + return cancel(event); + } + else if (key == 90) // Z for last slide + { + lastSlide(); + return cancel(event); + } + else if (key == 70) // F for toggle toolbar + { + toggleToolbar(); + return cancel(event); + } + else if (key == 65) // A for toggle view single/all slides + { + toggleView(); + return cancel(event); + } + else if (key == 75) // toggle action of left click for next page + { + mouseClickEnabled = !mouseClickEnabled; + alert((mouseClickEnabled ? "enabled" : "disabled") + " mouse click advance"); + return cancel(event); + } + else if (key == 84 || key == 67) // T or C for table of contents + { + if (toc) + showTableOfContents(); + + return cancel(event); + } + else if (key == 72) // H for help + { + window.location = helpPage; + return cancel(event); + } + + //else if (key == 93) // Windows menu key + //alert("lastShown is " + lastShown); + //else alert("key code is "+ key); + + + return true; +} + +// make note of length of selected text +// as this evaluates to zero in click event +function mouseButtonUp(e) +{ + selectedTextLen = getSelectedText().length; +} + +// right mouse button click is reserved for context menus +// it is more reliable to detect rightclick than leftclick +function mouseButtonClick(e) +{ + var rightclick = false; + var leftclick = false; + var middleclick = false; + var target; + + if (!e) + var e = window.event; + + if (e.target) + target = e.target; + else if (e.srcElement) + target = e.srcElement; + + // work around Safari bug + if (target.nodeType == 3) + target = target.parentNode; + + if (e.which) // all browsers except IE + { + leftclick = (e.which == 1); + middleclick = (e.which == 2); + rightclick = (e.which == 3); + } + else if (e.button) + { + // Konqueror gives 1 for left, 4 for middle + // IE6 gives 0 for left and not 1 as I expected + + if (e.button == 4) + middleclick = true; + + // all browsers agree on 2 for right button + rightclick = (e.button == 2); + } + else leftclick = true; + + //alert("selected text length = "+selectedTextLen); + + if (selectedTextLen > 0) + { + stopPropagation(e); + e.cancel = true; + e.returnValue = false; + return false; + } + + // dismiss table of contents + hideTableOfContents(); + + // check if target is something that probably want's clicks + // e.g. embed, object, input, textarea, select, option + + if (mouseClickEnabled && leftclick && + target.nodeName != "EMBED" && + target.nodeName != "OBJECT" && + target.nodeName != "VIDEO" && + target.nodeName != "INPUT" && + target.nodeName != "TEXTAREA" && + target.nodeName != "SELECT" && + target.nodeName != "OPTION") + { + nextSlide(true); + stopPropagation(e); + e.cancel = true; + e.returnValue = false; + } +} + +function previousSlide(incremental) +{ + if (!viewAll) + { + var slide; + + if ((incremental || slidenum == 0) && lastShown != null) + { + lastShown = hidePreviousItem(lastShown); + setEosStatus(false); + } + else if (slidenum > 0) + { + slide = slides[slidenum]; + hideSlide(slide); + + slidenum = slidenum - 1; + slide = slides[slidenum]; + setVisibilityAllIncremental("visible"); + lastShown = previousIncrementalItem(null); + setEosStatus(true); + showSlide(slide); + } + + setLocation(); + + if (!ns_pos) + refreshToolbar(200); + } +} + +function nextSlide(incremental) +{ + if (!viewAll) + { + var slide, last = lastShown; + + if (incremental || slidenum == slides.length - 1) + lastShown = revealNextItem(lastShown); + + if ((!incremental || lastShown == null) && slidenum < slides.length - 1) + { + slide = slides[slidenum]; + hideSlide(slide); + + slidenum = slidenum + 1; + slide = slides[slidenum]; + lastShown = null; + setVisibilityAllIncremental("hidden"); + showSlide(slide); + } + else if (!lastShown) + { + if (last && incremental) + lastShown = last; + } + + setLocation(); + + setEosStatus(!nextIncrementalItem(lastShown)); + + if (!ns_pos) + refreshToolbar(200); + } +} + +// to first slide with nothing revealed +// i.e. state at start of presentation +function firstSlide() +{ + if (!viewAll) + { + var slide; + + if (slidenum != 0) + { + slide = slides[slidenum]; + hideSlide(slide); + + slidenum = 0; + slide = slides[slidenum]; + lastShown = null; + setVisibilityAllIncremental("hidden"); + showSlide(slide); + } + + setEosStatus(!nextIncrementalItem(lastShown)); + setLocation(); + } +} + + +// to last slide with everything revealed +// i.e. state at end of presentation +function lastSlide() +{ + if (!viewAll) + { + var slide; + + lastShown = null; //revealNextItem(lastShown); + + if (lastShown == null && slidenum < slides.length - 1) + { + slide = slides[slidenum]; + hideSlide(slide); + slidenum = slides.length - 1; + slide = slides[slidenum]; + setVisibilityAllIncremental("visible"); + lastShown = previousIncrementalItem(null); + + showSlide(slide); + } + else + { + setVisibilityAllIncremental("visible"); + lastShown = previousIncrementalItem(null); + } + + setEosStatus(true); + setLocation(); + } +} + +// first slide is 0 +function gotoSlide(num) +{ + //alert("going to slide " + (num+1)); + var slide = slides[slidenum]; + hideSlide(slide); + slidenum = num; + slide = slides[slidenum]; + lastShown = null; + setVisibilityAllIncremental("hidden"); + setEosStatus(!nextIncrementalItem(lastShown)); + document.title = title + " (" + (slidenum+1) + ")"; + showSlide(slide); + showSlideNumber(); +} + +function setEosStatus(state) +{ + if (eos) + eos.style.color = (state ? "rgb(240,240,240)" : "red"); +} + +function showSlide(slide) +{ + syncBackground(slide); + window.scrollTo(0,0); + slide.style.visibility = "visible"; + slide.style.display = "block"; +} + +function hideSlide(slide) +{ + slide.style.visibility = "hidden"; + slide.style.display = "none"; +} + +function beforePrint() +{ + showAllSlides(); + hideToolbar(); +} + +function afterPrint() +{ + if (!viewAll) + { + singleSlideView(); + showToolbar(); + } +} + +function printSlides() +{ + beforePrint(); + window.print(); + afterPrint(); +} + +function toggleView() +{ + if (viewAll) + { + singleSlideView(); + showToolbar(); + viewAll = 0; + } + else + { + showAllSlides(); + hideToolbar(); + viewAll = 1; + } +} + +// prepare for printing +function showAllSlides() +{ + var slide; + + for (var i = 0; i < slides.length; ++i) + { + slide = slides[i]; + + slide.style.position = "relative"; + slide.style.borderTopStyle = "solid"; + slide.style.borderTopWidth = "thin"; + slide.style.borderTopColor = "black"; + + try { + if (i == 0) + slide.style.pageBreakBefore = "avoid"; + else + slide.style.pageBreakBefore = "always"; + } + catch (e) + { + //do nothing + } + + setVisibilityAllIncremental("visible"); + showSlide(slide); + } + + var note; + + for (var i = 0; i < notes.length; ++i) + { + showSlide(notes[i]); + } + + // no easy way to render background under each slide + // without duplicating the background divs for each slide + // therefore hide backgrounds to avoid messing up slides + hideBackgrounds(); +} + +// restore after printing +function singleSlideView() +{ + var slide; + + for (var i = 0; i < slides.length; ++i) + { + slide = slides[i]; + + slide.style.position = "absolute"; + + if (i == slidenum) + { + slide.style.borderStyle = "none"; + showSlide(slide); + } + else + { + slide.style.borderStyle = "none"; + hideSlide(slide); + } + } + + setVisibilityAllIncremental("visible"); + lastShown = previousIncrementalItem(null); + + var note; + + for (var i = 0; i < notes.length; ++i) + { + hideSlide(notes[i]); + } +} + +// the string str is a whitespace separated list of tokens +// test if str contains a particular token, e.g. "slide" +function hasToken(str, token) +{ + if (str) + { + // define pattern as regular expression + var pattern = /\w+/g; + + // check for matches + // place result in array + var result = str.match(pattern); + + // now check if desired token is present + for (var i = 0; i < result.length; i++) + { + if (result[i] == token) + return true; + } + } + + return false; +} + +function getClassList(element) +{ + if (typeof element.className != 'undefined') + return element.className; + + var clsname = (ns_pos||ie8) ? "class" : "className"; + return element.getAttribute(clsname); +} + +function hasClass(element, name) +{ + var regexp = new RegExp("(^| )" + name + "\W*"); + + if (typeof element.className != 'undefined') + return regexp.test(element.className); + + var clsname = (ns_pos||ie8) ? "class" : "className"; + return regexp.test(element.getAttribute(clsname)); +} + +function removeClass(element, name) +{ + var regexp = new RegExp("(^| )" + name + "\W*"); + var clsval = ""; + + if (typeof element.className != 'undefined') + { + clsval = element.className; + + if (clsval) + { + clsval = clsval.replace(regexp, ""); + element.className = clsval; + } + } + else + { + var clsname = (ns_pos||ie8) ? "class" : "className"; + clsval = element.getAttribute(clsname); + + if (clsval) + { + clsval = clsval.replace(regexp, ""); + element.setAttribute(clsname, clsval); + } + } +} + +function addClass(element, name) +{ + if (!hasClass(element, name)) + { + if (typeof element.className != 'undefined') + element.className += " " + name; + else + { + var clsname = (ns_pos||ie8) ? "class" : "className"; + var clsval = element.getAttribute(clsname); + clsval = clsval ? clsval + " " + name : name; + element.setAttribute(clsname, clsval); + } + } +} + +// wysiwyg editors make it hard to use div elements +// e.g. amaya loses the div when you copy and paste +// this function wraps div elements around implicit +// slides which start with an h1 element and continue +// up to the next heading or div element +function wrapImplicitSlides() +{ + var i, heading, node, next, div; + var headings = document.getElementsByTagName("h1"); + + if (!headings) + return; + + for (i = 0; i < headings.length; ++i) + { + heading = headings[i]; + + if (heading.parentNode != document.body) + continue; + + node = heading.nextSibling; + + div = document.createElement("div"); + addClass(div, "slide"); + document.body.replaceChild(div, heading); + div.appendChild(heading); + + while (node) + { + if (node.nodeType == 1 && // an element + (node.nodeName == "H1" || + node.nodeName == "h1" || + node.nodeName == "DIV" || + node.nodeName == "div")) + break; + + next = node.nextSibling; + node = document.body.removeChild(node); + div.appendChild(node); + node = next; + } + } +} + +// return new array of all slides +function collectSlides() +{ + var slides = new Array(); + var divs = document.body.getElementsByTagName("div"); + + for (var i = 0; i < divs.length; ++i) + { + div = divs.item(i); + + if (hasClass(div, "slide")) + { + // add slide to collection + slides[slides.length] = div; + + // hide each slide as it is found + div.style.display = "none"; + div.style.visibility = "hidden"; + + // add dummy
at end for scrolling hack + var node1 = document.createElement("br"); + div.appendChild(node1); + var node2 = document.createElement("br"); + div.appendChild(node2); + } + else if (hasClass(div, "background")) + { // work around for Firefox SVG reload bug + // which otherwise replaces 1st SVG graphic with 2nd + div.style.display = "block"; + } + } + + return slides; +} + +// return new array of all
+function collectNotes() +{ + var notes = new Array(); + var divs = document.body.getElementsByTagName("div"); + + for (var i = 0; i < divs.length; ++i) + { + div = divs.item(i); + + if (hasClass(div, "handout")) + { + // add slide to collection + notes[notes.length] = div; + + // hide handout notes as they are found + div.style.display = "none"; + div.style.visibility = "hidden"; + } + } + + return notes; +} + +// return new array of all
+// including named backgrounds e.g. class="background titlepage" +function collectBackgrounds() +{ + var backgrounds = new Array(); + var divs = document.body.getElementsByTagName("div"); + + for (var i = 0; i < divs.length; ++i) + { + div = divs.item(i); + + if (hasClass(div, "background")) + { + // add slide to collection + backgrounds[backgrounds.length] = div; + + // hide named backgrounds as they are found + // e.g. class="background epilog" + if (getClassList(div) != "background") + { + div.style.display = "none"; + div.style.visibility = "hidden"; + } + } + } + + return backgrounds; +} + +// show just the backgrounds pertinent to this slide +function syncBackground(slide) +{ + var background; + var bgColor; + + if (slide.currentStyle) + bgColor = slide.currentStyle["backgroundColor"]; + else if (document.defaultView) + { + var styles = document.defaultView.getComputedStyle(slide,null); + + if (styles) + bgColor = styles.getPropertyValue("background-color"); + else // broken implementation probably due Safari or Konqueror + { + //alert("defective implementation of getComputedStyle()"); + bgColor = "transparent"; + } + } + else + bgColor == "transparent"; + + if (bgColor == "transparent") + { + var slideClass = getClassList(slide); + + for (var i = 0; i < backgrounds.length; i++) + { + background = backgrounds[i]; + + var bgClass = getClassList(background); + + if (matchingBackground(slideClass, bgClass)) + { + background.style.display = "block"; + background.style.visibility = "visible"; + } + else + { + background.style.display = "none"; + background.style.visibility = "hidden"; + } + } + } + else // forcibly hide all backgrounds + hideBackgrounds(); +} + +function hideBackgrounds() +{ + for (var i = 0; i < backgrounds.length; i++) + { + background = backgrounds[i]; + background.style.display = "none"; + background.style.visibility = "hidden"; + } +} + +// compare classes for slide and background +function matchingBackground(slideClass, bgClass) +{ + if (bgClass == "background") + return true; + + // define pattern as regular expression + var pattern = /\w+/g; + + // check for matches and place result in array + var result = slideClass.match(pattern); + + // now check if desired name is present for background + for (var i = 0; i < result.length; i++) + { + if (hasToken(bgClass, result[i])) + return true; + } + + return false; +} + +// left to right traversal of root's content +function nextNode(root, node) +{ + if (node == null) + return root.firstChild; + + if (node.firstChild) + return node.firstChild; + + if (node.nextSibling) + return node.nextSibling; + + for (;;) + { + node = node.parentNode; + + if (!node || node == root) + break; + + if (node && node.nextSibling) + return node.nextSibling; + } + + return null; +} + +// right to left traversal of root's content +function previousNode(root, node) +{ + if (node == null) + { + node = root.lastChild; + + if (node) + { + while (node.lastChild) + node = node.lastChild; + } + + return node; + } + + if (node.previousSibling) + { + node = node.previousSibling; + + while (node.lastChild) + node = node.lastChild; + + return node; + } + + if (node.parentNode != root) + return node.parentNode; + + return null; +} + +// HTML elements that can be used with class="incremental" +// note that you can also put the class on containers like +// up, ol, dl, and div to make their contents appear +// incrementally. Upper case is used since this is what +// browsers report for HTML node names (text/html). +function incrementalElementList() +{ + var inclist = new Array(); + inclist["P"] = true; + inclist["PRE"] = true; + inclist["LI"] = true; + inclist["BLOCKQUOTE"] = true; + inclist["DT"] = true; + inclist["DD"] = true; + inclist["H2"] = true; + inclist["H3"] = true; + inclist["H4"] = true; + inclist["H5"] = true; + inclist["H6"] = true; + inclist["SPAN"] = true; + inclist["ADDRESS"] = true; + inclist["TABLE"] = true; + inclist["TR"] = true; + inclist["TH"] = true; + inclist["TD"] = true; + inclist["IMG"] = true; + inclist["OBJECT"] = true; + return inclist; +} + +function nextIncrementalItem(node) +{ + var slide = slides[slidenum]; + + for (;;) + { + node = nextNode(slide, node); + + if (node == null || node.parentNode == null) + break; + + if (node.nodeType == 1) // ELEMENT + { + if (node.nodeName == "BR") + continue; + + if (hasClass(node, "incremental") + && okayForIncremental[node.nodeName]) + return node; + + if (hasClass(node.parentNode, "incremental") + && !hasClass(node, "non-incremental")) + return node; + } + } + + return node; +} + +function previousIncrementalItem(node) +{ + var slide = slides[slidenum]; + + for (;;) + { + node = previousNode(slide, node); + + if (node == null || node.parentNode == null) + break; + + if (node.nodeType == 1) + { + if (node.nodeName == "BR") + continue; + + if (hasClass(node, "incremental") + && okayForIncremental[node.nodeName]) + return node; + + if (hasClass(node.parentNode, "incremental") + && !hasClass(node, "non-incremental")) + return node; + } + } + + return node; +} + +// set visibility for all elements on current slide with +// a parent element with attribute class="incremental" +function setVisibilityAllIncremental(value) +{ + var node = nextIncrementalItem(null); + + while (node) + { + node.style.visibility = value; + node = nextIncrementalItem(node); + } +} + +// reveal the next hidden item on the slide +// node is null or the node that was last revealed +function revealNextItem(node) +{ + node = nextIncrementalItem(node); + + if (node && node.nodeType == 1) // an element + node.style.visibility = "visible"; + + return node; +} + + +// exact inverse of revealNextItem(node) +function hidePreviousItem(node) +{ + if (node && node.nodeType == 1) // an element + node.style.visibility = "hidden"; + + return previousIncrementalItem(node); +} + + +/* set click handlers on all anchors */ +function patchAnchors() +{ + var anchors = document.body.getElementsByTagName("a"); + + for (var i = 0; i < anchors.length; ++i) + { + anchors[i].onclick = clickedAnchor; + } +} + +function clickedAnchor(e) +{ + if (!e) + var e = window.event; + + // compare this.href with location.href + // for link to another slide in this doc + + if (pageAddress(this.href) == pageAddress(location.href)) + { + // yes, so find new slide number + var newslidenum = findSlideNumber(this.href); + + if (newslidenum != slidenum) + { + slide = slides[slidenum]; + hideSlide(slide); + slidenum = newslidenum; + slide = slides[slidenum]; + showSlide(slide); + setLocation(); + } + } + else if (this.target == null) + location.href = this.href; + + this.blur(); + stopPropagation(e); +} + +function pageAddress(uri) +{ + var i = uri.indexOf("#"); + + if (i < 0) + i = uri.indexOf("%23"); + + // check if anchor is entire page + + if (i < 0) + return uri; // yes + + return uri.substr(0, i); +} + +function showSlideNumber() +{ + slideNumElement.innerHTML = "slide".localize() + " " + + (slidenum + 1) + "/" + slides.length; +} + +// every 200mS check if the location has been changed as a +// result of the user activating the Back button/menu item +// doesn't work for Opera < 9.5 +function checkLocation() +{ + var hash = location.hash; + + if (slidenum > 0 && (hash == "" || hash == "#")) + gotoSlide(0); + else if (hash.length > 2 && hash != "#("+(slidenum+1)+")") + { + var num = parseInt(location.hash.substr(2)); + + if (!isNaN(num)) + gotoSlide(num-1); + } +} + +// this doesn't push location onto history stack for IE +// for which a hidden iframe hack is needed: load page into +// the iframe with script that set's parent's location.hash +// but that won't work for standalone use unless we can +// create the page dynamically via a javascript: URL +function setLocation() +{ + var uri = pageAddress(location.href); + var hash = "#(" + (slidenum+1) + ")"; + + if (slidenum >= 0) + uri = uri + hash; + + if (ie && !ie8) + pushHash(hash); + + if (uri != location.href /*&& !khtml */) + location.href = uri; + + if (khtml) + hash = "(" + (slidenum+1) + ")"; + + if (!ie && location.hash != hash && location.hash != "") + location.hash = hash; + + document.title = title + " (" + (slidenum+1) + ")"; + showSlideNumber(); +} + +// only used for IE6 and IE7 +function onFrameLoaded(hash) +{ + location.hash = hash; + var uri = pageAddress(location.href); + location.href = uri + hash; +} + +// history hack with thanks to Bertrand Le Roy +function pushHash(hash) +{ + if (hash == "") hash = "#(1)"; + window.location.hash = hash; + var doc = document.getElementById("historyFrame").contentWindow.document; + doc.open("javascript:''"); + doc.write("hello mum"); + doc.close(); +} + +// find current slide based upon location +// first find target anchor and then look +// for associated div element enclosing it +// finally map that to slide number +function findSlideNumber(uri) +{ + // first get anchor from page location + + var i = uri.indexOf("#"); + + // check if anchor is entire page + + if (i < 0) + return 0; // yes + + var anchor = unescape(uri.substr(i+1)); + + // now use anchor as XML ID to find target + var target = document.getElementById(anchor); + + if (!target) + { + // does anchor look like "(2)" for slide 2 ?? + // where first slide is (1) + var re = /\((\d)+\)/; + + if (anchor.match(re)) + { + var num = parseInt(anchor.substring(1, anchor.length-1)); + + if (num > slides.length) + num = 1; + + if (--num < 0) + num = 0; + + return num; + } + + // accept [2] for backwards compatibility + re = /\[(\d)+\]/; + + if (anchor.match(re)) + { + var num = parseInt(anchor.substring(1, anchor.length-1)); + + if (num > slides.length) + num = 1; + + if (--num < 0) + num = 0; + + return num; + } + + // oh dear unknown anchor + return 0; + } + + // search for enclosing slide + + while (true) + { + // browser coerces html elements to uppercase! + if (target.nodeName.toLowerCase() == "div" && + hasClass(target, "slide")) + { + // found the slide element + break; + } + + // otherwise try parent element if any + + target = target.parentNode; + + if (!target) + { + return 0; // no luck! + } + }; + + for (i = 0; i < slides.length; ++i) + { + if (slides[i] == target) + return i; // success + } + + // oh dear still no luck + return 0; +} + +// find slide name from first h1 element +// default to document title + slide number +function slideName(index) +{ + var name = null; + var slide = slides[index]; + + var heading = findHeading(slide); + + if (heading) + name = extractText(heading); + + if (!name) + name = title + "(" + (index + 1) + ")"; + + name.replace(/\&/g, "&"); + name.replace(/\/g, ">"); + + return name; +} + +// find first h1 element in DOM tree +function findHeading(node) +{ if (!node || node.nodeType != 1) + return null; + + if (node.nodeName == "H1" || node.nodeName == "h1") + return node; + + var child = node.firstChild; + + while (child) + { + node = findHeading(child); + + if (node) + return node; + + child = child.nextSibling; + } + + return null; +} + +// recursively extract text from DOM tree +function extractText(node) +{ + if (!node) + return ""; + + // text nodes + if (node.nodeType == 3) + return node.nodeValue; + + // elements + if (node.nodeType == 1) + { + node = node.firstChild; + var text = ""; + + while (node) + { + text = text + extractText(node); + node = node.nextSibling; + } + + return text; + } + + return ""; +} + + +// find copyright text from meta element +function findCopyright() +{ + var name, content; + var meta = document.getElementsByTagName("meta"); + + for (var i = 0; i < meta.length; ++i) + { + name = meta[i].getAttribute("name"); + content = meta[i].getAttribute("content"); + + if (name == "copyright") + return content; + } + + return null; +} + +function findSizeAdjust() +{ + var name, content, offset; + var meta = document.getElementsByTagName("meta"); + + for (var i = 0; i < meta.length; ++i) + { + name = meta[i].getAttribute("name"); + content = meta[i].getAttribute("content"); + + if (name == "font-size-adjustment") + return 1 * content; + } + + return 1; +} + +function addToolbar() +{ + var slideCounter, page; + + var toolbar = createElement("div"); + toolbar.setAttribute("class", "toolbar"); + + if (ns_pos) // a reasonably behaved browser + { + var right = document.createElement("div"); + right.setAttribute("style", "float: right; text-align: right"); + + slideCounter = document.createElement("div") + slideCounter.innerHTML = "slide".localize() + " n/m"; + right.appendChild(slideCounter); + toolbar.appendChild(right); + + var left = document.createElement("div"); + left.setAttribute("style", "text-align: left"); + + // global end of slide indicator + eos = document.createElement("span"); + eos.innerHTML = "* "; + left.appendChild(eos); + + var help = document.createElement("a"); + help.setAttribute("href", helpPage); + help.setAttribute("title", helpText.localize()); + help.innerHTML = "help?".localize(); + left.appendChild(help); + helpAnchor = help; // save for focus hack + + var gap1 = document.createTextNode(" "); + left.appendChild(gap1); + + var contents = document.createElement("a"); + contents.setAttribute("href", "javascript:toggleTableOfContents()"); + contents.setAttribute("title", "table of contents".localize()); + contents.innerHTML = "contents?".localize(); + left.appendChild(contents); + + var gap2 = document.createTextNode(" "); + left.appendChild(gap2); + + var start = document.createElement("a"); + start.setAttribute("href", "javascript:firstSlide()"); + start.setAttribute("title", "restart presentation".localize()); + start.innerHTML = "restart?".localize(); +// start.setAttribute("href", "javascript:printSlides()"); +// start.setAttribute("title", "print all slides".localize()); +// start.innerHTML = "print!".localize(); + left.appendChild(start); + + var copyright = findCopyright(); + + if (copyright) + { + var span = document.createElement("span"); + span.innerHTML = copyright; + span.style.color = "black"; + span.style.marginLeft = "4em"; + left.appendChild(span); + } + + toolbar.appendChild(left); + } + else // IE so need to work around its poor CSS support + { + toolbar.style.position = (ie7 ? "fixed" : "absolute"); + toolbar.style.zIndex = "200"; + toolbar.style.width = "99.9%"; + toolbar.style.height = "1.2em"; + toolbar.style.top = "auto"; + toolbar.style.bottom = "0"; + toolbar.style.left = "0"; + toolbar.style.right = "0"; + toolbar.style.textAlign = "left"; + toolbar.style.fontSize = "60%"; + toolbar.style.color = "red"; + toolbar.borderWidth = 0; + toolbar.style.background = "rgb(240,240,240)"; + + // would like to have help text left aligned + // and page counter right aligned, floating + // div's don't work, so instead use nested + // absolutely positioned div's. + + var sp = document.createElement("span"); + sp.innerHTML = "  * "; + toolbar.appendChild(sp); + eos = sp; // end of slide indicator + + var help = document.createElement("a"); + help.setAttribute("href", helpPage); + help.setAttribute("title", helpText.localize()); + help.innerHTML = "help?".localize(); + toolbar.appendChild(help); + helpAnchor = help; // save for focus hack + + var gap1 = document.createTextNode(" "); + toolbar.appendChild(gap1); + + var contents = document.createElement("a"); + contents.setAttribute("href", "javascript:toggleTableOfContents()"); + contents.setAttribute("title", "table of contents".localize()); + contents.innerHTML = "contents?".localize(); + toolbar.appendChild(contents); + + var gap2 = document.createTextNode(" "); + toolbar.appendChild(gap2); + + var start = document.createElement("a"); + start.setAttribute("href", "javascript:firstSlide()"); + start.setAttribute("title", "restart presentation".localize()); + start.innerHTML = "restart?".localize(); +// start.setAttribute("href", "javascript:printSlides()"); +// start.setAttribute("title", "print all slides".localize()); +// start.innerHTML = "print!".localize(); + toolbar.appendChild(start); + + var copyright = findCopyright(); + + if (copyright) + { + var span = document.createElement("span"); + span.innerHTML = copyright; + span.style.color = "black"; + span.style.marginLeft = "2em"; + toolbar.appendChild(span); + } + + slideCounter = document.createElement("div") + slideCounter.style.position = "absolute"; + slideCounter.style.width = "auto"; //"20%"; + slideCounter.style.height = "1.2em"; + slideCounter.style.top = "auto"; + slideCounter.style.bottom = 0; + slideCounter.style.right = "0"; + slideCounter.style.textAlign = "right"; + slideCounter.style.color = "red"; + slideCounter.style.background = "rgb(240,240,240)"; + + slideCounter.innerHTML = "slide".localize() + " n/m"; + toolbar.appendChild(slideCounter); + } + + // ensure that click isn't passed through to the page + toolbar.onclick = stopPropagation; + document.body.appendChild(toolbar); + slideNumElement = slideCounter; + setEosStatus(false); + + return toolbar; +} + +function isShownToc() +{ + if (toc && toc.style.visible == "visible") + return true; + + return false; +} + +function showTableOfContents() +{ + if (toc) + { + if (toc.style.visibility != "visible") + { + toc.style.visibility = "visible"; + toc.style.display = "block"; + toc.focus(); + + if (ie7 && slidenum == 0) + setTimeout("ieHack()", 100); + } + else + hideTableOfContents(); + } +} + +function hideTableOfContents() +{ + if (toc && toc.style.visibility != "hidden") + { + toc.style.visibility = "hidden"; + toc.style.display = "none"; + + try + { + if (!opera) + helpAnchor.focus(); + } + catch (e) + { + } + } +} + +function toggleTableOfContents() +{ + if (toc) + { + if (toc.style.visible != "visible") + showTableOfContents(); + else + hideTableOfContents(); + } +} + +// called on clicking toc entry +function gotoEntry(e) +{ + var target; + + if (!e) + var e = window.event; + + if (e.target) + target = e.target; + else if (e.srcElement) + target = e.srcElement; + + // work around Safari bug + if (target.nodeType == 3) + target = target.parentNode; + + if (target && target.nodeType == 1) + { + var uri = target.getAttribute("href"); + + if (uri) + { + //alert("going to " + uri); + var slide = slides[slidenum]; + hideSlide(slide); + slidenum = findSlideNumber(uri); + slide = slides[slidenum]; + lastShown = null; + setLocation(); + setVisibilityAllIncremental("hidden"); + setEosStatus(!nextIncrementalItem(lastShown)); + showSlide(slide); + //target.focus(); + + try + { + if (!opera) + helpAnchor.focus(); + } + catch (e) + { + } + } + } + + hideTableOfContents(e); + if (ie7) ieHack(); + stopPropagation(e); + return cancel(e); +} + +// called onkeydown for toc entry +function gotoTocEntry(event) +{ + var key; + + if (!event) + var event = window.event; + + // kludge around NS/IE differences + if (window.event) + key = window.event.keyCode; + else if (event.which) + key = event.which; + else + return true; // Yikes! unknown browser + + // ignore event if key value is zero + // as for alt on Opera and Konqueror + if (!key) + return true; + + // check for concurrent control/command/alt key + // but are these only present on mouse events? + + if (event.ctrlKey || event.altKey) + return true; + + if (key == 13) + { + var uri = this.getAttribute("href"); + + if (uri) + { + //alert("going to " + uri); + var slide = slides[slidenum]; + hideSlide(slide); + slidenum = findSlideNumber(uri); + slide = slides[slidenum]; + lastShown = null; + setLocation(); + setVisibilityAllIncremental("hidden"); + setEosStatus(!nextIncrementalItem(lastShown)); + showSlide(slide); + //target.focus(); + + try + { + if (!opera) + helpAnchor.focus(); + } + catch (e) + { + } + } + + hideTableOfContents(); + if (ie7) ieHack(); + return cancel(event); + } + + if (key == 40 && this.next) + { + this.next.focus(); + return cancel(event); + } + + if (key == 38 && this.previous) + { + this.previous.focus(); + return cancel(event); + } + + return true; +} + +function isTitleSlide(slide) +{ + return hasClass(slide, "title"); +} + +// create div element with links to each slide +function tableOfContents() +{ + var toc = document.createElement("div"); + addClass(toc, "toc"); + //toc.setAttribute("tabindex", "0"); + + var heading = document.createElement("div"); + addClass(heading, "toc-heading"); + heading.innerHTML = "Table of Contents".localize(); + + heading.style.textAlign = "center"; + heading.style.width = "100%"; + heading.style.margin = "0"; + heading.style.marginBottom = "1em"; + heading.style.borderBottomStyle = "solid"; + heading.style.borderBottomColor = "rgb(180,180,180)"; + heading.style.borderBottomWidth = "1px"; + + toc.appendChild(heading); + var previous = null; + + for (var i = 0; i < slides.length; ++i) + { + var title = hasClass(slides[i], "title"); + var num = document.createTextNode((i + 1) + ". "); + + toc.appendChild(num); + + var a = document.createElement("a"); + a.setAttribute("href", "#(" + (i+1) + ")"); + + if (title) + addClass(a, "titleslide"); + + var name = document.createTextNode(slideName(i)); + a.appendChild(name); + a.onclick = gotoEntry; + a.onkeydown = gotoTocEntry; + a.previous = previous; + + if (previous) + previous.next = a; + + toc.appendChild(a); + + if (i == 0) + toc.first = a; + + if (i < slides.length - 1) + { + var br = document.createElement("br"); + toc.appendChild(br); + } + + previous = a; + } + + toc.focus = function () { + if (this.first) + this.first.focus(); + } + + toc.onmouseup = mouseButtonUp; + + toc.onclick = function (e) { + e||(e=window.event); + + if (selectedTextLen <= 0) + hideTableOfContents(); + + stopPropagation(e); + + if (e.cancel != undefined) + e.cancel = true; + + if (e.returnValue != undefined) + e.returnValue = false; + + return false; + }; + + toc.style.position = "absolute"; + toc.style.zIndex = "300"; + toc.style.width = "60%"; + toc.style.maxWidth = "30em"; + toc.style.height = "30em"; + toc.style.overflow = "auto"; + toc.style.top = "auto"; + toc.style.right = "auto"; + toc.style.left = "4em"; + toc.style.bottom = "4em"; + toc.style.padding = "1em"; + toc.style.background = "rgb(240,240,240)"; + toc.style.borderStyle = "solid"; + toc.style.borderWidth = "2px"; + toc.style.fontSize = "60%"; + + document.body.insertBefore(toc, document.body.firstChild); + return toc; +} + +function replaceByNonBreakingSpace(str) +{ + for (var i = 0; i < str.length; ++i) + str[i] = 160; +} + + +function initOutliner() +{ + var items = document.getElementsByTagName("LI"); + + for (var i = 0; i < items.length; ++i) + { + var target = items[i]; + + if (!hasClass(target.parentNode, "outline")) + continue; + + target.onclick = outlineClick; + + if (!ns_pos) + { + target.onmouseover = hoverOutline; + target.onmouseout = unhoverOutline; + } + + if (foldable(target)) + { + target.foldable = true; + target.onfocus = function () {outline = this;}; + target.onblur = function () {outline = null;}; + + if (!target.getAttribute("tabindex")) + target.setAttribute("tabindex", "0"); + + if (hasClass(target, "expand")) + unfold(target); + else + fold(target); + } + else + { + addClass(target, "nofold"); + target.visible = true; + target.foldable = false; + } + } +} + +function foldable(item) +{ + if (!item || item.nodeType != 1) + return false; + + var node = item.firstChild; + + while (node) + { + if (node.nodeType == 1 && isBlock(node)) + return true; + + node = node.nextSibling; + } + + return false; +} + +function fold(item) +{ + if (item) + { + removeClass(item, "unfolded"); + addClass(item, "folded"); + } + + var node = item ? item.firstChild : null; + + while (node) + { + if (node.nodeType == 1 && isBlock(node)) // element + { + // note that getElementStyle won't work for Safari 1.3 + node.display = getElementStyle(node, "display", "display"); + node.style.display = "none"; + node.style.visibility = "hidden"; + } + + node = node.nextSibling; + } + + item.visible = false; +} + +function unfold(item) +{ + if (item) + { + addClass(item, "unfolded"); + removeClass(item, "folded"); + } + + var node = item ? item.firstChild : null; + + while (node) + { + if (node.nodeType == 1 && isBlock(node)) // element + { + // with fallback for Safari, see above + node.style.display = (node.display ? node.display : "block"); + node.style.visibility = "visible"; + } + + node = node.nextSibling; + } + + item.visible = true; +} + +function outlineClick(e) +{ + var rightclick = false; + var target; + + if (!e) + var e = window.event; + + if (e.target) + target = e.target; + else if (e.srcElement) + target = e.srcElement; + + // work around Safari bug + if (target.nodeType == 3) + target = target.parentNode; + + while (target && target.visible == undefined) + target = target.parentNode; + + if (!target) + return true; + + if (e.which) + rightclick = (e.which == 3); + else if (e.button) + rightclick = (e.button == 2); + + if (!rightclick && target.visible != undefined) + { + if (target.foldable) + { + if (target.visible) + fold(target); + else + unfold(target); + } + + stopPropagation(e); + e.cancel = true; + e.returnValue = false; + } + + return false; +} + +function hoverOutline(e) +{ + var target; + + if (!e) + var e = window.event; + + if (e.target) + target = e.target; + else if (e.srcElement) + target = e.srcElement; + + // work around Safari bug + if (target.nodeType == 3) + target = target.parentNode; + + while (target && target.visible == undefined) + target = target.parentNode; + + if (target && target.foldable) + target.style.cursor = "pointer"; + + return true; +} + +function unhoverOutline(e) +{ + var target; + + if (!e) + var e = window.event; + + if (e.target) + target = e.target; + else if (e.srcElement) + target = e.srcElement; + + // work around Safari bug + if (target.nodeType == 3) + target = target.parentNode; + + while (target && target.visible == undefined) + target = target.parentNode; + + if (target) + target.style.cursor = "default"; + + return true; +} + + +function stopPropagation(e) +{ + if (window.event) + { + window.event.cancelBubble = true; + //window.event.returnValue = false; + } + else if (e) + { + e.cancelBubble = true; + e.stopPropagation(); + //e.preventDefault(); + } +} + +/* can't rely on display since we set that to none to hide things */ +function isBlock(elem) +{ + var tag = elem.nodeName; + + return tag == "OL" || tag == "UL" || tag == "P" || + tag == "LI" || tag == "TABLE" || tag == "PRE" || + tag == "H1" || tag == "H2" || tag == "H3" || + tag == "H4" || tag == "H5" || tag == "H6" || + tag == "BLOCKQUOTE" || tag == "ADDRESS"; +} + +function getElementStyle(elem, IEStyleProp, CSSStyleProp) +{ + if (elem.currentStyle) + { + return elem.currentStyle[IEStyleProp]; + } + else if (window.getComputedStyle) + { + var compStyle = window.getComputedStyle(elem, ""); + return compStyle.getPropertyValue(CSSStyleProp); + } + return ""; +} + +// works with text/html and text/xhtml+xml with thanks to Simon Willison +function createElement(element) +{ + if (typeof document.createElementNS != 'undefined') + { + return document.createElementNS('http://www.w3.org/1999/xhtml', element); + } + + if (typeof document.createElement != 'undefined') + { + return document.createElement(element); + } + + return false; +} + +// designed to work with both text/html and text/xhtml+xml +function getElementsByTagName(name) +{ + if (typeof document.getElementsByTagNameNS != 'undefined') + { + return document.getElementsByTagNameNS('http://www.w3.org/1999/xhtml', name); + } + + if (typeof document.getElementsByTagName != 'undefined') + { + return document.getElementsByTagName(name); + } + + return null; +} + +/* +// clean alternative to innerHTML method, but on IE6 +// it doesn't work with named entities like   +// which need to be replaced by numeric entities +function insertText(element, text) +{ + try + { + element.textContent = text; // DOM3 only + } + catch (e) + { + if (element.firstChild) + { + // remove current children + while (element.firstChild) + element.removeChild(element.firstChild); + } + + element.appendChild(document.createTextNode(text)); + } +} + +// as above, but as method of all element nodes +// doesn't work in IE6 which doesn't allow you to +// add methods to the HTMLElement prototype +if (HTMLElement != undefined) +{ + HTMLElement.prototype.insertText = function(text) { + var element = this; + + try + { + element.textContent = text; // DOM3 only + } + catch (e) + { + if (element.firstChild) + { + // remove current children + while (element.firstChild) + element.removeChild(element.firstChild); + } + + element.appendChild(document.createTextNode(text)); + } + }; +} +*/ + +function getSelectedText() +{ + try + { + if (window.getSelection) + return window.getSelection().toString(); + + if (document.getSelection) + return document.getSelection().toString(); + + if (document.selection) + return document.selection.createRange().text; + } + catch (e) + { + return ""; + } + return ""; +} diff --git a/website/presentations/qmul-2009-09-17/slidy/unfold-dim.gif b/website/presentations/qmul-2009-09-17/slidy/unfold-dim.gif new file mode 100644 index 0000000..bee5671 Binary files /dev/null and b/website/presentations/qmul-2009-09-17/slidy/unfold-dim.gif differ diff --git a/website/presentations/qmul-2009-09-17/slidy/unfold.gif b/website/presentations/qmul-2009-09-17/slidy/unfold.gif new file mode 100644 index 0000000..0753ae4 Binary files /dev/null and b/website/presentations/qmul-2009-09-17/slidy/unfold.gif differ diff --git a/website/projects/index.html b/website/projects/index.html new file mode 100644 index 0000000..f9014bf --- /dev/null +++ b/website/projects/index.html @@ -0,0 +1,76 @@ + + + + + + 4store - Projects + + + + + +
+
4store
+
+

Projects using 4store

+

4store has only been available outside of Garlik for a short while, but it is already used in a handful of projects. The high-level of standardisation between SPARQL-compliant databases makes migrating existing pure SPARQL apps to 4store simple.

+

If you would like your project included on this page, please contact us with a description of the project and how you're using 4store. Even if you don't want your project listed here, we're still keen to hear how people have been applying the technology.

+
+
DataPatrol
+
Garlik's primary product, used by hundreds of thousands of users. DataPatrol helps people take control of their personal information and protect themselves against identity theft and financial fraud. DataPatrol was originally run from 4store, though it's now been migrated to 5store. [link]
+ + +
Live Social Semantics
+
Live Social Semantics is a social experiment, where the Semantic Web, the Social Web, and the Physical World will come together to create a rich integrated network of information. Acquiring and integrating these heterogeneous, but overlapping, data sources enables a range of novel services to conference attendees.
+
4store running on a single Linux server was used to supply RDF storage and query services for Live Social Semantics at the ESWC2009 conference and Hypertext 2009 conference. [link]
+ +
Market Blended Insight
+
MBI is a project with a clear objective of making a significant performance improvement in UK business to business (B2B) marketing activities in the 5-7 year time frame. The project plans to aggregate a broad range of business information, providing unparallelled insight into UK business activity and develop rich semantic search and navigation tools to allow any business to 'place their sales proposition in front of a prospective buyer' confident of the fact that the recipient has a propensity to buy. [link]
+ +
OpenPSI
+
“What would you build with public data?”. OpenPSI is a new form of community provisioned information service designed to stimulate interaction between: +
    +
  • The research community
  • +
  • Public sector information publishers
  • +
  • The new information intermediaries (mashup creators)
  • +
+ OpenPSI currently holds SICCODE 2003, the Ordnance Survey Administrative Geography and the London, Belfast and Edinburgh Gazettes as RDF inside 4store. [link]
+ +
eRDF
+
eRDF was the runner up in the Billion Triples Challenge for 2009. It's built on a 4store instance runing on Amazon Web Services, they made the 4store AMI image used to build the entry pulbic. [link]
+ +
+
+ + + +
+ + diff --git a/website/publications/garlik-linked-enterprise-data-2010.pdf b/website/publications/garlik-linked-enterprise-data-2010.pdf new file mode 100644 index 0000000..5b4a3db Binary files /dev/null and b/website/publications/garlik-linked-enterprise-data-2010.pdf differ diff --git a/website/publications/harris-ssws09.pdf b/website/publications/harris-ssws09.pdf new file mode 100644 index 0000000..6385654 Binary files /dev/null and b/website/publications/harris-ssws09.pdf differ diff --git a/website/register/index.html b/website/register/index.html new file mode 100644 index 0000000..643bc3b --- /dev/null +++ b/website/register/index.html @@ -0,0 +1,9 @@ + + +404 Not Found + +

Not Found

+

The requested URL /register was not found on this server.

+
+
Apache/2.2.3 (CentOS) Server at 4store.org Port 80
+ diff --git a/website/robots.txt b/website/robots.txt new file mode 100644 index 0000000..3412c2e --- /dev/null +++ b/website/robots.txt @@ -0,0 +1,7 @@ + + +404 Not Found + +

Not Found

+

The requested URL /robots.txt was not found on this server.

+ diff --git a/website/style/main.css b/website/style/main.css new file mode 100644 index 0000000..cf522ac --- /dev/null +++ b/website/style/main.css @@ -0,0 +1,190 @@ +html,body,div,dl,dt,dd,xxxh1,h2,h3,h4,h5,h6,pre,form,fieldset,input,textarea,p,blockquote,th,td{margin:0;padding:0;}table{border-collapse:collapse;border-spacing:0;}fieldset,img{border:0;}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal;}caption,th {text-align:left;} +//h1,h2,h3,h4,h5{border:0;} + +.clearfix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +body { + background-color: #fff; + font: 12px/18px Helvetica, sans-serif; + color: #232F33; +} + +a { + text-decoration: none; + color: #D54672; + cursor: pointer; +} + +a:hover { + color: #CF0072; + text-decoration: underline; +} + +p { + padding-top: 1ex; +} + +h1 { + font-family: Corbel, Helvetica, sans-serif; + font-size: 24px; + line-height: 28px; + font-weight: 500; + padding-top: 0.5ex; + margin-bottom: 0.5ex; + color: #98D555; +} + +h2 { + font-family: Corbel, Helvetica, sans-serif; + padding-top: 1.5ex; + padding-bottom: 0.5ex; + font-size: 20px; + line-height: 22px; + text-align: left; + font-weight: 500; + color: #98D555; +} + +h3 { + font-family: Corbel, Helvetica, sans-serif; + padding-top: 1.5ex; + padding-bottom: 0.5ex; + font-size: 16px; + line-height: 18px; + text-align: left; + font-weight: 500; + color: #98D555; +} + +dt { + font-family: Corbel, Helvetica, sans-serif; + color: #98D555; + font-weight: bold; + font-size: 14px; + padding-top: 1ex; +} + +dd { + padding-left: 2ex; + padding-top: 1ex; + padding-bottom: 1ex; +} + +ul { + padding-left: 2ex; +} + +li { + list-style: square inside; + border-left: 1ex; +} + +#container { + position: relative; + width: 850px; + margin: 0px auto; +} + +.hide { + display: none; +} + +.clear{ + clear: both; + line-height: 0; + height: 0; +} + +#leftCol { + overflow: hidden; + float: left; + width: 60%; +} + +#rightCol { + padding-left: 15px; + margin-top: 25px; + float: right; + width: 38%; + height: 385px; +} + +.profile_page #rightCol { + height: 500px; +} + +.form_error { + color: #CD1843; +} + + + +/* = Header Section +============================================================================ */ + +.header { + padding-top: 16px; + padding-bottom: 16px; + border-bottom: 1px solid #DFE4E6; + overflow: hidden; +} + +.header img { + padding: 0px; + margin: 0px; +} + + +div.leftCol { + margin-top: 10px; +} + +#footer { + top: 20px; + border-top: 1px solid #DFE4E6; + width: 100%; + position: relative; + clear: both; + bottom: 20px; +} + +#footer #foot_nav { + margin: auto; + position: relative; + width: 40%; +} +#footer #foot_nav ul { + width: 100%; + list-style-type: none; +} +#footer #garlik_logo { + float: right; + position: relative; + padding-top: 5px; +} +#footer #foot_nav ul { + margin: 0; + padding: 0; +} +#footer #foot_nav li { + width: 100%; + margin: auto; + padding: 0px; + padding-left: 15px; + text-align: left; + display: inline; + font: 10px/11px Helvetica, sans-serif; +} +#footer #copyright { + top: 5px; + position: relative; + float: left; + color: #525D66; + font: 10px/11px Helvetica, sans-serif; +} diff --git a/website/support/index.html b/website/support/index.html new file mode 100644 index 0000000..efaaead --- /dev/null +++ b/website/support/index.html @@ -0,0 +1,58 @@ + + + + + + 4store - Support + + + + + +
+
4store
+ +
+

Support

+

Documentation

+

the 4store wiki has some basic documentation covering how to build, install and setup 4store.

+

If you would like to contribute the to the documentation effort, please request an account from one of the developers. +

Reach a Human

+

You can get in touch with other 4store users and developers, either on the 4store mailing list, or on #4store on irc.freenode.net.

+

For other contact options please see the contact page.

+
+ +
+
+
Commercial Support
+
We can offer support for your 4store installations. Currently we're offering UK Business hours support with 4 hour response times for £750/machine/year.
+
Other support plans may be available depending on your needs, please contact us for more information.
+
Installation Assistance
+
If you need help installing 4store on your cluster then we can also help. Contact us for futher information.
+
Consultancy
+
If you want features added to 4store then we may be able to help, advise or do some development on your behalf.
+
Contact us if you have something in mind.
+
+ + + +
+ + diff --git a/website/trac/1.0 b/website/trac/1.0 new file mode 100644 index 0000000..f06f98c --- /dev/null +++ b/website/trac/1.0 @@ -0,0 +1,102 @@ + + + + + + + + + + + Error: Not Found – 4store + + + + + + + + + + + + + + +
+ + + +
+ +
+

Error: Not Found

+

No handler matched request to /1.0

+

+ TracGuide — The Trac User and Administration Guide +

+
+
+ + +
+ + \ No newline at end of file diff --git a/website/trac/about/index.html b/website/trac/about/index.html new file mode 100644 index 0000000..d037d42 --- /dev/null +++ b/website/trac/about/index.html @@ -0,0 +1,117 @@ + + + + + + + + + + + About Trac – 4store + + + + + + + + + + + + + + + + + +
+ + + +
+ +
+ + Trac: Integrated SCM & Project Management + +

About Trac

+

Trac is a web-based software project management and bug/issue + tracking system emphasizing ease of use and low ceremony. + It provides an integrated Wiki, an interface to version control + systems, and a number of convenient ways to stay on top of events + and changes within a project. +

+

Trac is distributed under the modified BSD License.
+ The complete text of the license can be found + online + as well as in the COPYING file included in the distribution.

+ + python powered + +

Please visit the Trac open source project: + http://trac.edgewall.org/

+ +
+
+ + +
+ + \ No newline at end of file diff --git a/website/trac/chrome/common/asc.png b/website/trac/chrome/common/asc.png new file mode 100644 index 0000000..486b731 Binary files /dev/null and b/website/trac/chrome/common/asc.png differ diff --git a/website/trac/chrome/common/attachment.png b/website/trac/chrome/common/attachment.png new file mode 100644 index 0000000..a4d2124 Binary files /dev/null and b/website/trac/chrome/common/attachment.png differ diff --git a/website/trac/chrome/common/changeset.png b/website/trac/chrome/common/changeset.png new file mode 100644 index 0000000..31c0356 Binary files /dev/null and b/website/trac/chrome/common/changeset.png differ diff --git a/website/trac/chrome/common/closedticket.png b/website/trac/chrome/common/closedticket.png new file mode 100644 index 0000000..43f7a84 Binary files /dev/null and b/website/trac/chrome/common/closedticket.png differ diff --git a/website/trac/chrome/common/collapsed.png b/website/trac/chrome/common/collapsed.png new file mode 100644 index 0000000..4a2ac19 Binary files /dev/null and b/website/trac/chrome/common/collapsed.png differ diff --git a/website/trac/chrome/common/css/about.css b/website/trac/chrome/common/css/about.css new file mode 100644 index 0000000..dfbb9fb --- /dev/null +++ b/website/trac/chrome/common/css/about.css @@ -0,0 +1,14 @@ +/* About page */ +#content.about p.copyright { color: #999; font-size: 90%; } +#content.about h2 { margin-top: 2em; } +#content.about table { margin-top: 0; width: auto; } +#content.about table th, #content.about table td { font-size: 90%; } +#content.about table th { background: #f7f7f7; font-weight: bold; vertical-align: top; white-space: nowrap; } + +#content.about #plugins tr.disabled th, #content.about #plugins tr.disabled td { color: #999; } +#content.about #plugins td.file { color: #666; } + +#content.about #config th, #content.about #config td { border: 1px solid #ddd; padding: 3px; } +#content.about #config tr.modified { background: #ffd; } +#content.about #config tr.modified td.value { font-style: italic; } +#content.about #config td.doc { padding: 3px 1em; } diff --git a/website/trac/chrome/common/css/code.css b/website/trac/chrome/common/css/code.css new file mode 100644 index 0000000..d2f5acc --- /dev/null +++ b/website/trac/chrome/common/css/code.css @@ -0,0 +1,178 @@ +div.code { + background: #f7f7f7; + border: 1px solid #d7d7d7; + margin: 1em 1.75em; + padding: .25em; + overflow: auto +} + +div.code pre { + margin: 0; + overflow: auto; +} + +table.code { + border: 1px solid #ddd; + border-spacing: 0; + border-top: 0; + border-collapse: collapse; + empty-cells: show; + font-size: 12px; + line-height: 130%; + padding: 0; + margin: 0 auto; + table-layout: fixed; + width: 100%; +} +table.code th { + border-right: 1px solid #d7d7d7; + border-bottom: 1px solid #998; + font-size: 11px; +} +table.code th.lineno { width: 4em } +table.code thead th { + background: #eee; + border-top: 1px solid #d7d7d7; + color: #999; + padding: 0 .25em; + text-align: center; + white-space: nowrap; +} +table.code thead th.content { + text-align: left; +} +table.code thead th.content span.recover { + background: #f7f7f7; + border-left: 1px solid; + border-right: 1px solid; + cursor: pointer; + margin: 0 1em 0 0; + padding: 0 .5em; +} +table.code tbody th { + background: #eed; + color: #886; + font-weight: normal; + padding: 0 .5em; + text-align: right; + vertical-align: top; +} +table.code tbody th :link, table.code tbody th :visited { + border: none; + color: #886; + text-decoration: none; +} +table.code tbody th :link:hover, table.code tbody th :visited:hover { + color: #000; +} +table.code td { + font: normal 11px monospace; + overflow: hidden; + padding: 1px 2px; + vertical-align: top; +} +table.code tr.hilite th { + background: #ccf; +} +table.code tr.hilite td { + background: #ddf; +} +.image-file { background: #eee; padding: .3em } +.image-file img { background: url(../imggrid.png) } + +/* Default */ +.code-block span { font-family: monospace; } + +/* Comments */ +.code-comment, .css_comment, .c_comment, .c_commentdoc, .c_commentline, +.c_commentlinedoc, .h_comment,.pl_commentline, .p_commentblock, +.p_commentline, .hphp_comment, .hphp_commentblock, .hphp_commentline, +.yaml_comment { + color: #998; + font-style: italic; +} + +/* Language keyword */ +.code-keyword, .pl_word { color: #789; font-weight: bold } + +/* Type */ +.code-type, .c_word, .c_word2, .p_classname, .hphp_classname{ + color: #468; + font-weight: bold; +} + +/* Function */ +.code-func, .p_defname { + color: #900; + font-weight: bold; + border-bottom: none; +} + +/* Pre-processor */ +.code-prep, .c_preprocessor, .pl_preprocessor, .yaml_identifier { + color: #999; + font-weight: bold; +} + +/* Language construct */ +.code-lang, .p_word { color: #000; font-weight: bold } + +/* String */ +.code-string, .c_string, .c_stringeol, .css_doublestring, .css_singlestring, +.h_singlestring, .h_doublestring, .pl_string, .pl_string_q, .pl_string_qq, +.pl_string_qr, .pl_string_qw, .pl_string_qx, .pl_backticks, .pl_character, +.p_string, .p_stringeol, .hphp_string, .hphp_stringeol, .hphp_triple, +.hphp_tripledouble, .p_character, .p_triple, .p_tripledouble { + color: #b84; + font-weight: normal; +} + +/* Variable name */ +.code-var { color: #f9f } + +/* SilverCity-specific styles */ +.css_id, .css_class, .css_pseudoclass, .css_tag { color: #900000 } +.css_directive { color: #009000; font-weight: bold } +.css_important { color: blue } +.css_operator { color: #000090; font-weight: bold } +.css_tag { font-weight: bold } +.css_unknown_identifier, .css_unknown_pseudoclass { color: red } +.css_value { color: navy } +.c_commentdockeyword { color: navy; font-weight: bold } +.c_commentdockeyworderror { color: red; font-weight: bold } +.c_character, .c_regex, .c_uuid, .c_verbatim { color: olive } +.c_number { color: #099 } +.h_asp { color: #ff0 } +.h_aspat { color: #ffdf00 } +.h_attribute { color: teal } +.h_attributeunknown { color: red } +.h_cdata { color: #373 } +.h_entity { color: purple } +.h_number { color: #099 } +.h_other { color: purple } +.h_script, .h_tag, .h_tagend { color: navy } +.h_tagunknown { color: red } +.h_xmlend, .h_xmlstart { color: blue } +.pl_datasection { color: olive } +.pl_error { color: red; font-weight: bold } +.pl_hash { color: #000 } +.pl_here_delim, .pl_here_q, .pl_here_qq, .pl_here_qx, .pl_longquote { color: olive } +.pl_number { color: #099 } +.pl_pod { font-style: italic } +.pl_regex, .pl_regsubst { color: olive } +.p_number { color: #099 } +.hphp_character { color: olive } +.hphp_defname { color: #099; font-weight: bold } +.hphp_number { color: #099 } +.hphp_word { color: navy; font-weight: bold } +.yaml_document { color: gray; font-style: italic } +.yaml_keyword { color: #808 } +.yaml_number { color: #800 } +.yaml_reference { color: #088 } +.v_comment { color: gray; font-style: italic } +.v_commentline, .v_commentlinebang { color: red; font-style: italic } +.v_number, .v_preprocessor { color: #099 } +.v_string, .v_stringeol { color: olive } +.v_user{ color: blue; font-weight: bold } +.v_word, .v_word3 { color: navy; font-weight: bold } +.v_word2 { color: green; font-weight: bold } diff --git a/website/trac/chrome/common/css/diff.css b/website/trac/chrome/common/css/diff.css new file mode 100644 index 0000000..f766eaa --- /dev/null +++ b/website/trac/chrome/common/css/diff.css @@ -0,0 +1,191 @@ +/* Diff preferences */ +#prefs fieldset { margin: 1em .5em .5em; padding: .5em 1em 0 } + +/* Diff/change overview */ +#overview { line-height: 130%; margin-top: 1em; padding: .5em } +#overview dt.property { + font-weight: bold; + padding-right: .25em; + position: absolute; + left: 0; + text-align: right; + width: 7.75em; +} +#overview dd { margin-left: 8em } + +#overview .message { padding: 1em 0 1px } +#overview dd.message p, #overview dd.message ul, #overview dd.message ol, +#overview dd.message pre { margin-bottom: 1em; margin-top: 0; } + +/* Colors for change types */ +.chglist .edit, #overview .mod, .diff .legend .mod { background: #fd8 } +.chglist .delete, #overview .rem, .diff .legend .rem { background: #f88 } +.chglist .add, #overview .add, .diff .legend .add { background: #bfb } +.chglist .copy, #overview .cp, .diff .legend .cp { background: #88f } +.chglist .move, #overview .mv, .diff .legend .mv { background: #ccc } +.chglist .unknown { background: #fff } + +/* Legend for diff and file colors */ +.legend { + font-size: 9px; + line-height: 1em; + padding: .5em 0; +} +.legend h3 { display: none; } +.legend dt { + background: #fff; + border: 1px solid #999; + float: left; + margin: .1em .5em .1em 0; + overflow: hidden; + width: .8em; height: .8em; +} +.legend dl { + display: inline; + padding: 0; + margin: 0; + margin-right: .5em; +} +.legend dd { + display: inline; + float: left; + padding: 0; + margin: 0; + margin-right: 2em; +} + +#diff-legend { + float: left; + clear: right; + margin: 1em .5em; +} + +#file-legend dd { margin-left: 0; } + +/* Styles for the list of diffs */ +.diff ul.entries { clear: both; margin: 0; padding: 0 } + +.diff li.entry { + background: #f7f7f7; + border: 1px solid #d7d7d7; + list-style-type: none; + margin: 0 0 2em; + padding: 2px; + position: relative; + width: 100%; +} +.diff h2 { + color: #333; + font-size: 14px; + letter-spacing: normal; + margin: 0 auto; + padding: .1em 0 .25em .5em; +} +.diff h2 .switch { color: #999; float: right; font-size: 75%; + line-height: 1.6; +} +.diff h2 .switch span { border-left: 1px solid #ccc; cursor: pointer; + padding: 0 1em; +} +.diff h2 .switch span:first-child { border: none; } +.diff h2 .switch span.active { color: #333; cursor: default; } + +/* Styles for the actual diff tables (side-by-side and inline) */ +.diff table.trac-diff { + border: 1px solid #ddd; + border-spacing: 0; + border-top: 0; + empty-cells: show; + font-size: 12px; + line-height: 130%; + padding: 0; + margin: 0 auto; + table-layout: fixed; + width: 100%; +} +.diff table.trac-diff col.lineno { width: 4em } +.diff table.trac-diff th { + border-right: 1px solid #d7d7d7; + border-bottom: 1px solid #998; + font-size: 11px; +} +.diff table.trac-diff thead th { + background: #eee; + border-top: 1px solid #d7d7d7; + color: #999; + padding: 0 .25em; + text-align: center; + white-space: nowrap; +} +.diff table.trac-diff tbody th { + background: #eed; + color: #886; + font-weight: normal; + padding: 0 .5em; + text-align: right; + vertical-align: top; +} +.diff table.trac-diff td { + background: #fff; + font: normal 11px monospace; + overflow: visible; + padding: 1px 2px; + vertical-align: top; +} +.diff table.trac-diff tbody.skipped td, .diff table.trac-diff thead td { + background: #f7f7f7; + border: 1px solid #d7d7d7; +} +.diff td ins, .diff td del {text-decoration: none;} + +/* Styles for the inline diff */ +pre.diff .rem { background: #fdd; } +pre.diff .add { background: #dfd; } +.diff table.inline tbody.mod td.l, .diff table.inline tbody.rem td.l { + background: #fdd; + border-color: #c00; + border-style: solid; + border-width: 0 1px 0 1px; +} +.diff table.inline tbody.mod td.r, .diff table.inline tbody.add td.r { + background: #dfd; + border-color: #0a0; + border-style: solid; + border-width: 0 1px 0 1px; +} +.diff table.inline tbody.mod tr.first td.l, +.diff table.inline tbody.rem tr.first td.l { border-top-width: 1px } +.diff table.inline tbody.mod tr.last td.l, +.diff table.inline tbody.rem tr.last td.l { border-bottom-width: 1px } +.diff table.inline tbody.mod tr.first td.r, +.diff table.inline tbody.add tr.first td.r { border-top-width: 1px } +.diff table.inline tbody.mod tr.last td.r, +.diff table.inline tbody.add tr.last td.r { border-bottom-width: 1px } +.diff table.inline tbody.mod td del { + background: #e99; + color: #000; +} +.diff table.inline tbody.mod td ins { + background: #9e9; + color: #000; +} + +/* Styles for the side-by-side diff */ +.diff table.sidebyside colgroup.content { width: 50% } +.diff table.sidebyside tbody.mod td.l { background: #fe9 } +.diff table.sidebyside tbody.mod td.r { background: #fd8 } +.diff table.sidebyside tbody.add td.l { background: #dfd } +.diff table.sidebyside tbody.add td.r { background: #cfc } +.diff table.sidebyside tbody.rem td.l { background: #f88 } +.diff table.sidebyside tbody.rem td.r { background: #faa } +.diff table.sidebyside tbody.mod del, .diff table.sidebyside tbody.mod ins { + background: #fc0; +} + +/* Styles for the plain-text diff view */ +.diff pre { background: #fff; border: 1px solid #ddd; font-size: 85%; + margin: 0; +} + +/* Styles for the property diffs */ +.diff table.props td { padding: 2px 0.5em } diff --git a/website/trac/chrome/common/css/prefs.css b/website/trac/chrome/common/css/prefs.css new file mode 100644 index 0000000..a844e44 --- /dev/null +++ b/website/trac/chrome/common/css/prefs.css @@ -0,0 +1,25 @@ +#content.prefs #tabs { list-style: none; margin: 2em 1em 0; padding: 1px; } +#content.prefs #tabs li { background: #e6e6e6; border: 1px solid; + border-color: #ccc #666 #ccc #ccc; color: #666; position: relative; + bottom: -1px; float: left; font-size: 90%; margin: 0 .5em; + padding: .2em 1em .3em; +} +#content.prefs #tabs :link, #content.prefs #tabs :visited { + border: none; color: #999; +} +#content.prefs #tabs :link:hover, #content.prefs #tabs :visited:hover { + background: transparent; color: #333; +} +#content.prefs #tabs li.active { background: #fff; + border-bottom: 1px solid #fff; +} +#content.prefs #tabs #tab_advanced { float: right; } +#content.prefs #tabcontent { background: url(../vgradient.png) 0 1px repeat-x; + border-top: 1px solid #ccc; clear: left; padding: 20px 5px; +} +* html #content.prefs #tabcontent { padding-top: 0; } + +#content.prefs div.field { margin-bottom: 1em; } +#content.prefs tr.field th { text-align: right; vertical-align: middle; + white-space: nowrap; +} diff --git a/website/trac/chrome/common/css/report.css b/website/trac/chrome/common/css/report.css new file mode 100644 index 0000000..20ca22e --- /dev/null +++ b/website/trac/chrome/common/css/report.css @@ -0,0 +1,165 @@ +@import url(code.css); + +#prefs .buttons { margin-top: 0 } +#prefs fieldset { + margin-left: 1em; + border: 1px dotted #dfdfdf; +} +#prefs fieldset legend { + margin: 0; + padding: 2px; +} + +h1 .numrows, h2 .numrows { + margin-left: 1em; + color: #999; + font-size: 65%; + font-weight: normal; +} +h2.report-result { + background: #f7f7f7; + border-bottom: 1px solid #d7d7d7; + margin: 2em 0 0; + padding: 0 .33em; +} +#report-descr { margin: 0 2em; font-size: 90% } +#report-notfound { margin: 2em; font-size: 110% } +#content.report .field { margin: 1em 0; } +#content.report .field label { padding-bottom: .3em; } + +#query { clear: right } +#query fieldset, #query fieldset input, #query fieldset select { font-size: 11px } +#query fieldset input[type="button"] { padding: 0.1em 0.5em } +#query fieldset { margin-top: 1em } +#query fieldset.collapsed { + border-width: 0; + margin-bottom: 0pt; + padding: 0pt .5em; +} +#query .option, #query .option input, #query .option select { font-size: 11px } +#query .option { float: left; line-height: 2em; margin: .9em 2.5em 0 .5em; padding: 0 0 .1em } +#query .buttons { float: right; margin-top: .5em } +#query .buttons input { margin: .5em } +#query hr { clear: both; margin: 0; visibility: hidden } + +#filters table { width: 100% } +#filters td.trac-clause { padding: 0 } +#filters td .trac-clause-lsep { + float: left; + width: 47%; + line-height: 50%; +} +#filters td .trac-clause-msep { + float: left; + text-align: center; + width: 5%; +} +#filters td .trac-clause-rsep { + float: right; + width: 47%; + line-height: 50%; +} +#filters td hr { + margin: 1px; + visibility: visible +} + +#filters tr { height: 2em } +#filters th, #filters td { padding: 0 .2em; vertical-align: middle } +#filters th { font-size: 11px; text-align: right; white-space: nowrap; } +#filters td label { font-size: 11px } +#filters td.mode { text-align: right } +#filters td.filter { width: 100% } +#filters td.filter label.control { padding-right: 1em } +#filters td.and { white-space: nowrap } +#filters td.or { text-align: right; white-space: nowrap } +#filters div.inlinebuttons { display: inline } + +#columns div label { + display: block; + float: left; + padding: 0pt 1em .5em 0pt; +} + +/* Styles for the report list and the report results table + (extends the styles for "table.listing") */ +.reports td.title { width: 100%; white-space: normal; } +.reports td.action { white-space: nowrap; } +.tickets tbody:first-child tr.trac-group h2 { margin-top: 0; } +.tickets tr.trac-group { border: none; } +.tickets tr.trac-group:hover { background: none !important; } +.tickets tr.trac-group th { background: none; border: none; padding: 0 0 1em; } +.tickets tr.trac-columns th { background: #f7f7f0 } +.tickets tr.trac-columns th { + border: 1px solid #d7d7d7; + border-bottom-color: #999; + font-size: 11px; + font-weight: bold; + padding: 2px .5em; + vertical-align: bottom; + white-space: nowrap; +} +.tickets tr.trac-columns th :link:hover, .tickets tr.trac-columns th :visited:hover { + background-color: transparent; +} +.tickets tr.trac-columns th a { border: none; padding-right: 12px } +.tickets tr.trac-columns th, .reports tr.trac-columns th { + text-transform: capitalize; + white-space: nowrap; +} +.tickets tbody td, .reports tbody td { padding: .1em .5em !important; } +.tickets tbody td a, .reports tbody td a { border-bottom: none } +.tickets tbody td.id :link, .tickets tbody td.id :visited { + font-weight: bold; +} +.tickets tbody td.time a, .tickets tbody td.changetime a { white-space: nowrap } +.tickets tbody tr { border-bottom: 1px solid #ddd } +.tickets tbody tr:hover { background: #eed; color: #000 } +.tickets tr.color1-odd { background: #fdc; border-color: #e88; color: #a22 } +.tickets tr.color1-even { background: #fed; border-color: #e99; color: #a22 } +.tickets tr.color2-odd { background: #ffb; border-color: #eea; color: #880 } +.tickets tr.color2-even { background: #ffd; border-color: #dd8; color: #880 } +.tickets tr.color3-odd { background: #fbfbfb; border-color: #ddd; color: #444 } +.tickets tr.color3-even { background: #f6f6f6; border-color: #ccc; color: #333 } +.tickets tr.color4-odd { background: #e7ffff; border-color: #cee; color: #099 } +.tickets tr.color4-even { background: #dff; border-color: #bee; color: #099 } +.tickets tr.color5-odd { background: #e7eeff; border-color: #cde; color: #469 } +.tickets tr.color5-even { background: #dde7ff; border-color: #cde; color: #469 } +.tickets tr.color6-odd { background: #f0f0f0; border-color: #ddd; color: #888 } +.tickets tr.color6-even { background: #f7f7f7; border-color: #ddd; color: #888 } +.tickets tr.color6-odd a, .color6-even a { color: #b66 } +.tickets tbody tr.fullrow td, .tickets tbody td.fullrow { + border: none; + color: #333; + background: transparent; + padding: 0 1em !important; /* Opera 9 is *very* sensitive with this */ + font-size: 85%; +} +.tickets tbody tr.fullrow:hover { background: transparent !important } +.tickets .fullrow :link, .tickets .fullrow :visited { display: inline } +.tickets .fullrow .meta { color: #999; } +.tickets .fullrow hr { display: none } + +/* Query results table */ + +table.tickets tbody tr.added td { font-weight: bold } +table.tickets tbody tr.changed td { font-style: italic } +table.tickets tbody tr.removed td { color: #999 } +table.tickets tbody tr.prio1 { background: #fdc; border-color: #e88 } +table.tickets tbody tr.even.prio1 { background: #fed; border-color: #e99 } +table.tickets tbody tr.prio2 { background: #ffb; border-color: #eea } +table.tickets tbody tr.even.prio2 { background: #ffd; border-color: #dd8 } +table.tickets tbody tr.prio3 { background: #fbfbfb; border-color: #ddd } +table.tickets tbody tr.even.prio3 { background: #f6f6f6; border-color: #ccc } +table.tickets tbody tr.prio4 { background: #e7ffff; border-color: #cee } +table.tickets tbody tr.even.prio4 { background: #dff; border-color: #bee } +table.tickets tbody tr.prio5 { background: #e7eeff; border-color: #cde } +table.tickets tbody tr.even.prio5 { background: #dde7ff } +table.tickets tbody tr.prio6 { background: #f0f0f0; border-color: #ddd } +table.tickets tbody tr.even.prio6 { background: #f7f7f7 } +table.tickets tbody tr.fullrow th { + border: none; + vertical-align: middle; + text-align: center; + font-size: 85%; +} diff --git a/website/trac/chrome/common/css/roadmap.css b/website/trac/chrome/common/css/roadmap.css new file mode 100644 index 0000000..c6933d5 --- /dev/null +++ b/website/trac/chrome/common/css/roadmap.css @@ -0,0 +1,91 @@ +/* General styles for the progress bars */ +table.progress { + border: 1px solid #d7d7d7; + border-collapse: collapse; + border-spacing: 0; + float: left; + margin: 0; + padding: 0; + empty-cells: show; +} +table.progress a, table.progress :link, table.progress :visited, +table.progress :link:hover, table.progress :visited:hover { + border: none; + display: block; + width: 100%; + height: 1.2em; + padding: 0; + margin: 0; + text-decoration: none +} +table.progress td { background: #fff; padding: 0 } +table.progress td.new { background: #f5f5b5 } +table.progress td.closed { background: #bae0ba } +table.progress td :hover { background: none } +p.percent { + line-height: 1.2em; + margin: 0; +} + +/* Styles for the roadmap view */ +.milestones { margin: 2em 0 0; padding: 0 } +.milestone { margin-bottom: 4em } +.milestone .info { white-space: nowrap } +.milestone .info h2 { + background: #f7f7f7; + border-bottom: 1px solid #d7d7d7; + margin: 0; +} +.milestone .info h2 :link, .milestone .info h2 :visited { + color: #000; + display: block; + border-bottom: none; +} +.milestone .info h2 :link:hover, .milestone .info h2 :visited:hover { + color: #000; +} +.milestone .info h2 em { color: #b00; font-style: normal } +.milestone .info .date { + color: #888; + font-size: 11px; + font-style: italic; + margin: 0 0 1em 0; +} +.milestone .info .progress { margin: 0 1em; width: 40em; max-width: 70% } +.milestone .info dl { + font-size: 10px; + font-style: italic; + margin: 1em 1em 2em; + white-space: nowrap; + clear: left; +} +.milestone .info dt { display: inline; margin-left: .5em } +.milestone .info dd { display: inline; margin: 0 1em 0 .5em } +.milestone .description { margin-left: 1em } + +/* Styles for the milestone view */ +.milestone .date { color: #888; font-style: italic; margin: 0 } +.milestone .description { margin: 1em 0 2em } + +/* Styles for the milestone statistics table */ +#stats { float: right; margin: 0 0 2em 2em; width: 400px; max-width: 40% } +#stats legend { white-space: nowrap } +#stats table { border-collapse: collapse; width: 100% } +#stats th, #stats td { font-size: 10px; padding: 0; white-space: nowrap } +#stats th { text-align: right; } +#stats th :link, #stats th :visited { border: none } +#stats td { padding-left: 0.5em; width: 100% } +#stats td table.progress { margin: 3px 1em 3px 0 } +#stats td table.progress td { padding: 0 } +#stats td p.percent { margin-top: 3px } + +/* Styles for the milestone edit form */ +#edit fieldset { margin: 1em 0 } +#edit em { color: #888; font-size: smaller } +#edit .disabled em { color: #d7d7d7 } +#edit .field { margin: 0.5em 0 } +#edit label { padding-left: .2em } +#edit fieldset.iefix { margin-left: 1px; margin-right: 1px } +#edit textarea#description { margin-left: -1px; margin-right: -1px; padding: 0; width: 100% } +#edit .wikitoolbar { margin-left: -1px } +#edit div.trac-resizable { width: 100% } diff --git a/website/trac/chrome/common/css/search.css b/website/trac/chrome/common/css/search.css new file mode 100644 index 0000000..e7fdd53 --- /dev/null +++ b/website/trac/chrome/common/css/search.css @@ -0,0 +1,14 @@ +#content.search .filters { color: #333; font-size: 85%; } + +#content.search form { margin: 1em 0 0 } +#content.search form p { margin: .5em 0 } +#content.search hr { clear: left; margin-bottom: 0 } +#content.search #notfound { margin: 2em; font-size: 110% } + +#content.search #results { margin-right: 3em } +#content.search #results dt { margin: 1.5em 0 0 } +#content.search #results dt a { color: #33c } +#content.search #results dd { font-size: 80%; margin: 0; padding: 0 } +#content.search #results .author, #results .date { color: #090; } + +#content.search #quickjump { font-style: italic; font-weight: bold; } diff --git a/website/trac/chrome/common/css/ticket.css b/website/trac/chrome/common/css/ticket.css new file mode 100644 index 0000000..163ded9 --- /dev/null +++ b/website/trac/chrome/common/css/ticket.css @@ -0,0 +1,144 @@ +@import url(code.css); + +#content.ticket { + width: 58em; + max-width: 100%; + margin-left: auto; + margin-right: auto; +} + +#field-description-help { float: right } +#properties div.trac-resizable, #field-description { width: 100% } + +#ticket { + background: #ffd; + border: 1px outset #996; + margin-top: 1em; + padding: .5em 1em; + position: relative; +} + +#ticket.ticketdraft { + background: #f8f8f8 url(../draft.png); +} +#ticketchange.ticketdraft { + padding: 0 1em; + margin: 1em 0; +} +#ticketchange.ticketdraft h3 { + margin-top: .5em; +} +.preview-notice { font-weight: bold; } + +.ticketdraft { + background: #f8f8f8 url(../draft.png); + border: 1px outset #996; + padding: 0 .2em; +} + +h1 .status { color: #444; } +#ticket h2.summary { margin: 0 0 .8em 0 } +#ticket .date { color: #996; float: right; font-size: 85%; position: relative } +#ticket .date p { margin: .3em } + +#ticket table.properties { + clear: both; + border-top: 1px solid #dd9; + border-collapse: collapse; + table-layout: fixed; + width: 100%; +} +#ticket table.properties tr { border-bottom: 1px dotted #eed } +#ticket table.properties td, #ticket table.properties th { + font-size: 80%; + padding: .5em 1em; + vertical-align: top; +} +#ticket table.properties th { + color: #663; + font-weight: normal; + text-align: left; + width: 20%; +} +#ticket table.properties td { width: 30% } +#ticket table.properties td p:first-child { margin-top: 0 } +#ticket table.properties td p:last-child { margin-bottom: 0 } +#ticket table.properties .description { border-top: 1px solid #dd9 } + +#ticket .description h3 { + border-bottom: 1px solid #dd9; + color: #663; + font-size: 100%; + font-weight: normal; +} +#ticket .description h3 .lastmod { + font-size: 90%; +} +#ticket .inlinebuttons { + float: right; + position: relative; + bottom: 0.3em; + margin-left: 0.2em; +} + +#changelog { border: 1px outset #996; padding: 1em } +.trac-shade { background-color: #eee } +#trac-comment-editor { margin-left: 2em; margin-bottom: 1em } +#trac-comment-editor div.trac-resizable { width: 100% } +#trac-comment-editor textarea { + background: #ffffe0; + margin-left: -1px; + margin-right: -1px; + width: 100%; +} +#trac-comment-editor .wikitoolbar { margin-left: -1px } +#trac-add-comment :link, #trac-add-comment :visited { color: #b00 } +#changelog h3, #ticketchange h3 { + border-bottom: 1px solid #d7d7d7; + color: #999; + font-size: 100%; + font-weight: normal; +} +.threading, #changelog .inlinebuttons { float: right; margin-left: 0.2em } +.threading { font-size: 85%; } +.threading :link, .threading :visited { border-bottom: 0 } +#changelog .trac-lastedit { + padding-left: 2.5em; + color: #999; + font-size: 80%; +} +#changelog .trac-lastedit :link, #changelog .trac-lastedit :visited { color: inherit } + +#changelog .changes, #ticketchange .changes { list-style: square; margin-left: 2em; padding: 0 } +#changelog .comment, #ticketchange .comment { margin-left: 2em } + +form .field { margin-top: .75em; width: 100% } +form .field fieldset.iefix { margin-left: 1px; margin-right: 1px } +label[for=comment] { float: right } +#comment { margin-left: -1px; margin-right: -1px; padding: 0; width: 100% } +form .field .wikitoolbar { margin-left: -1px } +form .field div.trac-resizable { width: 100% } + +#properties { white-space: nowrap; line-height: 160%; padding: .5em } +#properties table { border-spacing: 0; width: 100%; padding: 0 .5em } +#properties table th { + padding: .4em; + text-align: right; + width: 20%; + vertical-align: top; +} +#properties table th.col2 { border-left: 1px dotted #d7d7d7 } +#properties table td { vertical-align: middle; width: 30% } +#properties table td.fullrow { vertical-align: middle; width: 80% } + +#action { line-height: 2em } + +fieldset.radio { border: none; margin: 0; padding: 0 } +fieldset.radio legend { + color: #000; + float: left; + font-size: 100%; + font-weight: normal; + padding: 0 1em 0 0; +} +fieldset.radio label { padding-right: 1em } diff --git a/website/trac/chrome/common/css/timeline.css b/website/trac/chrome/common/css/timeline.css new file mode 100644 index 0000000..df9b107 --- /dev/null +++ b/website/trac/chrome/common/css/timeline.css @@ -0,0 +1,89 @@ +/* Timeline */ + +* html #prefs { width: 34em } /* Set width only for IE */ +#prefs fieldset label { display: block } +#prefs .buttons { margin-top: -1.6em } + +h2 { + background: #f7f7f7; + border-bottom: 1px solid #d7d7d7; + font-size: 105%; + margin: 2em 0 .5em; +} +dl { line-height: 1.3em; margin-left: 1em } +dt { background: 3px 4px no-repeat; padding: 0 } +dt :link, dt :visited { + background: 3px 3px no-repeat; + border: none; + color: #000; + padding: 0 4px 2px 22px; +} +dt>:link, dt>:visited { + /* Hide from IE/Win */ + background-position: 3px 4px; +} +dt :link:hover, dt :visited:hover { background-color: #eed; color: #000 } +dt em { + border-bottom: 1px dotted #bbb; + color: #b00; + font-style: normal; + text-decoration: none; +} +dt .time { color: #999; font-size: 80%; } +dt .author { color: #666; } +dt.highlight { background-color: #ffa; } +dd { + font-size: 80%; + margin: 0 0 .75em 5.5em; + padding: 0; + color: #776; +} + +/* Apply icon background-image twice to avoid hover-flicker in IE/Win */ +dt.changeset, dt.changeset a { background-image: url(../changeset.png) !important } +dt.newticket, dt.newticket a { background-image: url(../newticket.png) !important } +dt.reopenedticket, dt.reopenedticket a { background-image: url(../newticket.png) !important } +dt.editedticket, dt.editedticket a { background-image: url(../editedticket.png) !important } +dt.closedticket, dt.closedticket a { background-image: url(../closedticket.png) !important } +dt.wiki, dt.wiki a { background-image: url(../wiki.png) !important } +dt.milestone, dt.milestone a { background-image: url(../milestone.png) !important } +dt.attachment, dt.attachment a { background-image: url(../attachment.png) !important } + +/* styles for the 'changeset_long_messages' option */ +dd.changeset p { margin: 0; padding: 0 } +dd.changeset ul { padding-left: 15px; } + +/* Styles for the 'changeset_show_files' option */ +dd.changeset .changes { color: #aaa; font-size: 90%; } +dd.changeset ul.changes { + padding-left: 0; + list-style-type: none; +} +dd.changeset .changes li div { + border: 1px solid #999; + float: left; + margin: .5em .5em 0 0; + overflow: hidden; + width: .8em; height: .8em; +} +dd.changeset .changes li span { + float: left; + margin-right: .8em; +} +dd.changeset .changes .add { background: #bfb } +dd.changeset .changes .delete { background: #f88 } +dd.changeset .changes .edit { background: #fd8 } +dd.changeset .changes .copy { background: #88f } +dd.changeset .changes .move { background: #ccc } +dd.changeset .branch { + font-size: 85%; + background: #f6f6f6; + border: 1px solid #ddd; + margin: 0 .5em 0 0; + padding: 0 .2em; + float: left; +} +dd.changeset .head { + background: #d0ffd0; + border: 1px solid #9d9; +} diff --git a/website/trac/chrome/common/css/trac.css b/website/trac/chrome/common/css/trac.css new file mode 100644 index 0000000..ace0968 --- /dev/null +++ b/website/trac/chrome/common/css/trac.css @@ -0,0 +1,634 @@ +body { background: #fff; color: #000; margin: 10px; padding: 0; } +body, th, tr { + font: normal 13px Verdana,Arial,'Bitstream Vera Sans',Helvetica,sans-serif; +} +h1, h2, h3, h4 { + font-family: Arial,Verdana,'Bitstream Vera Sans',Helvetica,sans-serif; + font-weight: bold; + letter-spacing: -0.018em; + page-break-after: avoid; +} +h1 { font-size: 19px; margin: .15em 1em 0.5em 0 } +h2 { font-size: 16px } +h3 { font-size: 14px } +hr { border: none; border-top: 1px solid #ccb; margin: 2em 0 } +address { font-style: normal } +img { border: none } + +.underline { text-decoration: underline } +ol.loweralpha { list-style-type: lower-alpha } +ol.upperalpha { list-style-type: upper-alpha } +ol.lowerroman { list-style-type: lower-roman } +ol.upperroman { list-style-type: upper-roman } +ol.arabic { list-style-type: decimal } + +/* Link styles */ +:link, :visited { + text-decoration: none; + color: #b00; + border-bottom: 1px dotted #bbb; +} +:link:hover, :visited:hover { background-color: #eee; color: #555 } +h1 :link, h1 :visited ,h2 :link, h2 :visited, h3 :link, h3 :visited, +h4 :link, h4 :visited, h5 :link, h5 :visited, h6 :link, h6 :visited { + color: inherit; +} + +/* Heading anchors */ +.anchor:link, .anchor:visited { + border: none; + color: #d7d7d7; + font-size: .8em; + vertical-align: text-top; +} +* > .anchor:link, * > .anchor:visited { + visibility: hidden; +} +h1:hover .anchor, h2:hover .anchor, h3:hover .anchor, +h4:hover .anchor, h5:hover .anchor, h6:hover .anchor, +span:hover .anchor { + visibility: visible; +} + +@media screen { + a.ext-link .icon { + background: url(../extlink.gif) left center no-repeat; + padding-left: 15px; + } + a.mail-link .icon { + background: url(../envelope.png) left center no-repeat; + padding-left: 16px; + } + a.trac-rawlink { + background: url('../download.png') right center no-repeat; + padding-right: 16px; + border-bottom: none; + } +} + +/* Forms */ +input, textarea, select { margin: 2px } +input, select { vertical-align: middle } +input[type=button], input[type=submit], input[type=reset] { + background: #eee; + color: #222; + border: 1px outset #ccc; + padding: .1em .5em; +} +input[type=button]:hover, input[type=submit]:hover, input[type=reset]:hover { + background: #ccb; +} +input[type=button][disabled], input[type=submit][disabled], +input[type=reset][disabled] { + background: #f6f6f6; + border-style: solid; + color: #999; +} +input[type=text], input.textwidget, textarea { border: 1px solid #d7d7d7 } +input[type=text], input.textwidget { padding: .25em .5em } +input[type=text]:focus, input.textwidget:focus, textarea:focus { + border: 1px solid #886; +} +option { border-bottom: 1px dotted #d7d7d7 } +fieldset { border: 1px solid #d7d7d7; padding: .5em; margin: 1em 0 } +p.hint, span.hint { color: #666; font-size: 85%; font-style: italic; margin: .5em 0; + padding-left: 1em; +} +fieldset.iefix { + background: transparent; + border: none; + padding: 0; + margin: 0; +} +* html fieldset.iefix { width: 98% } +fieldset.iefix p { margin: 0 } +legend { color: #999; padding: 0 .25em; font-size: 90%; font-weight: bold } +label.disabled { color: #d7d7d7 } +.buttons { margin: .5em .5em .5em 0 } +.buttons form, .buttons form div { display: inline } +.buttons input { margin: 1em .5em .1em 0 } +.inlinebuttons input { + font-size: 70%; + border-width: 1px; + border-style: dotted; + margin: 0 .1em; + padding: 0.1em; + background: none; +} + +/* Header */ +#header hr { display: none } +#header h1 { margin: 1.5em 0 -1.5em; padding: 0 } +#header img { border: none; margin: 0 0 -3em } +#header :link, #header :visited, #header :link:hover, #header :visited:hover { + background: transparent; + color: #555; + margin-bottom: 2px; + border: none; + padding: 0; +} +#header h1 :link:hover, #header h1 :visited:hover { color: #000 } + +/* Quick search */ +#search { + clear: both; + font-size: 10px; + height: 2.2em; + margin: 0 0 1em; + text-align: right; +} +#search input { font-size: 10px } +#search label { display: none } + +/* Navigation */ +.nav h2, .nav hr { display: none } +.nav ul { + font-size: 10px; + list-style: none; + margin: 0; + text-align: right; +} +.nav li { + border-right: 1px solid #d7d7d7; + display: inline; + padding: 0 .75em; + white-space: nowrap; +} +.nav li.last { border-right: none } + +/* Main navigation bar */ +#mainnav { + background: #fff url(../topbar_gradient.png) 0 0; + border: 1px solid #000; + font: normal 10px verdana,'Bitstream Vera Sans',helvetica,arial,sans-serif; + margin: .66em 0 .33em; + padding: .2em 0; +} +#mainnav li { border-right: none; padding: .25em 0 } +#mainnav :link, #mainnav :visited { + background: url(../dots.gif) 0 0 no-repeat; + border-right: 1px solid #fff; + border-bottom: none; + border-left: 1px solid #555; + color: #000; + padding: .2em 20px; +} +* html #mainnav :link, * html #mainnav :visited { background-position: 1px 0 } +#mainnav :link:hover, #mainnav :visited:hover { + background-color: #ccc; + border-right: 1px solid #ddd; +} +#mainnav .active :link, #mainnav .active :visited { + background: #000 url(../topbar_gradient2.png) 0 0 repeat-x; + border-top: none; + border-right: 1px solid #000; + color: #eee; + font-weight: bold; +} +#mainnav .active :link:hover, #mainnav .active :visited:hover { + border-right: 1px solid #000; +} + +/* Context-dependent navigation links */ +#ctxtnav { min-height: 1em } +#ctxtnav li ul { + background: #f7f7f7; + color: #ccc; + border: 1px solid; + padding: 0; + display: inline; + margin: 0; +} +#ctxtnav li li { padding: 0; } +#ctxtnav li li :link, #ctxtnav li li :visited { padding: 0 1em } +#ctxtnav li li :link:hover, #ctxtnav li li :visited:hover { + background: #bba; + color: #fff; +} + +.trac-nav, .trac-topnav { + float: right; + font-size: 80%; +} +.trac-topnav { + margin-top: 14px; +} + +/* Alternate links */ +#altlinks { clear: both; text-align: center } +#altlinks h3 { font-size: 12px; letter-spacing: normal; margin: 0 } +#altlinks ul { list-style: none; margin: 0; padding: 0 0 1em } +#altlinks li { + border-right: 1px solid #d7d7d7; + display: inline; + font-size: 11px; + line-height: 1.5; + padding: 0 1em; + white-space: nowrap; +} +#altlinks li.last { border-right: none } +#altlinks li :link, #altlinks li :visited { + background-repeat: no-repeat; + color: #666; + border: none; + padding: 0 0 2px; +} +#altlinks li a.ics { + background: url(../ics.png) left center no-repeat; + padding-left: 22px; +} +#altlinks li a.rss { + background: url(../feed.png) left center no-repeat; + padding-left: 20px; +} + +/* Footer */ +#footer { + clear: both; + color: #bbb; + font-size: 10px; + border-top: 1px solid; + height: 31px; + padding: .25em 0; +} +#footer :link, #footer :visited { color: #bbb; } +#footer hr { display: none } +#footer #tracpowered { border: 0; float: left } +#footer #tracpowered:hover { background: transparent } +#footer p { margin: 0 } +#footer p.left { + float: left; + margin-left: 1em; + padding: 0 1em; + border-left: 1px solid #d7d7d7; + border-right: 1px solid #d7d7d7; +} +#footer p.right { + float: right; + text-align: right; +} + +#content { padding-bottom: 2em; position: relative } + +#help { + clear: both; + color: #999; + font-size: 90%; + margin: 1em; + text-align: right; +} +#help :link, #help :visited { cursor: help } +#help hr { display: none } + +/* Section folding */ +.foldable :link, .foldable :visited { + background: url(../expanded.png) 0 50% no-repeat; + border: none; + padding-left: 16px; +} +.foldable :link:hover, .foldable :visited:hover { background-color: transparent } +.collapsed > .foldable :link, .collapsed > .foldable :visited { + background-image: url(../collapsed.png); +} +.collapsed > div, .collapsed > table, .collapsed > ul, .collapsed > dl { display: none } +fieldset > legend.foldable :link, fieldset > legend.foldable :visited { + color: #666; + font-size: 110%; +} + +/* Page preferences form */ +#prefs { + background: #f7f7f0; + border: 1px outset #998; + float: right; + font-size: 9px; + padding: .8em; + position: relative; + margin: 0 1em 1em; +} +* html #prefs { width: 26em } /* Set width only for IE */ +#prefs input, #prefs select { font-size: 9px; vertical-align: middle } +#prefs fieldset { + background: transparent; + border: none; + margin: .5em; + padding: 0; +} +#prefs fieldset legend { + background: transparent; + color: #000; + font-size: 9px; + font-weight: normal; + margin: 0 0 0 -1.5em; + padding: 0; +} +#prefs .buttons { text-align: right } + +/* Version information (browser, wiki, attachments) */ +#info { + margin: 1em 0 0 0; + background: #f7f7f0; + border: 1px solid #d7d7d7; + border-collapse: collapse; + border-spacing: 0; + clear: both; + width: 100%; +} +#info th, #info td { font-size: 85%; padding: 2px .5em; vertical-align: top } +#info th { font-weight: bold; text-align: left; white-space: nowrap } +#info td.message { width: 100% } +#info .message ul { padding: 0; margin: 0 2em } +#info .message p { margin: 0; padding: 0 } + +/* Wiki */ +.wikipage { padding-left: 18px } +.wikipage h1, .wikipage h2, .wikipage h3 { margin-left: -18px } +.wikipage table h1, .wikipage table h2, .wikipage table h3 { margin-left: 0px } +div.compact > p:first-child { margin-top: 0 } +div.compact > p:last-child { margin-bottom: 0 } + +a.missing:link, a.missing:visited, a.missing, span.missing, +a.forbidden, span.forbidden { color: #998 } +a.missing:hover { color: #000 } +a.closed:link, a.closed:visited, span.closed { text-decoration: line-through } + +/* User-selectable styles for blocks */ +.important { + background: #fcb; + border: 1px dotted #d00; + color: #500; + padding: 0 .5em 0 .5em; + margin: .5em; +} + +dl.wiki dt { font-weight: bold } +dl.compact dt { float: left; padding-right: .5em } +dl.compact dd { margin: 0; padding: 0 } + +pre.wiki, pre.literal-block { + background: #f7f7f7; + border: 1px solid #d7d7d7; + margin: 1em 1.75em; + padding: .25em; + overflow: auto; +} + +blockquote.citation { + margin: -0.6em 0; + border-style: solid; + border-width: 0 0 0 2px; + padding-left: .5em; + border-color: #b44; +} +.citation blockquote.citation { border-color: #4b4; } +.citation .citation blockquote.citation { border-color: #44b; } +.citation .citation .citation blockquote.citation { border-color: #c55; } + +table.wiki { + border: 1px solid #ccc; + border-collapse: collapse; + border-spacing: 0; +} +table.wiki td { border: 1px solid #ccc; padding: .1em .25em; } +table.wiki th { + border: 1px solid #bbb; + padding: .1em .25em; + background-color: #f7f7f7; +} + +.wikitoolbar { + margin-top: 0.3em; + margin-left: 2px; + border: solid #d7d7d7; + border-width: 1px 1px 1px 0; + height: 18px; + width: 234px; +} +.wikitoolbar :link, .wikitoolbar :visited { + background: transparent url(../edit_toolbar.png) no-repeat; + border: 1px solid #fff; + border-left-color: #d7d7d7; + cursor: default; + display: block; + float: left; + width: 24px; + height: 16px; +} +.wikitoolbar :link:hover, .wikitoolbar :visited:hover { + background-color: transparent; + border: 1px solid #fb2; +} +.wikitoolbar a#em { background-position: 0 0 } +.wikitoolbar a#strong { background-position: 0 -16px } +.wikitoolbar a#heading { background-position: 0 -32px } +.wikitoolbar a#link { background-position: 0 -48px } +.wikitoolbar a#code { background-position: 0 -64px } +.wikitoolbar a#hr { background-position: 0 -80px } +.wikitoolbar a#np { background-position: 0 -96px } +.wikitoolbar a#br { background-position: 0 -112px } +.wikitoolbar a#img { background-position: 0 -128px } + +/* Textarea resizer */ +div.trac-resizable { display: table; width: 1px } +div.trac-resizable > div { display: table-cell } +div.trac-resizable textarea { display: block; margin-bottom: 0 } +div.trac-grip { + height: 5px; + overflow: hidden; + background: #eee url(../grip.png) no-repeat center 1px; + border: 1px solid #ddd; + border-top-width: 0; + cursor: s-resize; +} + +/* Styles for the form for adding attachments. */ +#attachment .field { margin-top: 1.3em } +#attachment label { padding-left: .2em } +#attachment fieldset { margin-top: 2em } +#attachment fieldset .field { float: left; margin: 0 1em .5em 0 } +#attachment .options { float: left; padding: 0 0 1em 1em } +#attachment br { clear: left } +.attachment #preview { margin-top: 1em } + +/* Styles for the list of attachments. */ +#attachments > div { border: 1px outset #996; padding: 1em } +#attachments .attachments { margin-left: 2em; padding: 0 } +#attachments dt { display: list-item; list-style: square; } +#attachments dd { font-style: italic; margin-left: 0; padding-left: 0; } + +/* Styles for tabular listings such as those used for displaying directory + contents and report results. */ +table.listing { + clear: both; + border-bottom: 1px solid #d7d7d7; + border-collapse: collapse; + border-spacing: 0; + margin-top: 1em; + width: 100%; +} +table.listing th { text-align: left; padding: 0 1em .1em 0; font-size: 12px } +table.listing thead tr { background: #f7f7f0 } +table.listing thead th { + border: 1px solid #d7d7d7; + border-bottom-color: #999; + font-size: 11px; + font-weight: bold; + padding: 2px .5em; + vertical-align: bottom; + white-space: nowrap; +} +table.listing thead th :link:hover, table.listing thead th :visited:hover { + background-color: transparent; +} +table.listing thead th a { border: none; padding-right: 12px } +table.listing th.asc a, table.listing th.desc a { + font-weight: bold; + background-position: 100% 50%; + background-repeat: no-repeat; +} +table.listing th.asc a { background-image: url(../asc.png) } +table.listing th.desc a { background-image: url(../desc.png) } +table.listing tbody td, table.listing tbody th { + border: 1px dotted #ddd; + padding: .3em .5em; + vertical-align: top; +} +table.listing tbody td a:hover, table.listing tbody th a:hover { + background-color: transparent; +} +table.listing tbody tr { border-top: 1px solid #ddd } +table.listing tbody tr.even { background-color: #fcfcfc } +table.listing tbody tr.odd { background-color: #f7f7f7 } +table.listing tbody tr:hover { background: #eed !important } +table.listing tbody tr.focus { background: #ddf !important } + +/* Styles for the page history table + (extends the styles for "table.listing") */ +#fieldhist td { padding: 0 .5em } +#fieldhist td.date, #fieldhist td.diff, #fieldhist td.version, +#fieldhist td.author { + white-space: nowrap; +} +#fieldhist td.version { text-align: center } +#fieldhist td.comment { width: 100% } + +/* Auto-completion interface */ +.suggestions { background: #fff; border: 1px solid #886; color: #222; } +.suggestions ul { + font-family: sans-serif; + max-height: 20em; + min-height: 3em; + list-style: none; + margin: 0; + overflow: auto; + padding: 0; + width: 440px; +} +* html .suggestions ul { height: 10em; } +.suggestions li { background: #fff; cursor: pointer; padding: 2px 5px } +.suggestions li.selected { background: #b9b9b9 } + +/* Styles for the error page (and rst errors) */ +#content.error .message, div.system-message { + background: #fdc; + border: 2px solid #d00; + color: #500; + padding: .5em; + margin: 1em 0; +} +#content.error div.message pre, div.system-message pre { + margin-left: 1em; + overflow: hidden; + white-space: normal; +} +div.system-message p { margin: 0; } +div.system-message p.system-message-title { font-weight: bold; } + +#warning.system-message, .warning.system-message { background: #ffb; border: 1px solid #000; } +#warning.system-message li { list-style-type: square; } + +#notice.system-message, .notice.system-message { background: #dfd; border: 1px solid #000; } +#notice.system-message li { list-style-type: square; } + +#content.error form.newticket { display: inline; } +#content.error form.newticket textarea { display: none; } + +#content.error #systeminfo, #content.error #plugins { margin: 1em; width: auto; } +#content.error #systeminfo th, #content.error #systeminfo td, +#content.error #plugins th, #content.error #plugins td { font-size: 90%; } +#content.error #systeminfo th, #content.error #plugins th { background: #f7f7f7; font-weight: bold; } + +#content.error #traceback { margin-left: 1em; } +#content.error #traceback :link, #content.error #traceback :visited { + border: none; +} +#content.error #tbtoggle { font-size: 80%; } +#content.error #traceback div { margin-left: 1em; } +#content.error #traceback h3 { font-size: 95%; margin: .5em 0 0; } +#content.error #traceback :link var, #content.error #traceback :visited var { + font-family: monospace; + font-style: normal; + font-weight: bold; +} +#content.error #traceback span.file { color: #666; font-size: 85%; } +#content.error #traceback ul { list-style: none; margin: .5em 0; padding: 0; } +#content.error #traceback table.code td { white-space: pre; font-size: 90%; } +#content.error #traceback table.code tr.current td { background: #e6e6e6; } +#content.error #traceback table { margin: .5em 0 1em; } +#content.error #traceback th, #content.error #traceback td { + font-size: 85%; padding: 1px; +} +#content.error #traceback th var { + font-family: monospace; + font-style: normal; +} +#content.error #traceback td code { white-space: pre; } +#content.error #traceback pre { font-size: 95%; } + +#content.error #plugins td.file { color: #666; } + +#content .paging { margin: 0 0 2em; padding: .5em 0 0; + font-size: 85%; line-height: 2em; text-align: center; +} +#content .paging .current { + padding: .1em .3em; + border: 1px solid #333; + background: #999; color: #fff; +} + +#content .paging :link, #content .paging :visited { + padding: .1em .3em; + border: 1px solid #666; + background: transparent; color: #666; +} +#content .paging :link:hover, #content .paging :visited:hover { + background: #999; color: #fff; border-color: #333; +} +#content .paging .previous a, +#content .paging .next a { + font-size: 150%; font-weight: bold; border: none; +} +#content .paging .previous a:hover, +#content .paging .next a:hover { + background: transparent; color: #666; +} + +#content h2 .numresults { color: #666; font-size: 90%; } + +/* Styles for search word highlighting */ +@media screen { + .searchword0 { background: #ff9 } + .searchword1 { background: #cfc } + .searchword2 { background: #cff } + .searchword3 { background: #ccf } + .searchword4 { background: #fcf } +} + +@media print { + #header, #altlinks, #footer, #help { display: none } + .nav, form, .buttons form, form .buttons, form .inlinebuttons, + .noprint, .trac-nav, .trac-topnav { + display: none; + } + form.printableform { display: block } +} diff --git a/website/trac/chrome/common/css/wiki.css b/website/trac/chrome/common/css/wiki.css new file mode 100644 index 0000000..77f00c2 --- /dev/null +++ b/website/trac/chrome/common/css/wiki.css @@ -0,0 +1,98 @@ +@import url(code.css); + +#info { margin: 0 0 1em 0 } +#wikipage { clear: both } + +/* Styles for the path of hierarchical pages */ +#pagepath { + font-size: 10px; /* same as .nav ul in trac.css */ + float: left; +} +#pagepath :link, #pagepath :visited { margin: 0 .2em } +#pagepath .first:link, #pagepath .first:visited { color: #998 } +#pagepath .sep { color: #666; padding: 0 .1em } +#pagepath .pathentry { float: left } + +/* Styles for the page editing form */ +.preview-right { + float: right; + width: 50%; + display: block; + margin: 0 0 0 1em; +} +.sidebyside > h2 { margin: .4em 0; } +.sidebyside #preview { margin: 0 0 1em 0; } + +#edit { margin-top: .5em } +#edit #rows { + float: right; + font-size: 80%; + margin: .4em 0 0 0; +} +#edit #rows select { font-size: 90% } +#edit fieldset { margin-left: 1px; margin-right: 1px } +#edit #text { + clear: both; + margin-left: -1px; + margin-right: -1px; + padding: 0; + width: 100%; + min-height: 10em; + resize: vertical; +} +#edit .wikitoolbar { float: left; margin-left: -1px } +#edit div.trac-resizable { clear: both; width: 100% } +#changeinfo { padding: .5em } +#changeinfo .field { float: left; margin: 0 1em .5em 0 } +#changeinfo { clear: both } +#changeinfo br { clear: left } +#changeinfo .options { padding: 0 0 1em 1em } +#changeinfo .options, #changeinfo .buttons { clear: left } +#delete, #rename, #save { margin-left: 3em } +#preview { + background: #f8f8f8 url(../draft.png); + margin: 1em 0 2em; + overflow: auto; +} +#template { vertical-align: middle; padding-top: 1em; } + +/* Diff view */ +#overview .multi { color: #999 } +#overview .ipnr { color: #999; font-size: 80% } +#overview .comment { padding: 1em 0 0 } + +@media print { + th.diff, td.diff { display: none } +} + +/* Styles for the TracGuideToc wikimacro */ +.wiki-toc { + padding: .5em 1em; + margin: 0 0 2em 1em; + float: right; + clear: right; + border: 1px outset #ddc; + background: #ffd; + font-size: 85%; + position: relative; +} +.wiki-toc h4 { font-size: 12px; margin: 0 } +.wiki-toc ul, .wiki-toc ol { list-style: none; padding: 0; margin: 0 } +.wiki-toc ul ul, .wiki-toc ol ol { padding-left: 1.2em } +.wiki-toc li { margin: 0; padding: 0 } +.wiki-toc .active { background: #ff9; position: relative; } + +div.trac-modifiedby { + margin: .3em .5em; + color: #888; + font-size: 80%; + font-style: italic; + text-align: right; + float: right; +} +div.trac-modifiedby :link, div.trac-modifiedby :visited { color: inherit } +div.trac-modifiedby span.trac-print { display: none; } +@media print { + div.trac-modifiedby span { display: none; } + div.trac-modifiedby span.trac-print { display: block; } +} diff --git a/website/trac/chrome/common/desc.png b/website/trac/chrome/common/desc.png new file mode 100644 index 0000000..2070185 Binary files /dev/null and b/website/trac/chrome/common/desc.png differ diff --git a/website/trac/chrome/common/dots.gif b/website/trac/chrome/common/dots.gif new file mode 100644 index 0000000..c6ae052 Binary files /dev/null and b/website/trac/chrome/common/dots.gif differ diff --git a/website/trac/chrome/common/download.png b/website/trac/chrome/common/download.png new file mode 100644 index 0000000..f144b09 Binary files /dev/null and b/website/trac/chrome/common/download.png differ diff --git a/website/trac/chrome/common/draft.png b/website/trac/chrome/common/draft.png new file mode 100644 index 0000000..3d43de0 Binary files /dev/null and b/website/trac/chrome/common/draft.png differ diff --git a/website/trac/chrome/common/edit_toolbar.png b/website/trac/chrome/common/edit_toolbar.png new file mode 100644 index 0000000..1269b3f Binary files /dev/null and b/website/trac/chrome/common/edit_toolbar.png differ diff --git a/website/trac/chrome/common/editedticket.png b/website/trac/chrome/common/editedticket.png new file mode 100644 index 0000000..9d12a91 Binary files /dev/null and b/website/trac/chrome/common/editedticket.png differ diff --git a/website/trac/chrome/common/envelope.png b/website/trac/chrome/common/envelope.png new file mode 100644 index 0000000..a43a3ba Binary files /dev/null and b/website/trac/chrome/common/envelope.png differ diff --git a/website/trac/chrome/common/expanded.png b/website/trac/chrome/common/expanded.png new file mode 100644 index 0000000..4f8a587 Binary files /dev/null and b/website/trac/chrome/common/expanded.png differ diff --git a/website/trac/chrome/common/extlink.gif b/website/trac/chrome/common/extlink.gif new file mode 100644 index 0000000..d47e14c Binary files /dev/null and b/website/trac/chrome/common/extlink.gif differ diff --git a/website/trac/chrome/common/feed.png b/website/trac/chrome/common/feed.png new file mode 100644 index 0000000..fec919d Binary files /dev/null and b/website/trac/chrome/common/feed.png differ diff --git a/website/trac/chrome/common/grip.png b/website/trac/chrome/common/grip.png new file mode 100644 index 0000000..ac6ffcd Binary files /dev/null and b/website/trac/chrome/common/grip.png differ diff --git a/website/trac/chrome/common/guide/basic-workflow.png b/website/trac/chrome/common/guide/basic-workflow.png new file mode 100644 index 0000000..0074ef1 Binary files /dev/null and b/website/trac/chrome/common/guide/basic-workflow.png differ diff --git a/website/trac/chrome/common/guide/original-workflow.png b/website/trac/chrome/common/guide/original-workflow.png new file mode 100644 index 0000000..8213652 Binary files /dev/null and b/website/trac/chrome/common/guide/original-workflow.png differ diff --git a/website/trac/chrome/common/ics.png b/website/trac/chrome/common/ics.png new file mode 100644 index 0000000..69b9193 Binary files /dev/null and b/website/trac/chrome/common/ics.png differ diff --git a/website/trac/chrome/common/imggrid.png b/website/trac/chrome/common/imggrid.png new file mode 100644 index 0000000..d1e60d9 Binary files /dev/null and b/website/trac/chrome/common/imggrid.png differ diff --git a/website/trac/chrome/common/js/auto_preview.js b/website/trac/chrome/common/js/auto_preview.js new file mode 100644 index 0000000..c39451b --- /dev/null +++ b/website/trac/chrome/common/js/auto_preview.js @@ -0,0 +1,60 @@ +// Automatic preview through XHR + +(function($) { + // Enable automatic previewing to