Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/mwlib/recorddb.py
blob: fe895cfde920a659ab96efbf2440349eb7cb5066 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#! /usr/bin/env python

# Copyright (c) 2007-2008 PediaPress GmbH
# See README.txt for additional licensing information.

import simplejson
import zipfile
from mwlib import uparser, parser
import mwlib.log
log = mwlib.log.Log("zip")


class RecordDB(object):
    def __init__(self, db):
        assert db is not None, "db must not be None"
        self.db = db
        self.articles = {}
        self.templates = {}
        
    def getRawArticle(self, name, revision=None):
        r = self.db.getRawArticle(name, revision=revision)
        self.articles[name] = {
            'revision': revision,
            'content-type': 'text/x-wiki',
            'content': r,
            'url': self.db.getURL(name, revision=revision),
            'authors': self.db.getAuthors(name, revision=revision),
        }
        return r
    
    def getTemplate(self, name, followRedirects=False):
        r = self.db.getTemplate(name, followRedirects=followRedirects)
        self.templates[name] = {
            'content-type': 'text/x-wiki',
            'content': r,
        }
        return r
    

class ZipfileCreator(object):
    def __init__(self, zf, wikidb=None, imgdb=None):
        self.zf = zf
        self.db = RecordDB(wikidb)
        self.images = {}
        self.imgdb = imgdb

    def addObject(self, name, value):
        """
        @type name: unicode
        
        @type value: str
        """
        
        self.zf.writestr(name.encode('utf-8'), value)
    
    def addArticle(self, title, revision=None):
        a = uparser.parseString(title, revision=revision, wikidb=self.db)
        for x in a.allchildren():
            if isinstance(x, parser.ImageLink):
                name = x.target
                self.images[name] = {}
    
    def writeImages(self, size=None):
        if self.imgdb is None:
            return
        
        for name in sorted(self.images.keys()):
            dp = self.imgdb.getDiskPath(name, size=size)
            if dp is None:
                continue
            self.zf.write(dp, (u"images/%s" % name.replace("'", '-')).encode("utf-8"))
            self.images[name]['url'] = self.imgdb.getURL(name, size=size)
            license = self.imgdb.getLicense(name)
            if license:
                self.images[name]['license'] = license
    
    def writeContent(self):
        self.addObject('content.json', simplejson.dumps(dict(
            articles=self.db.articles,
            templates=self.db.templates,
            images=self.images,
        )))