/+junk/pygooglechart-py3k

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/%2Bjunk/pygooglechart-py3k

« back to all changes in this revision

Viewing changes to pygooglechart.py

  • Committer: gak
  • Date: 2008-09-11 23:52:02 UTC
  • Revision ID: git-v1:1f3559184c106bcd2ec18a65cd3f7f8c06beca53
 - Few fixes for python 3.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
19
19
along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
20
 
21
21
"""
 
22
from __future__ import division
22
23
 
23
24
import os
24
25
import urllib
32
33
# Helper variables and functions
33
34
# -----------------------------------------------------------------------------
34
35
 
35
 
__version__ = '0.2.1'
 
36
__version__ = '0.2.2'
36
37
__author__ = 'Gerald Kaszuba'
37
38
 
38
39
reo_colour = re.compile('^([A-Fa-f0-9]{2,2}){3,4}$')
100
101
    def float_scale_value(cls, value, range):
101
102
        lower, upper = range
102
103
        assert(upper > lower)
103
 
        scaled = (value - lower) * (float(cls.max_value) / (upper - lower))
 
104
        scaled = (value - lower) * (cls.max_value / (upper - lower))
104
105
        return scaled
105
106
 
106
107
    @classmethod
162
163
                else:
163
164
                    raise DataOutOfRangeException()
164
165
            encoded_data.append(','.join(sub_data))
165
 
        return 'chd=t:' + '|'.join(encoded_data)
 
166
        return 'chd=t:' + '%7c'.join(encoded_data)
166
167
 
167
168
    @classmethod
168
169
    def scale_value(cls, value, range):
257
258
        self.values = [str(a) for a in values]
258
259
 
259
260
    def __repr__(self):
260
 
        return '%i:|%s' % (self.axis_index, '|'.join(self.values))
 
261
        return '%i:%%7c%s' % (self.axis_index, '%7c'.join(self.values))
261
262
 
262
263
 
263
264
class RangeAxis(Axis):
301
302
        self.height = height
302
303
        self.data = []
303
304
        self.set_title(title)
 
305
        self.set_title_style(None, None)
304
306
        self.set_legend(legend)
305
307
        self.set_legend_position(None)
306
308
        self.set_colours(colours)
345
347
        # optional arguments
346
348
        if self.title:
347
349
            url_bits.append('chtt=%s' % self.title)
 
350
        if self.title_colour and self.title_font_size:
 
351
            url_bits.append('chts=%s,%s' % (self.title_colour, \
 
352
                self.title_font_size))
348
353
        if self.legend:
349
 
            url_bits.append('chdl=%s' % '|'.join(self.legend))
 
354
            url_bits.append('chdl=%s' % '%7c'.join(self.legend))
350
355
        if self.legend_position:
351
356
            url_bits.append('chdlp=%s' % (self.legend_position))
352
357
        if self.colours:
353
358
            url_bits.append('chco=%s' % ','.join(self.colours))            
354
359
        if self.colours_within_series:
355
 
            url_bits.append('chco=%s' % '|'.join(self.colours_within_series))
 
360
            url_bits.append('chco=%s' % '%7c'.join(self.colours_within_series))
356
361
        ret = self.fill_to_url()
357
362
        if ret:
358
363
            url_bits.append(ret)
369
374
                else:
370
375
                    values = ('1', )
371
376
                style.append(','.join(values))
372
 
            url_bits.append('chls=%s' % '|'.join(style))
 
377
            url_bits.append('chls=%s' % '%7c'.join(style))
373
378
        if self.grid:
374
379
            url_bits.append('chg=%s' % self.grid)
375
380
        return url_bits
395
400
        else:
396
401
            self.title = None
397
402
 
 
403
    def set_title_style(self, colour, font_size):
 
404
        if not colour is None:
 
405
            _check_colour(colour)
 
406
        self.title_colour = colour
 
407
        self.title_font_size = font_size
 
408
 
398
409
    def set_legend(self, legend):
399
410
        """legend needs to be a list, tuple or None"""
400
411
        assert(isinstance(legend, list) or isinstance(legend, tuple) or
474
485
                areas.append('%s,%s,%s' % (area, self.fill_types[area], \
475
486
                    self.fill_area[area]))
476
487
        if areas:
477
 
            return 'chf=' + '|'.join(areas)
 
488
            return 'chf=' + '%7c'.join(areas)
478
489
 
479
490
    # Data
480
491
    # -------------------------------------------------------------------------
603
614
 
604
615
    def set_axis_labels(self, axis_type, values):
605
616
        assert(axis_type in Axis.TYPES)
606
 
        values = [urllib.quote(a) for a in values]
 
617
        values = [urllib.quote(str(a)) for a in values]
607
618
        axis_index = len(self.axis)
608
619
        axis = LabelAxis(axis_index, axis_type, values)
609
620
        self.axis.append(axis)
653
664
        url_bits = []
654
665
        url_bits.append('chxt=%s' % ','.join(available_axis))
655
666
        if label_axis:
656
 
            url_bits.append('chxl=%s' % '|'.join(label_axis))
 
667
            url_bits.append('chxl=%s' % '%7c'.join(label_axis))
657
668
        if range_axis:
658
 
            url_bits.append('chxr=%s' % '|'.join(range_axis))
 
669
            url_bits.append('chxr=%s' % '%7c'.join(range_axis))
659
670
        if positions:
660
 
            url_bits.append('chxp=%s' % '|'.join(positions))
 
671
            url_bits.append('chxp=%s' % '%7c'.join(positions))
661
672
        if styles:
662
 
            url_bits.append('chxs=%s' % '|'.join(styles))
 
673
            url_bits.append('chxs=%s' % '%7c'.join(styles))
663
674
        return '&'.join(url_bits)
664
675
 
665
676
    # Markers, Ranges and Fill area (chm)
666
677
    # -------------------------------------------------------------------------
667
678
 
668
679
    def markers_to_url(self):        
669
 
        return 'chm=%s' % '|'.join([','.join(a) for a in self.markers])
 
680
        return 'chm=%s' % '%7c'.join([','.join(a) for a in self.markers])
670
681
 
671
682
    def add_marker(self, index, point, marker_type, colour, size, priority=0):
672
683
        self.markers.append((marker_type, colour, str(index), str(point), \
676
687
        self.markers.append(('r', colour, '0', str(start), str(stop)))
677
688
 
678
689
    def add_data_line(self, colour, data_set, size, priority=0):
679
 
        self.markers.append(('D', colour, str(data_set), '0', str(size), str(priority)))
 
690
        self.markers.append(('D', colour, str(data_set), '0', str(size), \
 
691
            str(priority)))
680
692
 
681
 
    def add_marker_text(self, string, colour, data_set, data_point, size, priority=0):
682
 
        self.markers.append((str(string), colour, str(data_set), str(data_point), str(size), str(priority)))        
 
693
    def add_marker_text(self, string, colour, data_set, data_point, size, \
 
694
            priority=0):
 
695
        self.markers.append((str(string), colour, str(data_set), \
 
696
            str(data_point), str(size), str(priority)))        
683
697
 
684
698
    def add_vertical_range(self, colour, start, stop):
685
699
        self.markers.append(('R', colour, '0', str(start), str(stop)))
885
899
    def get_url_bits(self, data_class=None):
886
900
        url_bits = Chart.get_url_bits(self, data_class=data_class)
887
901
        if self.pie_labels:
888
 
            url_bits.append('chl=%s' % '|'.join(self.pie_labels))
 
902
            url_bits.append('chl=%s' % '%7c'.join(self.pie_labels))
889
903
        return url_bits
890
904
 
891
905
    def annotated_data(self):
894
908
        for dataset in self.data:
895
909
            yield ('x', dataset)
896
910
 
 
911
    def scaled_data(self, data_class, x_range=None, y_range=None):
 
912
        if not x_range:
 
913
            x_range = [0, sum(self.data[0])]
 
914
        return Chart.scaled_data(self, data_class, x_range, self.y_range)
 
915
 
897
916
 
898
917
class PieChart2D(PieChart):
899
918
 
984
1003
        if self.encoding:
985
1004
            url_bits.append('choe=%s' % self.encoding)
986
1005
        if self.ec_level:
987
 
            url_bits.append('chld=%s|%s' % (self.ec_level, self.margin))
 
1006
            url_bits.append('chld=%s%%7c%s' % (self.ec_level, self.margin))
988
1007
        return url_bits
989
1008
 
990
1009
    def set_encoding(self, encoding):