Difference between revisions of "ZIM file format"

Jump to navigation Jump to search
173 bytes added ,  12:20, 6 May 2011
no edit summary
Line 8: Line 8:


{|{{Prettytable}}
{|{{Prettytable}}
! Field Name             !! Type   !!Offset!!Length!! Description
! Field Name !! Type !!Offset!!Length!! Description                
|-
|-
| magicNumber           || integer ||   0 ||   4 || Magic number to recognise the file format, must be 72173914
| magicNumber || integer || 0 || 4 || Magic number to recognise the file format, must be 72173914                  
|-
|-
| version               || integer ||   4 ||   4 || ZIM=5, bytes 1-2: major, bytes 3-4: minor version of the ZIM file format
| version || integer || 4 || 4 || ZIM=5, bytes 1-2: major, bytes 3-4: minor version of the ZIM file format                      
|-
|-
| uuid                   || integer ||   8 ||   16 || unique id of this zim file
| uuid || integer || 8 || 16 || unique id of this zim file                        
|-
|-
| articleCount           || integer ||   24 ||   4 || total number of articles
| articleCount || integer || 24 || 4 || total number of articles                
|-
|-
| clusterCount           || integer ||   28 ||   4 || total number of clusters
| clusterCount || integer || 28 || 4 || total number of clusters                
|-
|-
| urlPtrPos             || integer ||   32 ||   8 || position of the directory pointerlist orderes by URL
| urlPtrPos || integer || 32 || 8 || position of the directory pointerlist orderes by URL                    
|-
|-
| titlePtrPos           || integer ||   40 ||   8 || position of the directory pointerlist ordered by Title
| titlePtrPos || integer || 40 || 8 || position of the directory pointerlist ordered by Title                  
|-
|-
| clusterPtrPos         || integer ||   48 ||   8 || position of the cluster pointer list
| clusterPtrPos || integer || 48 || 8 || position of the cluster pointer list                
|-
|-
| mimeListPos           || integer ||   56 ||   8 || position of the MIME type list (also header size)
| mimeListPos || integer || 56 || 8 || position of the MIME type list (also header size)                  
|-
|-
| mainPage               || integer ||   64 ||   4 || main page or 0xffffffff if no main page
| mainPage || integer || 64 || 4 || main page or 0xffffffff if no main page                    
|-
|-
| layoutPage             || integer ||   68 ||   4 || [[Layout Page|layout page]] or 0xffffffffff if no layout page
| layoutPage || integer || 68 || 4 || [[Layout Page|layout page]] or 0xffffffffff if no layout page                  
|}
|}


Line 39: Line 39:


{|{{Prettytable}}
{|{{Prettytable}}
! Field Name             !! Type   !!Offset!!Length!! Description
! Field Name !! Type !!Offset!!Length!! Description                
|-
|-
| <1st MIME Type>       || string ||   0 ||zero terminated|| declaration of the <1st MIME Type>
| <1st MIME Type> || string || 0 ||zero terminated|| declaration of the <1st MIME Type>            
|-
|-
| <2nd MIME Type>       || string || n/a ||zero terminated|| declaration of the <2nd MIME Type>
| <2nd MIME Type> || string || n/a ||zero terminated|| declaration of the <2nd MIME Type>          
|-
|-
| ...                   || string || ... ||zero terminated|| ...
| ... || string || ... ||zero terminated|| ...                      
|-
|-
| <last entry / end>     || string || n/a ||zero terminated|| empty string - end of MIME type list
| <last entry / end> || string || n/a ||zero terminated|| empty string - end of MIME type list        
|}
|}


Line 58: Line 58:


{|{{Prettytable}}
{|{{Prettytable}}
! Field Name             !! Type   !!Offset!!Length!! Description
! Field Name !! Type !!Offset!!Length!! Description                
|-
|-
| <1st URL>             || integer ||   0 ||   8 || pointer to the directory entry of <1st URL>
| <1st URL> || integer || 0 || 8 || pointer to the directory entry of <1st URL>                    
|-
|-
| <2nd URL>             || integer ||   8 ||   8 || pointer to the directory entry of <2nd URL>
| <2nd URL> || integer || 8 || 8 || pointer to the directory entry of <2nd URL>                    
|-
|-
| <nth URL>             || integer ||(n-1)*8||   8 || pointer to the directory entry of <nth URL>
| <nth URL> || integer ||(n-1)*8|| 8 || pointer to the directory entry of <nth URL>                
|-
|-
| ...                   || integer || ... ||   8 || ...
| ... || integer || ... || 8 || ...                        
|}
|}


Line 77: Line 77:


{|{{Prettytable}}
{|{{Prettytable}}
! Field Name             !! Type   !!Offset!!Length!! Description
! Field Name !! Type !!Offset!!Length!! Description                
|-
|-
| <1st Title>           || integer ||   0 ||   4 || Pointer to the URL pointer of <1st Title>
| <1st Title> || integer || 0 || 4 || Pointer to the URL pointer of <1st Title>                  
|-
|-
| <2nd Title>           || integer ||   4 ||   4 || Pointer to the URL pointer of <2nd Title>
| <2nd Title> || integer || 4 || 4 || Pointer to the URL pointer of <2nd Title>                  
|-
|-
| <nth Title>           || integer ||(n-1)*4||   4 || Pointer to the URL pointer of <nth Title>
| <nth Title> || integer ||(n-1)*4|| 4 || Pointer to the URL pointer of <nth Title>              
|-
|-
| ...                   || integer || ... ||   4 || ...
| ... || integer || ... || 4 || ...                        
|}
|}


Line 99: Line 99:
=== Article Entry ===
=== Article Entry ===
{|{{Prettytable}}
{|{{Prettytable}}
! Field Name             !! Type   !!Offset!!Length!! Description
! Field Name !! Type !!Offset!!Length!! Description                
|-
|-
| mimetype               || integer ||   0 ||   2 || MIME type number as defined in the MIME type list
| mimetype || integer || 0 || 2 || MIME type number as defined in the MIME type list                      
|-
|-
| parameter len         || byte   ||   2 ||   1 || (not used) length of extra paramters
| parameter len || byte || 2 || 1 || (not used) length of extra paramters                    
|-
|-
| namespace             || char   ||   3 ||   1 || defines to which namespace this directory entry belongs
| namespace || char || 3 || 1 || defines to which namespace this directory entry belongs                        
|-
|-
| revision               || integer ||   4 ||   4 || (optional) identifies a revision of the contents of this directory entry, needed to identify updates or revisions in the original history
| revision || integer || 4 || 4 || (optional) identifies a revision of the contents of this directory entry, needed to identify updates or revisions in the original history                      
|-
|-
| cluster number         || integer ||   8 ||   4 || cluster number in which the data of this directory entry is stored
| cluster number || integer || 8 || 4 || cluster number in which the data of this directory entry is stored                
|-
|-
| blob number           || integer ||   12 ||   4 || blob number inside the compressed cluster where the contents are stored
| blob number || integer || 12 || 4 || blob number inside the compressed cluster where the contents are stored                  
|-
|-
| url                   || string ||   16 ||zero terminated|| string with the URL as refered in the URL pointer list
| url || string || 16 ||zero terminated|| string with the URL as refered in the URL pointer list                        
|-
|-
| title                 || string || n/a ||zero terminated|| string with an title as refered in the Title pointer list or empty; in case it is empty, the URL is used as title
| title || string || n/a ||zero terminated|| string with an title as refered in the Title pointer list or empty; in case it is empty, the URL is used as title                    
|-
|-
| parameter             || data   ||     ||see parameter len|| (not used) extra parameters
| parameter || data || ||see parameter len|| (not used) extra parameters                      
|}
|}


=== Redirect Entry ===
=== Redirect Entry ===
{|{{Prettytable}}
{|{{Prettytable}}
! Field Name             !! Type   !!Offset!!Length!! Description
! Field Name !! Type !!Offset!!Length!! Description                
|-
|-
| mimetype               || integer ||   0 ||   2 || 0xffff for redirect
| mimetype || integer || 0 || 2 || 0xffff for redirect                      
|-
|-
| parameter len         || byte   ||   2 ||   1 || (not used) length of extra paramters
| parameter len || byte || 2 || 1 || (not used) length of extra paramters                    
|-
|-
| namespace             || char   ||   3 ||   1 || defines to which namespace this directory entry belongs
| namespace || char || 3 || 1 || defines to which namespace this directory entry belongs                        
|-
|-
| revision               || integer ||   4 ||   4 || (optional) identifies a revision of the contents of this directory entry, needed to identify updates or revisions in the original history
| revision || integer || 4 || 4 || (optional) identifies a revision of the contents of this directory entry, needed to identify updates or revisions in the original history                      
|-
|-
| redirect index         || integer ||   8 ||   4 || pointer to the directory entry of the redirect target
| redirect index || integer || 8 || 4 || pointer to the directory entry of the redirect target                
|-
|-
| url                     || string ||   12 ||zero terminated|| string with the URL as refered in the URL pointer list
| url || string || 12 ||zero terminated|| string with the URL as refered in the URL pointer list                        
|-
|-
| title                 || string || n/a ||zero terminated|| string with an title as refered in the Title pointer list or empty; in case it is empty, the URL is used as title
| title || string || n/a ||zero terminated|| string with an title as refered in the Title pointer list or empty; in case it is empty, the URL is used as title                    
|-
|-
| parameter             || data   ||     ||see parameter len|| (not used) extra parameters
| parameter || data || ||see parameter len|| (not used) extra parameters                      
|}
|}


Line 145: Line 145:


{|{{Prettytable}}
{|{{Prettytable}}
! Field Name             !! Type   !!Offset!!Length!! Description
! Field Name !! Type !!Offset!!Length!! Description                
|-
|-
| <1st Cluster>         || integer ||   0 ||   8 || pointer to the <1st Cluster>
| <1st Cluster> || integer || 0 || 8 || pointer to the <1st Cluster>                
|-
|-
| <1st Cluster>         || integer ||   8 ||   8 || pointer to the <2nd Cluster>
| <1st Cluster> || integer || 8 || 8 || pointer to the <2nd Cluster>                
|-
|-
| <nth Cluster>         || integer ||(n-1)*8||   8 || pointer to the <nth Cluster>
| <nth Cluster> || integer ||(n-1)*8|| 8 || pointer to the <nth Cluster>            
|-
|-
| ...                   || integer || ... ||   8 || ...
| ... || integer || ... || 8 || ...                        
|}
|}


Line 159: Line 159:
The clusters contain the actual data of the directory entries. Clusters can be compressed or uncompressed. The purpose of the clusters are that data of more than one directory entry can be compressed inside one cluster, making the compression much more efficient. Typically clusters have a size of about 1 MB.
The clusters contain the actual data of the directory entries. Clusters can be compressed or uncompressed. The purpose of the clusters are that data of more than one directory entry can be compressed inside one cluster, making the compression much more efficient. Typically clusters have a size of about 1 MB.


The first byte of the cluster identifies if it is compressed (4) or not (0). The default is uncompressed indicated by a value of 0 or 1 (obsoleted, inherited by Zeno) while compressed clusters are indicated by a value of 4 which indicates LZMA2 compression. There have been other compression algorithms used before (2: zlib, 3: bzip2) which have been removed. The zimlib uses [http://tukaani.org/xz/ xz-utils] as a C++ implementation of lzma2, for Java see [http://github.com/abartov/LZMA2-java LZMA2-java].
The first byte of the cluster identifies if it is compressed (4) or not (0). The default is uncompressed indicated by a value of 0 or 1 (obsoleted, inherited by Zeno) while compressed clusters are indicated by a value of 4 which indicates LZMA2 compression. There have been other compression algorithms used before (2: zlib, 3: bzip2) which have been removed. The zimlib uses [http://tukaani.org/xz/ xz-utils] as a C++ implementation of lzma2, for Java see [http://tukaani.org/xz/java.html].


To find the data of a specific directory entry within a cluster the uncompressed cluster has a list of pointers to blobs within the uncompressed cluster after the first byte.
To find the data of a specific directory entry within a cluster the uncompressed cluster has a list of pointers to blobs within the uncompressed cluster after the first byte.


{|{{Prettytable}}
{|{{Prettytable}}
! Field Name             !! Type   !!Offset!!Length!! Description
! Field Name !! Type !!Offset!!Length!! Description                
|-
|-
| compression type       || integer ||   0 ||   1 || 0: default (no compression), 1: none (inherited from Zeno), 4: LZMA2 compressed
| compression type || integer || 0 || 1 || 0: default (no compression), 1: none (inherited from Zeno), 4: LZMA2 compressed              
|-
|-
|colspan=5| The following data bytes have to be uncompressed!
|colspan=5| The following data bytes have to be uncompressed!
|-
|-
| <1st Blob>             || integer ||   1 ||   4 || pointer to the <1st Blob>
| <1st Blob> || integer || 1 || 4 || pointer to the <1st Blob>                    
|-
|-
| <2nd Blob>             || integer ||   5 ||   4 || pointer to the <2nd Blob>
| <2nd Blob> || integer || 5 || 4 || pointer to the <2nd Blob>                    
|-
|-
| <nth Blob>             || integer ||(n-1)*4+1|| 4 || pointer to the <nth Blob>
| <nth Blob> || integer ||(n-1)*4+1|| 4 || pointer to the <nth Blob>            
|-
|-
| ...                   || integer || ... ||   4 || ...
| ... || integer || ... || 4 || ...                        
|-
|-
| <last blob / end>     || integer || n/a ||   4 || pointer to the end of the cluster
| <last blob / end> || integer || n/a || 4 || pointer to the end of the cluster          
|-
|-
| <1st Blob>             || data   || n/a || n/a || data of the <1st Blob>
| <1st Blob> || data || n/a || n/a || data of the <1st Blob>                    
|-
|-
| <2nd Blob>             || data   || n/a || n/a || data of the <2nd Blob>
| <2nd Blob> || data || n/a || n/a || data of the <2nd Blob>                    
|-
|-
| ...                   || data   || ... || n/a || ...
| ... || data || ... || n/a || ...                          
|}
|}


Line 195: Line 195:


{|{{Prettytable}}
{|{{Prettytable}}
! Namespace !! Description  
! Namespace !! Description
|-
|-
| -         || layout, eg. the LayoutPage, CSS, favicon.png (48x48), JavaScript and images not related to the articles
| - || layout, eg. the LayoutPage, CSS, favicon.png (48x48), JavaScript and images not related to the articles        
|-
|-
| A         || articles - see [[Article Format]]
| A || articles - see [[Article Format]]        
|-
|-
| B         || article meta data - see [[Article Format]]
| B || article meta data - see [[Article Format]]        
|-
|-
| I         || images, files - see [[Image Handling]]
| I || images, files - see [[Image Handling]]        
|-
|-
| J         || images, text - see [[Image Handling]]
| J || images, text - see [[Image Handling]]        
|-
|-
| M         || ZIM metadata - see [[Metadata]]
| M || ZIM metadata - see [[Metadata]]        
|-
|-
| U         || categories, text - see [[Category Handling]]
| U || categories, text - see [[Category Handling]]        
|-
|-
| V         || categories, article list - see [[Category Handling]]
| V || categories, article list - see [[Category Handling]]        
|-
|-
| W         || categories per article, category list - see [[Category Handling]]
| W || categories per article, category list - see [[Category Handling]]        
|-
|-
| X         || fulltext index - see [[ZIM Index Format]]
| X || fulltext index - see [[ZIM Index Format]]        
|}
|}


Line 226: Line 226:


=== Local Anchors ===
=== Local Anchors ===
Many articles - especially when a table of contents is used - use local anchors to jump within an article.  
Many articles - especially when a table of contents is used - use local anchors to jump within an article.


<pre>
<pre>

Navigation menu