Difference between revisions of "ZIM file format"

From openZIM
Jump to navigation Jump to search
Line 36: Line 36:
Each article in the ZIM file has a directory entry. Since the directory entry has a variable size we have an index pointerlist which is a list of 4-byte offsets. The pointers points to the directory entries.
Each article in the ZIM file has a directory entry. Since the directory entry has a variable size we have an index pointerlist which is a list of 4-byte offsets. The pointers points to the directory entries.


== Index pointer list ==
== Url pointer list (urlPtrPos) ==


The index pointer list is a list of 8 byte offsets to the directory entries. Since directory entries have variable sizes this is needed for random access.
The url pointer list is a list of 8 byte offsets to the directory entries.
The directory entries are always ordered by url. Ordering is simply done by comparing the url strings.
Since directory entries have variable sizes this is needed for random access.


The directory entries are always sorted by title. The title is encoded as [[QUnicode]], which is a custom utf-variant, which supports fast ordering.
== Title pointer list (titlePtrPos) ==


== Cluster pointer list ==
Tie title pointer list is a list of article indexes ordered by title. The title pointer list actually points to entries
in the url pointer list. Note that the title pointers are only 4 bytes. They are not offsets in the file but article numbers.
To get the offset of a article from the title pointer list, you have to look it up in the url pointer list.
 
== Cluster pointer list (clusterPtrPos) ==


The cluster pointer list is a list of 8 byte offsets which point to the data clusters.
The cluster pointer list is a list of 8 byte offsets which point to the data clusters.
== Mime list pointer (mimeListPos) ==
The mime list pointer if a file offset to a list of mime types. The mime types are zero terminated strings. A empty string
marks the end of the mime type list.


== Directory entries ==
== Directory entries ==


length in byte, all types are littlendian
length in byte, all data is little endian.
There are 2 types of directory entries: article entries and redirect entries. If the first two bytes are 0xffff the
directory entrie is a redirect.


=== article entry ===
=== article entry ===
Line 55: Line 68:
! Field Name !! Type !! Offset !! Length !! Description
! Field Name !! Type !! Offset !! Length !! Description
|-
|-
| redirectFlag || boolean || 0 || 1 || 0 for article
| mime || integer || 0 || 2 || mime type number - points to the mime type list
|-
|-
| mime || integer || 1 || 1 || mime type code
| parameter len || || 2 || 1 || length of extra paramters (which are currently unused an hence this is always 0)
|-
|-
| empty || || 2 || 1 || was compression flag, this is now in the cluster header
| namespace || char || 3 || 1 ||
|-
|-
| namespace || char || 3 || 1 ||
| version || integer || 4 || 4 ||
|-
|-
| cluster number || integer || 4 || 4 ||
| cluster number || integer || 8 || 4 ||
|-
|-
| blob number || integer || 8 || 4 ||
| blob number || integer || 12 || 4 ||
|-
|-
| extraLen          || integer || 12 || 2 || length of extra bytes (title and parameter)
| url || string || 16 || zero terminated || string with the url
|-
|-
| title + parameter separated by 0-byte || [[QUnicode]] (title) + custom (parameter, not used in articles) || 14 || specified by extraLen || actual title of article; when parameter is empty, the 0-byte is omitted
| title || string || || zero terminated || string with title or empty; in case it is empty, the url is used as title
|-
|-
| url || || || ||  
| parameter || data || || see extra len || extra parameters
|-
|-
|}
|}
Line 80: Line 93:
! Field Name !! Type !! Offset !! Length !! Description
! Field Name !! Type !! Offset !! Length !! Description
|-
|-
| redirectFlag || boolean || 0 || 1 || 1 for redirect
| mime || integer || 0 || 2 || 0xffff for redirect
|-
|-
| mime || integer || 1 || 1 || unused for redirects
| parameter len || || 2 || 1 || length of extra paramters (which are currently unused an hence this is always 0)
|-
|-
| empty || || 2 || 1 || was compression flag, this is now in the cluster header
| namespace || char || 3 || 1 ||
|-
|-
| namespace || char || 3 || 1 ||
| version || integer || 4 || 4 ||
|-
|-
| redirect index || integer || 4 || 4 ||
| redirect index || integer || 8 || 4 ||
|-
|-
| extraLen          || integer || 8 || 2 || length of extra bytes (title and parameter)
| url || string || 12 || zero terminated || string with the url
|-
|-
| title + parameter separated by 0-byte || [[QUnicode]] (title) + custom (parameter, not used in articles) || 10 || specified by extraLen || actual title of article; when parameter is empty, the 0-byte is omitted
| title || string || || zero terminated || string with title or empty; in case it is empty, the url is used as title
|-
|-
| url || || || ||  
| parameter || data || || see extra len || extra parameters
|-
|-
|}
|}

Revision as of 20:53, 13 September 2010

Schema File Format.png

The ZIM file format is based on the Zeno File Format. It starts with a header, which is described here:

Header

A ZIM file starts with a header. This starts always at offset 0.

Length in byte, all types are littlendian

Field Name Type Offset Length Description
magicNumber integer 0 4 Magic number to recognise the file format, must be 72173914
version integer 4 4 ZIM=5, version of the file format
uuid integer 8 16 unique id of this zim file
articleCount integer 24 4 total number of articles
clusterCount integer 28 4 total number of clusters
urlPtrPos integer 32 8 position of the directory pointerlist orderes by URL
titlePtrPos integer 40 8 position of the directory pointerlist ordered by Title
clusterPtrPos integer 48 8 position of the cluster pointer list
mimeListPos integer 56 8 position of the MIME type list
mainPage integer 64 4 main page or 0xffffffff if no main page
layoutPage integer 68 4 layout page or 0xffffffffff if no layout page

Each article in the ZIM file has a directory entry. Since the directory entry has a variable size we have an index pointerlist which is a list of 4-byte offsets. The pointers points to the directory entries.

Url pointer list (urlPtrPos)

The url pointer list is a list of 8 byte offsets to the directory entries. The directory entries are always ordered by url. Ordering is simply done by comparing the url strings. Since directory entries have variable sizes this is needed for random access.

Title pointer list (titlePtrPos)

Tie title pointer list is a list of article indexes ordered by title. The title pointer list actually points to entries in the url pointer list. Note that the title pointers are only 4 bytes. They are not offsets in the file but article numbers. To get the offset of a article from the title pointer list, you have to look it up in the url pointer list.

Cluster pointer list (clusterPtrPos)

The cluster pointer list is a list of 8 byte offsets which point to the data clusters.

Mime list pointer (mimeListPos)

The mime list pointer if a file offset to a list of mime types. The mime types are zero terminated strings. A empty string marks the end of the mime type list.

Directory entries

length in byte, all data is little endian. There are 2 types of directory entries: article entries and redirect entries. If the first two bytes are 0xffff the directory entrie is a redirect.

article entry

Field Name Type Offset Length Description
mime integer 0 2 mime type number - points to the mime type list
parameter len 2 1 length of extra paramters (which are currently unused an hence this is always 0)
namespace char 3 1
version integer 4 4
cluster number integer 8 4
blob number integer 12 4
url string 16 zero terminated string with the url
title string zero terminated string with title or empty; in case it is empty, the url is used as title
parameter data see extra len extra parameters

redirect entry

Field Name Type Offset Length Description
mime integer 0 2 0xffff for redirect
parameter len 2 1 length of extra paramters (which are currently unused an hence this is always 0)
namespace char 3 1
version integer 4 4
redirect index integer 8 4
url string 12 zero terminated string with the url
title string zero terminated string with title or empty; in case it is empty, the url is used as title
parameter data see extra len extra parameters

Clusters

The clusters contain the actual article data. This file section contain a list of clusters, which contain a list of blobs each. The blob is the data of one specific article. So this blob is adressed by the cluster number and the blob number in this cluster. The cluster number is used to look up the file offset in the cluster pointer list.

The cluster has a starting byte, which indicated, which compresion is used. After this byte, all other data is compressed. Possible values are:

  • 0 default (no compression)
  • 1 none also no compression (inherited from zeno)
  • 2 zip (zlib)
  • 3 bzip2 (currently used in writer)
  • 4 lzma (not implemented in reader or writer due to lack of compression library)

The data area has a list of 4 byte offsets to the blobs counting from the first offset. The offset addresses uncompressed data. The last pointer points to the end of the data area. So there is always one more offset than blobs. Since the first offset points to the start of the first data, the number of offsets can be determined by dividing this offset by 4. The size of one blob is calculated by the difference of two consecutive offsets.

Mime types

Currently these mime types are assigned:

number mime-type
0 text/html
1 text/plain
2 image/jpeg
3 image/png
4 image/tiff
5 text/css
6 image/gif
7 index page
8 application/x-javascript
9 image/x-icon
10 text/xml

Namespaces

Namespaces seperate different types of data stored in the ZIM File Format.

They can be distinguished by prepending the article namespace before the article name in the URL path, eg. http://localhost/A/Articlename.

Namespace Description
- layout, eg. the LayoutPage, CSS, JavaScript and images not related to the articles
A articles - see Article Format
A article meta data - see Article Format
I images, files - see Image Handling
J images, text - see Image Handling
M ZIM metadata - see Metadata
U categories, text - see Category Handling
V categories, article list - see Category Handling
X fulltext index - see ZIM Index Format

Urls

ZIM content have their own urls: /<namespace>/<article_url>.