Date: Thu, 13 Nov 2008 14:35:11 +0530
Subject: [PATCH 26/67] chages in date required field in purchase order=vir
bzr revid: patelamit2003@gmail.com-20081113090511-9dmp0mhsrp4grxs7
---
addons/purchase/report/order.rml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/addons/purchase/report/order.rml b/addons/purchase/report/order.rml
index e136e95290a..9ebbe935ebe 100755
--- a/addons/purchase/report/order.rml
+++ b/addons/purchase/report/order.rml
@@ -275,7 +275,7 @@
[[ ', '.join(map(lambda x: x.name, line.taxes_id)) ]]
- [[ line.date_planned]]
+ [[ time.strftime('%m/%d/%Y', time.strptime( line.date_planned, '%Y-%m-%d %H:%M:%S')) ]]
[[ line.product_qty ]]
From d7cc160cadfffa04303d5be0bdf2b1d37c899e19 Mon Sep 17 00:00:00 2001
From: Harshad Modi
Date: Thu, 13 Nov 2008 15:12:16 +0530
Subject: [PATCH 27/67] * Put button for change qty on production order and
read only product qty field on confirm ,approved state
bzr revid: hmo@tinyerp.com-20081113094216-tzwc7wh52ttm0drh
---
addons/mrp/mrp_view.xml | 9 +-
addons/mrp/wizard/__init__.py | 1 +
.../wizard/wizard_change_production_qty.py | 116 ++++++++++++++++++
3 files changed, 125 insertions(+), 1 deletion(-)
create mode 100644 addons/mrp/wizard/wizard_change_production_qty.py
diff --git a/addons/mrp/mrp_view.xml b/addons/mrp/mrp_view.xml
index 6223c00aaa5..d553a260091 100644
--- a/addons/mrp/mrp_view.xml
+++ b/addons/mrp/mrp_view.xml
@@ -410,7 +410,13 @@
-
+
mrp.production.form
mrp.production
@@ -424,6 +430,7 @@
+
diff --git a/addons/mrp/wizard/__init__.py b/addons/mrp/wizard/__init__.py
index 5632fa5535e..3562f362525 100644
--- a/addons/mrp/wizard/__init__.py
+++ b/addons/mrp/wizard/__init__.py
@@ -26,6 +26,7 @@ import wizard_schedulers_all
import wizard_price
import wizard_workcenter_load
import wizard_track_prod
+import wizard_change_production_qty
import make_procurement
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/mrp/wizard/wizard_change_production_qty.py b/addons/mrp/wizard/wizard_change_production_qty.py
new file mode 100644
index 00000000000..3a031d8f5ce
--- /dev/null
+++ b/addons/mrp/wizard/wizard_change_production_qty.py
@@ -0,0 +1,116 @@
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2008 Tiny SPRL (). All Rights Reserved
+# $Id$
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+
+import time
+import wizard
+import ir
+import pooler
+from osv.osv import except_osv
+from osv import fields,osv
+import netsvc
+
+
+form1 = '''
+'''
+
+form1_fields={
+ 'product_qty': {'string': 'Product Qty', 'type':'float', 'required':True},
+ }
+
+def _get_qty(self,cr,uid, data, state):
+ prod_obj = pooler.get_pool(cr.dbname).get('mrp.production')
+ prod = prod_obj.browse(cr, uid,data['ids'])[0]
+ form1_fields['product_qty']['default']=prod.product_qty
+ return {}
+def _get_states(self, cr, uid, data, context):
+ prod_obj = pooler.get_pool(cr.dbname).get('mrp.production')
+ prod = prod_obj.browse(cr, uid,data['ids'])[0]
+ if prod.state in ('cancel', 'done'):
+ raise wizard.except_wizard('Warning !', 'The production is in "%s" state. You can not change the production quantity anymore' % (prod.state).upper() )
+ return 'end'
+ if prod.state in ('draft'):
+ #raise wizard.except_wizard('Warning !', 'The production is in "%s" state. You can change the production quantity directly...!!!' % (prod.state).upper() )
+ return 'end'
+ else:
+ return 'confirm'
+
+def _change_prod_qty(self, cr, uid, data, context):
+ pool = pooler.get_pool(cr.dbname)
+ prod_obj = pool.get('mrp.production')
+ prod = prod_obj.browse(cr, uid,data['ids'])[0]
+ prod_obj.write(cr, uid,prod.id, {'product_qty' : data['form']['product_qty']})
+ prod_obj.action_compute(cr, uid, [prod.id])
+
+ move_lines_obj = pool.get('stock.move')
+ for move in prod.move_lines:
+ bom_point = prod.bom_id
+ bom_id = prod.bom_id.id
+ if not bom_point:
+ bom_id = pool.get('mrp.bom')._bom_find(cr, uid, prod.product_id.id, prod.product_uom.id, properties)
+ if not bom_id:
+ raise osv.except_osv('Error', "Couldn't find bill of material for product")
+ self.write(cr, uid, [prod.id], {'bom_id': bom_id})
+ bom_point = pool.get('mrp.bom').browse(cr, uid, [bom_id])[0]
+
+ if not bom_id:
+ raise osv.except_osv('Error', "Couldn't find bill of material for product")
+
+ factor = prod.product_qty * prod.product_uom.factor / bom_point.product_uom.factor
+ res = pool.get('mrp.bom')._bom_explode(cr, uid, bom_point, factor / bom_point.product_qty, [])
+ for r in res[0]:
+ if r['product_id']== move.product_id.id:
+ move_lines_obj.write(cr, uid,move.id, {'product_qty' : r['product_qty']})
+
+ product_lines_obj = pool.get('mrp.production.product.line')
+
+ for m in prod.move_created_ids:
+ move_lines_obj.write(cr, uid,m.id, {'product_qty' : data['form']['product_qty']})
+
+ return {}
+
+class change_production_qty(wizard.interface):
+ states = {
+ 'init' : {
+ 'actions' : [],
+ 'result' : {'type' : 'choice', 'next_state' : _get_states}
+ },
+
+ 'confirm' : {
+ 'actions' : [_get_qty],
+ 'result': {'type': 'form', 'arch':form1, 'fields':form1_fields, 'state':[('end','Cancel'),('validate','Validate')]}
+ },
+
+ 'validate': {
+ 'actions': [],
+ 'result': {'type':'action', 'action':_change_prod_qty, 'state':'end'}
+ },
+
+ 'end' : {
+ 'actions' : [],
+ 'result': {'type': 'state', 'state': 'end'},
+ },
+ }
+
+change_production_qty('change_production_qty')
+
From ddf5676f120435d4b3f807e4b24ec76c624b3618 Mon Sep 17 00:00:00 2001
From: Olivier Laurent
Date: Thu, 13 Nov 2008 10:58:07 +0100
Subject: [PATCH 28/67] French translations
bzr revid: olt@tinyerp.com-20081113095807-ht5r3qkvgu01zxfj
---
addons/account/account.py | 4 ++--
addons/account/i18n/account.pot | 24 ++++++++++++------------
addons/account/i18n/cs_CZ.po | 4 ++--
addons/account/i18n/de_DE.po | 4 ++--
addons/account/i18n/es_AR.po | 4 ++--
addons/account/i18n/es_ES.po | 4 ++--
addons/account/i18n/fr_FR.po | 2 +-
addons/account/i18n/hu_HU.po | 4 ++--
addons/account/i18n/it_IT.po | 4 ++--
addons/account/i18n/nl_NL.po | 4 ++--
addons/account/i18n/pt_BR.po | 4 ++--
addons/account/i18n/pt_PT.po | 4 ++--
addons/account/i18n/ro_RO.po | 4 ++--
addons/account/i18n/ru_RU.po | 4 ++--
addons/account/i18n/sv_SE.po | 4 ++--
addons/account/i18n/zh_CN.po | 4 ++--
addons/account/i18n/zh_TW.po | 4 ++--
17 files changed, 43 insertions(+), 43 deletions(-)
diff --git a/addons/account/account.py b/addons/account/account.py
index 3133d102c66..37bf0fc2023 100644
--- a/addons/account/account.py
+++ b/addons/account/account.py
@@ -925,11 +925,11 @@ class account_move(osv.osv):
if not company_id:
company_id = line.account_id.company_id.id
if not company_id == line.account_id.company_id.id:
- raise osv.except_osv(_('Error'), _('Couldn\'t create move between different companies'))
+ raise osv.except_osv(_('Error'), _("Couldn't create move between different companies"))
if line.account_id.currency_id:
if line.account_id.currency_id.id != line.currency_id.id and (line.account_id.currency_id.id != line.account_id.company_id.currency_id.id or line.currency_id):
- raise osv.except_osv(_('Error'), _('Couldn\'t create move with currency different than the secondary currency of the account "%s - %s". Clear the secondary currency field of the account definition if you want to accept all currencies.' % (line.account_id.code, line.account_id.name)))
+ raise osv.except_osv(_('Error'), _("""Couldn't create move with currency different than the secondary currency of the account "%s - %s". Clear the secondary currency field of the account definition if you want to accept all currencies.""" % (line.account_id.code, line.account_id.name)))
if abs(amount) < 0.0001:
if not len(line_draft_ids):
diff --git a/addons/account/i18n/account.pot b/addons/account/i18n/account.pot
index 8e759ccd488..c47d1c5d9db 100644
--- a/addons/account/i18n/account.pot
+++ b/addons/account/i18n/account.pot
@@ -4,16 +4,16 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: OpenERP Server 4.3.0"
-"Report-Msgid-Bugs-To: support@openerp.com"
-"POT-Creation-Date: 2008-09-11 15:45:09+0000"
-"PO-Revision-Date: 2008-09-11 15:45:09+0000"
-"Last-Translator: <>"
-"Language-Team: "
-"MIME-Version: 1.0"
-"Content-Type: text/plain; charset=UTF-8"
-"Content-Transfer-Encoding: "
-"Plural-Forms: "
+"Project-Id-Version: OpenERP Server 4.3.0\n"
+"Report-Msgid-Bugs-To: support@openerp.com\n"
+"POT-Creation-Date: 2008-09-11 15:45:09+0000\n"
+"PO-Revision-Date: 2008-09-11 15:45:09+0000\n"
+"Last-Translator: <>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
#. module: account
#, python-format
@@ -3915,7 +3915,7 @@ msgstr ""
#. module: account
#, python-format
#: code:addons/account/account.py:0
-msgid "Couldn\'t create move between different companies"
+msgid "Couldn't create move between different companies"
msgstr ""
#. module: account
@@ -4566,7 +4566,7 @@ msgstr ""
#. module: account
#, python-format
#: code:addons/account/account.py:0
-msgid "Couldn\'t create move with currency different than the secondary currency of the account"
+msgid "Couldn't create move with currency different than the secondary currency of the account"
msgstr ""
#. module: account
diff --git a/addons/account/i18n/cs_CZ.po b/addons/account/i18n/cs_CZ.po
index be9d6428d05..b238142e695 100644
--- a/addons/account/i18n/cs_CZ.po
+++ b/addons/account/i18n/cs_CZ.po
@@ -3915,7 +3915,7 @@ msgstr ""
#. module: account
#, python-format
#: code:addons/account/account.py:0
-msgid "Couldn\'t create move between different companies"
+msgid "Couldn't create move between different companies"
msgstr ""
#. module: account
@@ -4566,7 +4566,7 @@ msgstr ""
#. module: account
#, python-format
#: code:addons/account/account.py:0
-msgid "Couldn\'t create move with currency different than the secondary currency of the account"
+msgid "Couldn't create move with currency different than the secondary currency of the account"
msgstr ""
#. module: account
diff --git a/addons/account/i18n/de_DE.po b/addons/account/i18n/de_DE.po
index d3fb0d5093f..9fe64521a46 100644
--- a/addons/account/i18n/de_DE.po
+++ b/addons/account/i18n/de_DE.po
@@ -3915,7 +3915,7 @@ msgstr ""
#. module: account
#, python-format
#: code:addons/account/account.py:0
-msgid "Couldn\'t create move between different companies"
+msgid "Couldn't create move between different companies"
msgstr ""
#. module: account
@@ -4566,7 +4566,7 @@ msgstr ""
#. module: account
#, python-format
#: code:addons/account/account.py:0
-msgid "Couldn\'t create move with currency different than the secondary currency of the account"
+msgid "Couldn't create move with currency different than the secondary currency of the account"
msgstr ""
#. module: account
diff --git a/addons/account/i18n/es_AR.po b/addons/account/i18n/es_AR.po
index 07e63aa5bb2..8a75f1ad15a 100644
--- a/addons/account/i18n/es_AR.po
+++ b/addons/account/i18n/es_AR.po
@@ -3915,7 +3915,7 @@ msgstr "Días netos"
#. module: account
#, python-format
#: code:addons/account/account.py:0
-msgid "Couldn\'t create move between different companies"
+msgid "Couldn't create move between different companies"
msgstr ""
#. module: account
@@ -4566,7 +4566,7 @@ msgstr ""
#. module: account
#, python-format
#: code:addons/account/account.py:0
-msgid "Couldn\'t create move with currency different than the secondary currency of the account"
+msgid "Couldn't create move with currency different than the secondary currency of the account"
msgstr ""
#. module: account
diff --git a/addons/account/i18n/es_ES.po b/addons/account/i18n/es_ES.po
index ec4dd8938aa..13b77686fd4 100644
--- a/addons/account/i18n/es_ES.po
+++ b/addons/account/i18n/es_ES.po
@@ -3915,7 +3915,7 @@ msgstr "Dias habiles(netos)"
#. module: account
#, python-format
#: code:addons/account/account.py:0
-msgid "Couldn\'t create move between different companies"
+msgid "Couldn't create move between different companies"
msgstr ""
#. module: account
@@ -4566,7 +4566,7 @@ msgstr ""
#. module: account
#, python-format
#: code:addons/account/account.py:0
-msgid "Couldn\'t create move with currency different than the secondary currency of the account"
+msgid "Couldn't create move with currency different than the secondary currency of the account"
msgstr ""
#. module: account
diff --git a/addons/account/i18n/fr_FR.po b/addons/account/i18n/fr_FR.po
index e8dfbb07b63..401f31fbff5 100644
--- a/addons/account/i18n/fr_FR.po
+++ b/addons/account/i18n/fr_FR.po
@@ -4376,7 +4376,7 @@ msgstr ""
#. module: account
#, python-format
#: code:addons/account/account.py:0
-msgid "Couldn\'t create move between different companies"
+msgid "Couldn't create move between different companies"
msgstr ""
#. module: account
diff --git a/addons/account/i18n/hu_HU.po b/addons/account/i18n/hu_HU.po
index 3e90cdf1e68..07ee4a35c18 100644
--- a/addons/account/i18n/hu_HU.po
+++ b/addons/account/i18n/hu_HU.po
@@ -3915,7 +3915,7 @@ msgstr ""
#. module: account
#, python-format
#: code:addons/account/account.py:0
-msgid "Couldn\'t create move between different companies"
+msgid "Couldn't create move between different companies"
msgstr ""
#. module: account
@@ -4566,7 +4566,7 @@ msgstr ""
#. module: account
#, python-format
#: code:addons/account/account.py:0
-msgid "Couldn\'t create move with currency different than the secondary currency of the account"
+msgid "Couldn't create move with currency different than the secondary currency of the account"
msgstr ""
#. module: account
diff --git a/addons/account/i18n/it_IT.po b/addons/account/i18n/it_IT.po
index 03da0d130aa..be7e7a121a3 100644
--- a/addons/account/i18n/it_IT.po
+++ b/addons/account/i18n/it_IT.po
@@ -3915,7 +3915,7 @@ msgstr "Giorni netti"
#. module: account
#, python-format
#: code:addons/account/account.py:0
-msgid "Couldn\'t create move between different companies"
+msgid "Couldn't create move between different companies"
msgstr ""
#. module: account
@@ -4566,7 +4566,7 @@ msgstr ""
#. module: account
#, python-format
#: code:addons/account/account.py:0
-msgid "Couldn\'t create move with currency different than the secondary currency of the account"
+msgid "Couldn't create move with currency different than the secondary currency of the account"
msgstr ""
#. module: account
diff --git a/addons/account/i18n/nl_NL.po b/addons/account/i18n/nl_NL.po
index c6cd6a37f3d..8f1142f0085 100644
--- a/addons/account/i18n/nl_NL.po
+++ b/addons/account/i18n/nl_NL.po
@@ -3915,7 +3915,7 @@ msgstr "Netto Dagen"
#. module: account
#, python-format
#: code:addons/account/account.py:0
-msgid "Couldn\'t create move between different companies"
+msgid "Couldn't create move between different companies"
msgstr ""
#. module: account
@@ -4566,7 +4566,7 @@ msgstr ""
#. module: account
#, python-format
#: code:addons/account/account.py:0
-msgid "Couldn\'t create move with currency different than the secondary currency of the account"
+msgid "Couldn't create move with currency different than the secondary currency of the account"
msgstr ""
#. module: account
diff --git a/addons/account/i18n/pt_BR.po b/addons/account/i18n/pt_BR.po
index 73195c6ef60..d433ac261ac 100644
--- a/addons/account/i18n/pt_BR.po
+++ b/addons/account/i18n/pt_BR.po
@@ -3915,7 +3915,7 @@ msgstr ""
#. module: account
#, python-format
#: code:addons/account/account.py:0
-msgid "Couldn\'t create move between different companies"
+msgid "Couldn't create move between different companies"
msgstr ""
#. module: account
@@ -4566,7 +4566,7 @@ msgstr ""
#. module: account
#, python-format
#: code:addons/account/account.py:0
-msgid "Couldn\'t create move with currency different than the secondary currency of the account"
+msgid "Couldn't create move with currency different than the secondary currency of the account"
msgstr ""
#. module: account
diff --git a/addons/account/i18n/pt_PT.po b/addons/account/i18n/pt_PT.po
index 452cb8f1b17..16779a2b9d6 100644
--- a/addons/account/i18n/pt_PT.po
+++ b/addons/account/i18n/pt_PT.po
@@ -3915,7 +3915,7 @@ msgstr "Dias"
#. module: account
#, python-format
#: code:addons/account/account.py:0
-msgid "Couldn\'t create move between different companies"
+msgid "Couldn't create move between different companies"
msgstr ""
#. module: account
@@ -4566,7 +4566,7 @@ msgstr ""
#. module: account
#, python-format
#: code:addons/account/account.py:0
-msgid "Couldn\'t create move with currency different than the secondary currency of the account"
+msgid "Couldn't create move with currency different than the secondary currency of the account"
msgstr ""
#. module: account
diff --git a/addons/account/i18n/ro_RO.po b/addons/account/i18n/ro_RO.po
index 74d2636f095..2958758142b 100644
--- a/addons/account/i18n/ro_RO.po
+++ b/addons/account/i18n/ro_RO.po
@@ -3915,7 +3915,7 @@ msgstr ""
#. module: account
#, python-format
#: code:addons/account/account.py:0
-msgid "Couldn\'t create move between different companies"
+msgid "Couldn't create move between different companies"
msgstr ""
#. module: account
@@ -4566,7 +4566,7 @@ msgstr ""
#. module: account
#, python-format
#: code:addons/account/account.py:0
-msgid "Couldn\'t create move with currency different than the secondary currency of the account"
+msgid "Couldn't create move with currency different than the secondary currency of the account"
msgstr ""
#. module: account
diff --git a/addons/account/i18n/ru_RU.po b/addons/account/i18n/ru_RU.po
index a2b7c55e5ed..24988e7fb2a 100644
--- a/addons/account/i18n/ru_RU.po
+++ b/addons/account/i18n/ru_RU.po
@@ -3915,7 +3915,7 @@ msgstr ""
#. module: account
#, python-format
#: code:addons/account/account.py:0
-msgid "Couldn\'t create move between different companies"
+msgid "Couldn't create move between different companies"
msgstr ""
#. module: account
@@ -4566,7 +4566,7 @@ msgstr ""
#. module: account
#, python-format
#: code:addons/account/account.py:0
-msgid "Couldn\'t create move with currency different than the secondary currency of the account"
+msgid "Couldn't create move with currency different than the secondary currency of the account"
msgstr ""
#. module: account
diff --git a/addons/account/i18n/sv_SE.po b/addons/account/i18n/sv_SE.po
index 02b34962fb6..794a08b8d42 100644
--- a/addons/account/i18n/sv_SE.po
+++ b/addons/account/i18n/sv_SE.po
@@ -3915,7 +3915,7 @@ msgstr ""
#. module: account
#, python-format
#: code:addons/account/account.py:0
-msgid "Couldn\'t create move between different companies"
+msgid "Couldn't create move between different companies"
msgstr ""
#. module: account
@@ -4566,7 +4566,7 @@ msgstr ""
#. module: account
#, python-format
#: code:addons/account/account.py:0
-msgid "Couldn\'t create move with currency different than the secondary currency of the account"
+msgid "Couldn't create move with currency different than the secondary currency of the account"
msgstr ""
#. module: account
diff --git a/addons/account/i18n/zh_CN.po b/addons/account/i18n/zh_CN.po
index a96f4ae9aac..16d0b5eba83 100644
--- a/addons/account/i18n/zh_CN.po
+++ b/addons/account/i18n/zh_CN.po
@@ -3915,7 +3915,7 @@ msgstr ""
#. module: account
#, python-format
#: code:addons/account/account.py:0
-msgid "Couldn\'t create move between different companies"
+msgid "Couldn't create move between different companies"
msgstr ""
#. module: account
@@ -4566,7 +4566,7 @@ msgstr ""
#. module: account
#, python-format
#: code:addons/account/account.py:0
-msgid "Couldn\'t create move with currency different than the secondary currency of the account"
+msgid "Couldn't create move with currency different than the secondary currency of the account"
msgstr ""
#. module: account
diff --git a/addons/account/i18n/zh_TW.po b/addons/account/i18n/zh_TW.po
index 01f037716ce..97a1a11f46c 100644
--- a/addons/account/i18n/zh_TW.po
+++ b/addons/account/i18n/zh_TW.po
@@ -3915,7 +3915,7 @@ msgstr ""
#. module: account
#, python-format
#: code:addons/account/account.py:0
-msgid "Couldn\'t create move between different companies"
+msgid "Couldn't create move between different companies"
msgstr ""
#. module: account
@@ -4566,7 +4566,7 @@ msgstr ""
#. module: account
#, python-format
#: code:addons/account/account.py:0
-msgid "Couldn\'t create move with currency different than the secondary currency of the account"
+msgid "Couldn't create move with currency different than the secondary currency of the account"
msgstr ""
#. module: account
From 09fd27f68535862b130b521457fecf8da1fdcb22 Mon Sep 17 00:00:00 2001
From: Stephane Wirtel
Date: Thu, 13 Nov 2008 11:29:37 +0100
Subject: [PATCH 29/67] Refactor the setup.py
bzr revid: stephane@tinyerp.com-20081113102937-9uc99gyeq2kenp8e
---
setup.py | 136 +++++++++++++++++++++++++++++--------------------------
1 file changed, 73 insertions(+), 63 deletions(-)
mode change 100644 => 100755 setup.py
diff --git a/setup.py b/setup.py
old mode 100644
new mode 100755
index 148b1e1b9a4..13c36d52fa0
--- a/setup.py
+++ b/setup.py
@@ -50,10 +50,12 @@ execfile(opj('bin', 'release.py'))
# get python short version
py_short_version = '%s.%s' % sys.version_info[:2]
-required_modules = [('psycopg', 'PostgreSQL module'),
- ('xml', 'XML Tools for python'),
- ('libxml2', 'libxml2 python bindings'),
- ('libxslt', 'libxslt python bindings')]
+required_modules = [
+ ('psycopg', 'PostgreSQL module'),
+ ('xml', 'XML Tools for python'),
+ ('libxml2', 'libxml2 python bindings'),
+ ('libxslt', 'libxslt python bindings')
+]
def check_modules():
ok = True
@@ -69,8 +71,6 @@ def check_modules():
def find_addons():
for (dp, dn, names) in os.walk(opj('bin', 'addons')):
- if '.bzr' in dn:
- dn.remove('.bzr')
for dirpath, dirnames, filenames in os.walk(dp):
if '__init__.py' in filenames:
modname = dirpath.replace(os.path.sep, '.')
@@ -82,53 +82,51 @@ def data_files():
if os.name == 'nt':
os.chdir('bin')
for (dp,dn,names) in os.walk('addons'):
- if '.bzr' in dn:
- dn.remove('.bzr')
- files.append((dp, map(lambda x: os.path.join('bin', dp,x), names)))
+ files.append((dp, map(lambda x: opj('bin', dp, x), names)))
for (dp,dn,names) in os.walk('i18n'):
- if '.bzr' in dn:
- dn.remove('.bzr')
- files.append((dp, map(lambda x: os.path.join('bin', dp,x), names)))
+ files.append((dp, map(lambda x: opj('bin', dp, x), names)))
os.chdir('..')
for (dp,dn,names) in os.walk('doc'):
- if '.bzr' in dn:
- dn.remove('.bzr')
- files.append((dp, map(lambda x: os.path.join(dp,x), names)))
+ files.append((dp, map(lambda x: opj(dp, x), names)))
else:
- files.append((opj('share', 'man', 'man1'), ['man/openerp-server.1']))
- files.append((opj('share', 'man', 'man5'), ['man/openerp_serverrc.5']))
- files.append((opj('share','doc', 'openerp-server-%s' % version), [f for
- f in glob.glob('doc/*') if os.path.isfile(f)]))
- files.append((opj('share','doc', 'openerp-server-%s' % version,
- 'migrate', '3.3.0-3.4.0'), [f for f in
- glob.glob('doc/migrate/3.3.0-3.4.0/*') if os.path.isfile(f)]))
- files.append((opj('share','doc', 'openerp-server-%s' % version,
- 'migrate', '3.4.0-4.0.0'), [f for f in
- glob.glob('doc/migrate/3.4.0-4.0.0/*') if os.path.isfile(f)]))
- files.append((opj('lib','python%s' % py_short_version, 'site-packages',
- 'openerp-server', 'i18n'), glob.glob('bin/i18n/*')))
- files.append((opj('lib', 'python%s' % py_short_version, 'site-packages',
- 'openerp-server', 'addons', 'custom'),
- glob.glob('bin/addons/custom/*xml') +
- glob.glob('bin/addons/custom/*rml') +
- glob.glob('bin/addons/custom/*xsl')))
+ man_directory = opj('share', 'man')
+ files.append((opj(man_directory, 'man1'), ['man/openerp-server.1']))
+ files.append((opj(man_directory, 'man5'), ['man/openerp_serverrc.5']))
+
+ doc_directory = opj('share', 'doc', 'openerp-server-%s' % version)
+ files.append((doc_directory, [f for f in glob.glob('doc/*') if os.path.isfile(f)]))
+ files.append((opj(doc_directory, 'migrate', '3.3.0-3.4.0'), [f for f in glob.glob('doc/migrate/3.3.0-3.4.0/*') if os.path.isfile(f)]))
+ files.append((opj(doc_directory, 'migrate', '3.4.0-4.0.0'), [f for f in glob.glob('doc/migrate/3.4.0-4.0.0/*') if os.path.isfile(f)]))
+
+ openerp_site_packages = opj('lib', 'python%s' % py_short_version, 'site-packages', 'openerp-server')
+
+ files.append((opj(openerp_site_packages, 'i18n'), glob.glob('bin/i18n/*')))
+ files.append((opj(openerp_site_packages, 'addons', 'custom'),
+ glob.glob('bin/addons/custom/*xml') + glob.glob('bin/addons/custom/*rml') + glob.glob('bin/addons/custom/*xsl')))
+
for addon in find_addons():
- add_path = addon.replace('.', os.path.sep).replace('openerp-server', 'bin',
- 1)
- pathfiles = [(opj('lib', 'python%s' % py_short_version, 'site-packages',
- add_path.replace('bin', 'openerp-server', 1)),
- glob.glob(opj(add_path, '*xml')) +
- glob.glob(opj(add_path, '*csv')) +
- glob.glob(opj(add_path, '*sql'))),
- (opj('lib', 'python%s' % py_short_version, 'site-packages',
- add_path.replace('bin', 'openerp-server', 1), 'data'),
- glob.glob(opj(add_path, 'data', '*xml'))),
- (opj('lib', 'python%s' % py_short_version, 'site-packages',
- add_path.replace('bin', 'openerp-server', 1), 'report'),
- glob.glob(opj(add_path, 'report', '*xml')) +
- glob.glob(opj(add_path, 'report', '*rml')) +
- glob.glob(opj(add_path, 'report', '*sxw')) +
- glob.glob(opj(add_path, 'report', '*xsl')))]
+ add_path = addon.replace('.', os.path.sep).replace('openerp-server', 'bin', 1)
+ addon_path = opj('lib', 'python%s' % py_short_version, 'site-packages', add_path.replace('bin', 'openerp-server', 1))
+
+ pathfiles = [
+ (
+ addon_path,
+ glob.glob(opj(add_path, '*xml')) +
+ glob.glob(opj(add_path, '*csv')) +
+ glob.glob(opj(add_path, '*sql'))
+ ),
+ (
+ opj(addon_path, 'data'),
+ glob.glob(opj(add_path, 'data', '*xml'))
+ ),
+ (
+ opj(addon_path, 'report'),
+ glob.glob(opj(add_path, 'report', '*xml')) +
+ glob.glob(opj(add_path, 'report', '*rml')) +
+ glob.glob(opj(add_path, 'report', '*sxw')) +
+ glob.glob(opj(add_path, 'report', '*xsl'))
+ )
+ ]
files.extend(pathfiles)
files.append(('.', [('bin/import_xml.rng')]))
return files
@@ -139,21 +137,23 @@ check_modules()
start_script = \
"#!/bin/sh\n\
cd %s/lib/python%s/site-packages/openerp-server\n\
-exec %s ./openerp-server.py $@" % (sys.prefix, py_short_version, sys.executable)
+exec %s ./openerp-server.py $@\n" % (sys.prefix, py_short_version, sys.executable)
# write script
f = open('openerp-server', 'w')
f.write(start_script)
f.close()
-options = {"py2exe": {
- "compressed": 0,
- "optimize": 2,
- "packages": ["lxml", "lxml.builder", "lxml._elementpath", "lxml.etree",
- "lxml.objectify", "decimal", "xml", "xml.dom", "xml.xpath",
- "encodings","mx.DateTime","wizard","pychart","PIL", "pyparsing",
- "pydot","asyncore","asynchat"],
- "excludes" : ["Tkconstants","Tkinter","tcl"],
- }}
+options = {
+ "py2exe": {
+ "compressed": 0,
+ "optimize": 2,
+ "packages": ["lxml", "lxml.builder", "lxml._elementpath", "lxml.etree",
+ "lxml.objectify", "decimal", "xml", "xml.dom", "xml.xpath",
+ "encodings","mx.DateTime","wizard","pychart","PIL", "pyparsing",
+ "pydot","asyncore","asynchat"],
+ "excludes" : ["Tkconstants","Tkinter","tcl"],
+ }
+}
setup(name = name,
version = version,
@@ -166,21 +166,31 @@ setup(name = name,
license = license,
data_files = data_files(),
scripts = ['openerp-server'],
- packages = ['openerp-server', 'openerp-server.addons',
+ packages = ['openerp-server',
+ 'openerp-server.addons',
'openerp-server.ir',
'openerp-server.osv',
'openerp-server.ssl',
- 'openerp-server.service', 'openerp-server.tools',
- 'openerp-server.pychart', 'openerp-server.pychart.afm',
+ 'openerp-server.service',
+ 'openerp-server.tools',
+ 'openerp-server.pychart',
+ 'openerp-server.pychart.afm',
'openerp-server.report',
'openerp-server.report.printscreen',
'openerp-server.report.render',
'openerp-server.report.render.rml2pdf',
'openerp-server.report.render.rml2html',
- 'openerp-server.wizard', 'openerp-server.workflow'] + \
+ 'openerp-server.wizard',
+ 'openerp-server.workflow'] + \
list(find_addons()),
package_dir = {'openerp-server': 'bin'},
- console = [{"script":"bin\\openerp-server.py", "icon_resources":[(1,"pixmaps\\openerp-icon.ico")]}],
+ console = [
+ { "script" : "bin\\openerp-server.py",
+ "icon_resources" : [
+ (1,"pixmaps\\openerp-icon.ico")
+ ]
+ }
+ ],
options = options,
)
From 26ec801a6060e79aa19f8a8490fdf092411dea97 Mon Sep 17 00:00:00 2001
From: Stephane Wirtel
Date: Thu, 13 Nov 2008 11:39:57 +0100
Subject: [PATCH 30/67] Add the security directory into the packaging
bzr revid: stephane@tinyerp.com-20081113103957-1op6exlhnfxkmftn
---
setup.py | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/setup.py b/setup.py
index 13c36d52fa0..e4b3b7ddc62 100755
--- a/setup.py
+++ b/setup.py
@@ -125,7 +125,11 @@ def data_files():
glob.glob(opj(add_path, 'report', '*rml')) +
glob.glob(opj(add_path, 'report', '*sxw')) +
glob.glob(opj(add_path, 'report', '*xsl'))
- )
+ ),
+ ( opj(addon_path, 'security'),
+ glob.glob(opj(add_path, 'security', '*csv')) +
+ glob.glob(opj(add_path, 'security', '*xml'))
+ ),
]
files.extend(pathfiles)
files.append(('.', [('bin/import_xml.rng')]))
From a48a65e138abe2898edc31762d796bd4b37f3d69 Mon Sep 17 00:00:00 2001
From: Stephane Wirtel
Date: Thu, 13 Nov 2008 12:06:12 +0100
Subject: [PATCH 31/67] Bugfix with the rng file
bzr revid: stephane@tinyerp.com-20081113110612-yr77ywso0wqyrvk2
---
setup.py | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/setup.py b/setup.py
index e4b3b7ddc62..983918761c8 100755
--- a/setup.py
+++ b/setup.py
@@ -88,6 +88,7 @@ def data_files():
os.chdir('..')
for (dp,dn,names) in os.walk('doc'):
files.append((dp, map(lambda x: opj(dp, x), names)))
+ files.append(('.', [('bin/import_xml.rng')]))
else:
man_directory = opj('share', 'man')
files.append((opj(man_directory, 'man1'), ['man/openerp-server.1']))
@@ -104,6 +105,8 @@ def data_files():
files.append((opj(openerp_site_packages, 'addons', 'custom'),
glob.glob('bin/addons/custom/*xml') + glob.glob('bin/addons/custom/*rml') + glob.glob('bin/addons/custom/*xsl')))
+ files.append((openerp_site_packages, [('bin/import_xml.rng')]))
+
for addon in find_addons():
add_path = addon.replace('.', os.path.sep).replace('openerp-server', 'bin', 1)
addon_path = opj('lib', 'python%s' % py_short_version, 'site-packages', add_path.replace('bin', 'openerp-server', 1))
@@ -132,7 +135,6 @@ def data_files():
),
]
files.extend(pathfiles)
- files.append(('.', [('bin/import_xml.rng')]))
return files
check_modules()
From 6c92455cd787ff0f1274ffba49480b96a90ce40b Mon Sep 17 00:00:00 2001
From: Stephane Wirtel
Date: Thu, 13 Nov 2008 12:13:28 +0100
Subject: [PATCH 32/67] Import rng files
bzr revid: stephane@tinyerp.com-20081113111328-kf899dsp9as0aein
---
setup.py | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/setup.py b/setup.py
index 983918761c8..95c8f30d3b2 100755
--- a/setup.py
+++ b/setup.py
@@ -129,10 +129,15 @@ def data_files():
glob.glob(opj(add_path, 'report', '*sxw')) +
glob.glob(opj(add_path, 'report', '*xsl'))
),
- ( opj(addon_path, 'security'),
+ (
+ opj(addon_path, 'security'),
glob.glob(opj(add_path, 'security', '*csv')) +
glob.glob(opj(add_path, 'security', '*xml'))
),
+ (
+ opj(addon_path, 'rng'),
+ glob.glob(opj(add_path, 'rng', '*rng'))
+ )
]
files.extend(pathfiles)
return files
From 7ad6923620c8bf08eed11b86b8f58464a3add5f7 Mon Sep 17 00:00:00 2001
From: Stephane Wirtel
Date: Thu, 13 Nov 2008 16:29:23 +0100
Subject: [PATCH 33/67] a filestore per database
bzr revid: stephane@tinyerp.com-20081113152923-2jgrsq4na87sx0z4
---
addons/document/document.py | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/addons/document/document.py b/addons/document/document.py
index 31de70cc63f..498534379f7 100644
--- a/addons/document/document.py
+++ b/addons/document/document.py
@@ -471,7 +471,7 @@ def random_name():
def create_directory(path):
dir_name = random_name()
path = os.path.join(path,dir_name)
- os.mkdir(path)
+ os.makedirs(path)
return dir_name
class document_file(osv.osv):
@@ -484,7 +484,7 @@ class document_file(osv.osv):
result[id] = d
elif m=='fs':
try:
- path = os.path.join(os.getcwd(),'filestore')
+ path = os.path.join(os.getcwd(), cr.dbname,'filestore')
value = file(os.path.join(path,r), 'rb').read()
result[id] = base64.encodestring(value)
except:
@@ -500,9 +500,9 @@ class document_file(osv.osv):
if not value:
return True
if (not context) or context.get('store_method','fs')=='fs':
- path = os.path.join(os.getcwd(), "filestore")
+ path = os.path.join(os.getcwd(), cr.dbname, "filestore")
if not os.path.isdir(path):
- os.mkdir(path)
+ os.makedirs(path)
flag = None
# This can be improved
for dirs in os.listdir(path):
@@ -620,7 +620,7 @@ class document_file(osv.osv):
for f in self.browse(cr, uid, ids, context):
if f.store_method=='fs':
try:
- path = os.path.join(os.getcwd(),'filestore',f.store_fname)
+ path = os.path.join(os.getcwd(), cr.dbname, 'filestore',f.store_fname)
os.unlink(path)
except:
pass
From aa62691f5a44806fe55888778d72c78a1da28de3 Mon Sep 17 00:00:00 2001
From: Stephane Wirtel
Date: Thu, 13 Nov 2008 16:35:28 +0100
Subject: [PATCH 34/67] ;-) swap filestore and cr.dbname
bzr revid: stephane@tinyerp.com-20081113153528-5f2i411vnvjcuplu
---
addons/document/document.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/addons/document/document.py b/addons/document/document.py
index 498534379f7..21064169335 100644
--- a/addons/document/document.py
+++ b/addons/document/document.py
@@ -484,7 +484,7 @@ class document_file(osv.osv):
result[id] = d
elif m=='fs':
try:
- path = os.path.join(os.getcwd(), cr.dbname,'filestore')
+ path = os.path.join(os.getcwd(), 'filestore', cr.dbname)
value = file(os.path.join(path,r), 'rb').read()
result[id] = base64.encodestring(value)
except:
@@ -500,7 +500,7 @@ class document_file(osv.osv):
if not value:
return True
if (not context) or context.get('store_method','fs')=='fs':
- path = os.path.join(os.getcwd(), cr.dbname, "filestore")
+ path = os.path.join(os.getcwd(), "filestore", cr.dbname)
if not os.path.isdir(path):
os.makedirs(path)
flag = None
From 9ef1d2071d5299e1dbc969d0845f959371d2e9dd Mon Sep 17 00:00:00 2001
From: Mantavya Gajjar
Date: Fri, 14 Nov 2008 12:37:02 +0530
Subject: [PATCH 35/67] small change to test the wiki
bzr revid: mga@tinyerp.com-20081114070702-jkox5mlj92hy420d
---
addons/product/product.py | 1 +
1 file changed, 1 insertion(+)
diff --git a/addons/product/product.py b/addons/product/product.py
index 16674231236..19fed206d07 100644
--- a/addons/product/product.py
+++ b/addons/product/product.py
@@ -419,6 +419,7 @@ class product_product(osv.osv):
'packaging' : fields.one2many('product.packaging', 'product_id', 'Logistical Units', help="Gives the different ways to package the same product. This has no impact on the packing order and is mainly used if you use the EDI module."),
'price_extra': fields.float('Variant Price Extra', digits=(16, int(config['price_accuracy']))),
'price_margin': fields.float('Variant Price Margin', digits=(16, int(config['price_accuracy']))),
+ 'doc':fields.many2one('base.wiki', 'Wiki'),
}
def onchange_uom(self, cursor, user, ids, uom_id,uom_po_id):
From 4008ff421f915a44f463a8570ef04b56dbc502a4 Mon Sep 17 00:00:00 2001
From: Mantavya Gajjar
Date: Fri, 14 Nov 2008 12:51:08 +0530
Subject: [PATCH 36/67] remove small change which comitt here by mistake
bzr revid: mga@tinyerp.com-20081114072108-zkbt3cty77y3ngjv
---
addons/product/product.py | 1 -
1 file changed, 1 deletion(-)
diff --git a/addons/product/product.py b/addons/product/product.py
index 19fed206d07..16674231236 100644
--- a/addons/product/product.py
+++ b/addons/product/product.py
@@ -419,7 +419,6 @@ class product_product(osv.osv):
'packaging' : fields.one2many('product.packaging', 'product_id', 'Logistical Units', help="Gives the different ways to package the same product. This has no impact on the packing order and is mainly used if you use the EDI module."),
'price_extra': fields.float('Variant Price Extra', digits=(16, int(config['price_accuracy']))),
'price_margin': fields.float('Variant Price Margin', digits=(16, int(config['price_accuracy']))),
- 'doc':fields.many2one('base.wiki', 'Wiki'),
}
def onchange_uom(self, cursor, user, ids, uom_id,uom_po_id):
From 5539019f6a115519e4d11968d7f64a1a9d8216e2 Mon Sep 17 00:00:00 2001
From: Mustufa Rangwala
Date: Fri, 14 Nov 2008 15:07:02 +0530
Subject: [PATCH 37/67] removed bug from charts of account: it did not open
lines for consolidated tree with different accounts which does not comes in
its range of parent_left
bzr revid: mra@tinyerp.com-20081114093702-ed0bmk6momj3h6r7
---
addons/account/account.py | 7 +++++++
addons/account/wizard/wizard_move_line_select.py | 7 ++++++-
2 files changed, 13 insertions(+), 1 deletion(-)
diff --git a/addons/account/account.py b/addons/account/account.py
index 37bf0fc2023..f3be0d159ab 100644
--- a/addons/account/account.py
+++ b/addons/account/account.py
@@ -154,6 +154,13 @@ class account_account(osv.osv):
args[pos] = ('id','in',ids1)
pos+=1
+ if context and context.has_key('consolidate_childs'): #add concolidated childs of accounts
+ ids = super(account_account,self).search(cr, uid, args, offset, limit,
+ order, context=context, count=count)
+ for consolidate_child in self.browse(cr, uid, context['account_id']).child_consol_ids:
+ ids.append(consolidate_child.id)
+ return ids
+
return super(account_account,self).search(cr, uid, args, offset, limit,
order, context=context, count=count)
diff --git a/addons/account/wizard/wizard_move_line_select.py b/addons/account/wizard/wizard_move_line_select.py
index 645d9f90b84..64c80a8ec8d 100644
--- a/addons/account/wizard/wizard_move_line_select.py
+++ b/addons/account/wizard/wizard_move_line_select.py
@@ -1,7 +1,7 @@
# -*- encoding: utf-8 -*-
##############################################################################
#
-# OpenERP, Open Source Management Solution
+# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2008 Tiny SPRL (). All Rights Reserved
# $Id$
#
@@ -27,6 +27,7 @@ class wizard_move_line_select(wizard.interface):
def _open_window(self, cr, uid, data, context):
mod_obj = pooler.get_pool(cr.dbname).get('ir.model.data')
act_obj = pooler.get_pool(cr.dbname).get('ir.actions.act_window')
+ account_obj = pooler.get_pool(cr.dbname).get('account.account')
fiscalyear_obj = pooler.get_pool(cr.dbname).get('account.fiscalyear')
if not context.get('fiscalyear', False):
@@ -48,6 +49,10 @@ class wizard_move_line_select(wizard.interface):
'fiscalyear': context.get('fiscalyear', False),
'account_id': data['id']
}
+ if data['id']:
+ acc_data = account_obj.browse(cr, uid, data['id']).child_consol_ids
+ if acc_data:
+ result['context'].update({'consolidate_childs': True})
result['domain']=result['domain'][0:-1]+','+domain+result['domain'][-1]
return result
From 882cd7027feca65405cfdf1337064aa676830d4b Mon Sep 17 00:00:00 2001
From: Stephane Wirtel
Date: Fri, 14 Nov 2008 15:04:53 +0100
Subject: [PATCH 38/67] Use the last version of pydot
bzr revid: stephane@tinyerp.com-20081114140453-rwcic5h0ry8uf0z5
---
bin/addons/base/ir/workflow/print_instance.py | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/bin/addons/base/ir/workflow/print_instance.py b/bin/addons/base/ir/workflow/print_instance.py
index 8d40bbeac47..826f753e594 100644
--- a/bin/addons/base/ir/workflow/print_instance.py
+++ b/bin/addons/base/ir/workflow/print_instance.py
@@ -38,7 +38,7 @@ def graph_get(cr, graph, wkf_id, nested=False, workitem={}):
if n['subflow_id'] and nested:
cr.execute('select * from wkf where id=%d', (n['subflow_id'],))
wkfinfo = cr.dictfetchone()
- graph2 = pydot.Cluster('subflow'+str(n['subflow_id']), fontsize=12, label = "Subflow: "+n['name']+'\\nOSV: '+wkfinfo['osv'])
+ graph2 = pydot.Cluster('subflow'+str(n['subflow_id']), fontsize='12', label = "Subflow: "+n['name']+'\\nOSV: '+wkfinfo['osv'])
(s1,s2) = graph_get(cr, graph2, n['subflow_id'], nested,workitem)
graph.add_subgraph(graph2)
actfrom[n['id']] = s2
@@ -76,7 +76,7 @@ def graph_get(cr, graph, wkf_id, nested=False, workitem={}):
activity_from = actfrom[t['act_from']][1].get(t['signal'], actfrom[t['act_from']][0])
activity_to = actto[t['act_to']][1].get(t['signal'], actto[t['act_to']][0])
- graph.add_edge(pydot.Edge( activity_from ,activity_to, fontsize=10, **args))
+ graph.add_edge(pydot.Edge( str(activity_from) ,str(activity_to), fontsize='10', **args))
nodes = cr.dictfetchall()
cr.execute('select id from wkf_activity where flow_start=True and wkf_id=%d limit 1', (wkf_id,))
start = cr.fetchone()[0]
@@ -143,14 +143,14 @@ showpage'''
showpage'''
else:
inst_id = inst_id[0]
- graph = pydot.Dot(fontsize=16, label="\\n\\nWorkflow: %s\\n OSV: %s" % (wkfinfo['name'],wkfinfo['osv']))
+ graph = pydot.Dot(fontsize='16', label="""\\\n\\nWorkflow: %s\\n OSV: %s""" % (wkfinfo['name'],wkfinfo['osv']))
graph.set('size', '10.7,7.3')
graph.set('center', '1')
graph.set('ratio', 'auto')
graph.set('rotate', '90')
graph.set('rankdir', 'LR')
graph_instance_get(cr, graph, inst_id, data.get('nested', False))
- ps_string = graph.create_ps(prog='dot')
+ ps_string = graph.create(prog='dot', format='ps')
except Exception, e:
import traceback, sys
tb_s = reduce(lambda x, y: x+y, traceback.format_exception(sys.exc_type, sys.exc_value, sys.exc_traceback))
From 3dae09ac14990a82aa9ef8afc2a0429b877ab123 Mon Sep 17 00:00:00 2001
From: Stephane Wirtel
Date: Fri, 14 Nov 2008 16:06:02 +0100
Subject: [PATCH 39/67] Remove pydot, pychart and reportlab.
bzr revid: stephane@tinyerp.com-20081114150602-cpp1eeo3d0837fev
---
bin/addons/base/ir/workflow/pydot/LICENSE | 16 -
bin/addons/base/ir/workflow/pydot/PKG-INFO | 33 -
bin/addons/base/ir/workflow/pydot/README | 29 -
bin/addons/base/ir/workflow/pydot/__init__.py | 1 -
.../base/ir/workflow/pydot/dot_parser.py | 352 -
bin/addons/base/ir/workflow/pydot/pydot.py | 1075 ---
bin/addons/base/ir/workflow/pydot/setup.py | 23 -
bin/pychart/__init__.py | 21 -
bin/pychart/afm/AvantGarde_Book.py | 5 -
bin/pychart/afm/AvantGarde_BookOblique.py | 5 -
bin/pychart/afm/AvantGarde_Demi.py | 5 -
bin/pychart/afm/AvantGarde_DemiOblique.py | 5 -
bin/pychart/afm/Bookman_Demi.py | 5 -
bin/pychart/afm/Bookman_DemiItalic.py | 5 -
bin/pychart/afm/Bookman_Light.py | 5 -
bin/pychart/afm/Bookman_LightItalic.py | 5 -
bin/pychart/afm/Courier.py | 5 -
bin/pychart/afm/Courier_Bold.py | 5 -
bin/pychart/afm/Courier_BoldOblique.py | 5 -
bin/pychart/afm/Courier_Oblique.py | 5 -
bin/pychart/afm/Helvetica.py | 5 -
bin/pychart/afm/Helvetica_Bold.py | 5 -
bin/pychart/afm/Helvetica_BoldOblique.py | 5 -
bin/pychart/afm/Helvetica_Light.py | 5 -
bin/pychart/afm/Helvetica_LightOblique.py | 5 -
bin/pychart/afm/Helvetica_Narrow.py | 5 -
bin/pychart/afm/Helvetica_Narrow_Bold.py | 5 -
.../afm/Helvetica_Narrow_BoldOblique.py | 5 -
bin/pychart/afm/Helvetica_Narrow_Oblique.py | 5 -
bin/pychart/afm/Helvetica_Oblique.py | 5 -
bin/pychart/afm/NewCenturySchlbk_Bold.py | 5 -
.../afm/NewCenturySchlbk_BoldItalic.py | 5 -
bin/pychart/afm/NewCenturySchlbk_Italic.py | 5 -
bin/pychart/afm/NewCenturySchlbk_Roman.py | 5 -
bin/pychart/afm/Palatino_Bold.py | 5 -
bin/pychart/afm/Palatino_BoldItalic.py | 5 -
bin/pychart/afm/Palatino_Italic.py | 5 -
bin/pychart/afm/Palatino_Roman.py | 5 -
bin/pychart/afm/Symbol.py | 5 -
bin/pychart/afm/Times_Bold.py | 5 -
bin/pychart/afm/Times_BoldItalic.py | 5 -
bin/pychart/afm/Times_Italic.py | 5 -
bin/pychart/afm/Times_Roman.py | 5 -
bin/pychart/afm/Utopia_Bold.py | 5 -
bin/pychart/afm/Utopia_BoldItalic.py | 5 -
bin/pychart/afm/Utopia_Italic.py | 5 -
bin/pychart/afm/Utopia_Regular.py | 5 -
bin/pychart/afm/ZapfChancery_MediumItalic.py | 5 -
bin/pychart/afm/ZapfDingbats.py | 5 -
bin/pychart/afm/__init__.py | 1 -
bin/pychart/afm/dir.py | 2 -
bin/pychart/area.py | 249 -
bin/pychart/area_doc.py | 63 -
bin/pychart/arrow.py | 184 -
bin/pychart/arrow_doc.py | 9 -
bin/pychart/axis.py | 241 -
bin/pychart/axis_doc.py | 53 -
bin/pychart/axis_x_doc.py | 65 -
bin/pychart/axis_y_doc.py | 65 -
bin/pychart/bar_plot.py | 268 -
bin/pychart/bar_plot_doc.py | 79 -
bin/pychart/basecanvas.py | 505 --
bin/pychart/canvas.py | 123 -
bin/pychart/category_coord.py | 47 -
bin/pychart/chart_data.py | 387 -
bin/pychart/chart_object.py | 73 -
bin/pychart/color.py | 611 --
bin/pychart/color_doc.py | 7 -
bin/pychart/coord.py | 49 -
bin/pychart/doc_support.py | 122 -
bin/pychart/empty_docs.py | 44 -
bin/pychart/error_bar.py | 159 -
bin/pychart/error_bar_doc.py | 34 -
bin/pychart/fill_style.py | 285 -
bin/pychart/fill_style_doc.py | 7 -
bin/pychart/font.py | 454 -
bin/pychart/generate_docs.py | 125 -
bin/pychart/gs_frontend.py | 87 -
bin/pychart/interval_bar_plot.py | 228 -
bin/pychart/legend.py | 181 -
bin/pychart/legend_doc.py | 28 -
bin/pychart/line_plot.py | 150 -
bin/pychart/line_plot_doc.py | 25 -
bin/pychart/line_style.py | 158 -
bin/pychart/line_style_doc.py | 24 -
bin/pychart/linear_coord.py | 37 -
bin/pychart/log_coord.py | 48 -
bin/pychart/object_set.py | 43 -
bin/pychart/pdfcanvas.py | 297 -
bin/pychart/pie_plot.py | 148 -
bin/pychart/pie_plot_doc.py | 34 -
bin/pychart/pngcanvas.py | 55 -
bin/pychart/pscanvas.py | 257 -
bin/pychart/pychart_types.py | 70 -
bin/pychart/pychart_util.py | 142 -
bin/pychart/range_plot.py | 144 -
bin/pychart/range_plot_doc.py | 11 -
bin/pychart/rose_plot.py | 143 -
bin/pychart/scaling.py | 28 -
bin/pychart/svgcanvas.py | 428 -
bin/pychart/text_box.py | 152 -
bin/pychart/text_box_doc.py | 20 -
bin/pychart/theme.py | 234 -
bin/pychart/tick_mark.py | 188 -
bin/pychart/tick_mark_doc.py | 7 -
bin/pychart/typechecker.py | 27 -
bin/pychart/version.py | 16 -
bin/pychart/x11canvas.py | 25 -
bin/pychart/zap.py | 78 -
bin/reportlab/MANIFEST.in | 6 -
bin/reportlab/README | 35 -
bin/reportlab/__init__.py | 33 -
bin/reportlab/changes | 7788 -----------------
bin/reportlab/demos/colors/colortest.py | 105 -
bin/reportlab/demos/gadflypaper/00readme.txt | 3 -
bin/reportlab/demos/gadflypaper/gfe.py | 903 --
bin/reportlab/demos/odyssey/00readme.txt | 56 -
bin/reportlab/demos/odyssey/dodyssey.py | 254 -
bin/reportlab/demos/odyssey/fodyssey.py | 165 -
bin/reportlab/demos/odyssey/odyssey.py | 151 -
bin/reportlab/demos/odyssey/odyssey.txt | 207 -
bin/reportlab/demos/rlzope/readme.txt | 73 -
bin/reportlab/demos/rlzope/rlzope.py | 169 -
bin/reportlab/demos/stdfonts/00readme.txt | 7 -
bin/reportlab/demos/stdfonts/stdfonts.py | 74 -
bin/reportlab/demos/tests/testdemos.py | 14 -
bin/reportlab/docs/00readme.txt | 7 -
bin/reportlab/docs/genAll.py | 37 -
bin/reportlab/docs/graphguide/ch1_intro.py | 105 -
bin/reportlab/docs/graphguide/ch2_concepts.py | 376 -
bin/reportlab/docs/graphguide/ch3_shapes.py | 416 -
bin/reportlab/docs/graphguide/ch4_widgets.py | 422 -
bin/reportlab/docs/graphguide/ch5_charts.py | 1229 ---
.../docs/graphguide/gengraphguide.py | 59 -
bin/reportlab/docs/images/Edit_Prefs.gif | Bin 9685 -> 0 bytes
bin/reportlab/docs/images/Python_21.gif | Bin 28106 -> 0 bytes
bin/reportlab/docs/images/Python_21_HINT.gif | Bin 29117 -> 0 bytes
bin/reportlab/docs/images/fileExchange.gif | Bin 37812 -> 0 bytes
bin/reportlab/docs/images/jpn.gif | Bin 10513 -> 0 bytes
bin/reportlab/docs/images/jpnchars.jpg | Bin 33898 -> 0 bytes
bin/reportlab/docs/images/lj8100.jpg | Bin 12463 -> 0 bytes
bin/reportlab/docs/images/replogo.a85 | 439 -
bin/reportlab/docs/images/replogo.gif | Bin 16583 -> 0 bytes
bin/reportlab/docs/reference/build.bat | 3 -
bin/reportlab/docs/reference/genreference.py | 29 -
bin/reportlab/docs/reference/reference.yml | 217 -
bin/reportlab/docs/userguide/app_demos.py | 113 -
bin/reportlab/docs/userguide/ch1_intro.py | 693 --
bin/reportlab/docs/userguide/ch2_graphics.py | 1180 ---
bin/reportlab/docs/userguide/ch2a_fonts.py | 513 --
.../docs/userguide/ch3_pdffeatures.py | 271 -
.../docs/userguide/ch4_platypus_concepts.py | 509 --
.../docs/userguide/ch5_paragraphs.py | 319 -
bin/reportlab/docs/userguide/ch6_tables.py | 419 -
bin/reportlab/docs/userguide/ch7_custom.py | 81 -
bin/reportlab/docs/userguide/ch9_future.py | 35 -
bin/reportlab/docs/userguide/genuserguide.py | 85 -
bin/reportlab/docs/userguide/testfile.txt | 2 -
bin/reportlab/extensions/README | 25 -
bin/reportlab/extensions/__init__.py | 7 -
bin/reportlab/extensions/barcode/__init__.py | 33 -
bin/reportlab/extensions/barcode/code128.py | 321 -
bin/reportlab/extensions/barcode/code39.py | 255 -
bin/reportlab/extensions/barcode/code93.py | 232 -
bin/reportlab/extensions/barcode/common.py | 705 --
bin/reportlab/extensions/barcode/fourstate.py | 81 -
bin/reportlab/extensions/barcode/out.pdf | Bin 7359 -> 0 bytes
bin/reportlab/extensions/barcode/test.py | 55 -
bin/reportlab/extensions/barcode/usps.py | 231 -
bin/reportlab/fonts/00readme.txt | 8 -
bin/reportlab/fonts/LeERC___.AFM | 93 -
bin/reportlab/fonts/LeERC___.PFB | Bin 48590 -> 0 bytes
bin/reportlab/fonts/luxiserif.ttf | Bin 88732 -> 0 bytes
bin/reportlab/fonts/luxiserif_license.txt | 40 -
bin/reportlab/fonts/rina.ttf | Bin 36176 -> 0 bytes
bin/reportlab/fonts/rina_license.txt | 93 -
bin/reportlab/graphics/__init__.py | 4 -
bin/reportlab/graphics/barcode/README | 59 -
bin/reportlab/graphics/barcode/TODO | 24 -
bin/reportlab/graphics/barcode/VERSION | 1 -
bin/reportlab/graphics/barcode/__init__.py | 126 -
bin/reportlab/graphics/barcode/code128.py | 322 -
bin/reportlab/graphics/barcode/code39.py | 248 -
bin/reportlab/graphics/barcode/code93.py | 236 -
bin/reportlab/graphics/barcode/common.py | 748 --
bin/reportlab/graphics/barcode/eanbc.py | 339 -
bin/reportlab/graphics/barcode/fourstate.py | 81 -
bin/reportlab/graphics/barcode/test.py | 185 -
bin/reportlab/graphics/barcode/usps.py | 228 -
bin/reportlab/graphics/barcode/widgets.py | 304 -
bin/reportlab/graphics/charts/__init__.py | 4 -
bin/reportlab/graphics/charts/areas.py | 92 -
bin/reportlab/graphics/charts/axes.py | 1979 -----
bin/reportlab/graphics/charts/barcharts.py | 1972 -----
bin/reportlab/graphics/charts/dotbox.py | 165 -
bin/reportlab/graphics/charts/doughnut.py | 349 -
bin/reportlab/graphics/charts/legends.py | 611 --
bin/reportlab/graphics/charts/linecharts.py | 695 --
bin/reportlab/graphics/charts/lineplots.py | 1083 ---
bin/reportlab/graphics/charts/markers.py | 81 -
bin/reportlab/graphics/charts/piecharts.py | 1279 ---
bin/reportlab/graphics/charts/slidebox.py | 186 -
bin/reportlab/graphics/charts/spider.py | 407 -
bin/reportlab/graphics/charts/textlabels.py | 442 -
bin/reportlab/graphics/charts/utils.py | 191 -
bin/reportlab/graphics/charts/utils3d.py | 233 -
bin/reportlab/graphics/renderPDF.py | 360 -
bin/reportlab/graphics/renderPM.py | 663 --
bin/reportlab/graphics/renderPS.py | 871 --
bin/reportlab/graphics/renderSVG.py | 828 --
bin/reportlab/graphics/renderbase.py | 351 -
bin/reportlab/graphics/samples/__init__.py | 0
bin/reportlab/graphics/samples/bubble.py | 73 -
.../graphics/samples/clustered_bar.py | 84 -
.../graphics/samples/clustered_column.py | 83 -
bin/reportlab/graphics/samples/excelcolors.py | 45 -
.../graphics/samples/exploded_pie.py | 65 -
.../graphics/samples/filled_radar.py | 54 -
bin/reportlab/graphics/samples/line_chart.py | 83 -
.../samples/linechart_with_markers.py | 94 -
bin/reportlab/graphics/samples/radar.py | 66 -
bin/reportlab/graphics/samples/runall.py | 59 -
bin/reportlab/graphics/samples/scatter.py | 71 -
.../graphics/samples/scatter_lines.py | 82 -
.../graphics/samples/scatter_lines_markers.py | 72 -
bin/reportlab/graphics/samples/simple_pie.py | 61 -
bin/reportlab/graphics/samples/stacked_bar.py | 85 -
.../graphics/samples/stacked_column.py | 84 -
bin/reportlab/graphics/shapes.py | 1289 ---
bin/reportlab/graphics/testdrawings.py | 294 -
bin/reportlab/graphics/testshapes.py | 574 --
bin/reportlab/graphics/widgetbase.py | 502 --
bin/reportlab/graphics/widgets/__init__.py | 4 -
bin/reportlab/graphics/widgets/eventcal.py | 303 -
bin/reportlab/graphics/widgets/flags.py | 879 --
bin/reportlab/graphics/widgets/grids.py | 504 --
bin/reportlab/graphics/widgets/markers.py | 228 -
.../graphics/widgets/signsandsymbols.py | 919 --
bin/reportlab/lib/PyFontify.py | 155 -
bin/reportlab/lib/__init__.py | 7 -
bin/reportlab/lib/abag.py | 44 -
bin/reportlab/lib/attrmap.py | 138 -
bin/reportlab/lib/codecharts.py | 365 -
bin/reportlab/lib/colors.py | 565 --
bin/reportlab/lib/corp.py | 452 -
bin/reportlab/lib/enums.py | 11 -
bin/reportlab/lib/extformat.py | 81 -
bin/reportlab/lib/fonts.py | 89 -
bin/reportlab/lib/formatters.py | 100 -
bin/reportlab/lib/logger.py | 61 -
bin/reportlab/lib/normalDate.py | 605 --
bin/reportlab/lib/pagesizes.py | 55 -
bin/reportlab/lib/randomtext.py | 348 -
bin/reportlab/lib/rltempfile.py | 29 -
bin/reportlab/lib/rparsexml.py | 431 -
bin/reportlab/lib/sequencer.py | 284 -
bin/reportlab/lib/set_ops.py | 38 -
bin/reportlab/lib/styles.py | 257 -
bin/reportlab/lib/textsplit.py | 210 -
bin/reportlab/lib/tocindex.py | 294 -
bin/reportlab/lib/units.py | 23 -
bin/reportlab/lib/utils.py | 827 --
bin/reportlab/lib/validators.py | 324 -
bin/reportlab/lib/xmllib.py | 769 --
bin/reportlab/lib/yaml.py | 188 -
bin/reportlab/license.txt | 29 -
bin/reportlab/pdfbase/__init__.py | 6 -
bin/reportlab/pdfbase/_can_cmap_data.py | 58 -
bin/reportlab/pdfbase/_cidfontdata.py | 483 -
bin/reportlab/pdfbase/_fontdata.py | 2590 ------
bin/reportlab/pdfbase/cidfonts.py | 516 --
bin/reportlab/pdfbase/pdfdoc.py | 1892 ----
bin/reportlab/pdfbase/pdfform.py | 632 --
bin/reportlab/pdfbase/pdfmetrics.py | 796 --
bin/reportlab/pdfbase/pdfpattern.py | 59 -
bin/reportlab/pdfbase/pdfutils.py | 460 -
bin/reportlab/pdfbase/rl_codecs.py | 1027 ---
bin/reportlab/pdfbase/ttfonts.py | 1113 ---
bin/reportlab/pdfgen/__init__.py | 5 -
bin/reportlab/pdfgen/canvas.py | 1462 ----
bin/reportlab/pdfgen/pathobject.py | 101 -
bin/reportlab/pdfgen/pdfgeom.py | 77 -
bin/reportlab/pdfgen/pdfimages.py | 188 -
bin/reportlab/pdfgen/pycanvas.py | 309 -
bin/reportlab/pdfgen/textobject.py | 398 -
bin/reportlab/platypus/__init__.py | 15 -
bin/reportlab/platypus/doctemplate.py | 953 --
bin/reportlab/platypus/figures.py | 372 -
bin/reportlab/platypus/flowables.py | 1051 ---
bin/reportlab/platypus/frames.py | 206 -
bin/reportlab/platypus/para.py | 2394 -----
bin/reportlab/platypus/paragraph.py | 1082 ---
bin/reportlab/platypus/paraparser.py | 898 --
bin/reportlab/platypus/tableofcontents.py | 329 -
bin/reportlab/platypus/tables.py | 1384 ---
bin/reportlab/platypus/xpreformatted.py | 316 -
bin/reportlab/rl_config.py | 155 -
bin/reportlab/setup.py | 258 -
bin/reportlab/test/00readme.txt | 20 -
bin/reportlab/test/__init__.py | 3 -
bin/reportlab/test/pythonpowered.gif | Bin 1077 -> 0 bytes
bin/reportlab/test/runAll.py | 93 -
bin/reportlab/test/test_charts_textlabels.py | 279 -
bin/reportlab/test/test_docs_build.py | 51 -
bin/reportlab/test/test_docstrings.py | 175 -
bin/reportlab/test/test_extra.py | 102 -
bin/reportlab/test/test_graphics_charts.py | 423 -
bin/reportlab/test/test_graphics_images.py | 91 -
bin/reportlab/test/test_graphics_layout.py | 82 -
bin/reportlab/test/test_graphics_speed.py | 86 -
bin/reportlab/test/test_hello.py | 34 -
bin/reportlab/test/test_images.py | 55 -
bin/reportlab/test/test_invariant.py | 56 -
bin/reportlab/test/test_lib_colors.py | 161 -
bin/reportlab/test/test_lib_sequencer.py | 123 -
bin/reportlab/test/test_lib_utils.py | 115 -
bin/reportlab/test/test_lib_validators.py | 165 -
bin/reportlab/test/test_multibyte_chs.py | 84 -
bin/reportlab/test/test_multibyte_cht.py | 131 -
bin/reportlab/test/test_multibyte_jpn.py | 460 -
bin/reportlab/test/test_multibyte_kor.py | 125 -
bin/reportlab/test/test_paragraphs.py | 174 -
bin/reportlab/test/test_pdfbase_encodings.py | 255 -
bin/reportlab/test/test_pdfbase_fontembed.py | 90 -
bin/reportlab/test/test_pdfbase_pdfmetrics.py | 121 -
bin/reportlab/test/test_pdfbase_pdfutils.py | 52 -
bin/reportlab/test/test_pdfbase_postscript.py | 77 -
bin/reportlab/test/test_pdfbase_ttfonts.py | 391 -
bin/reportlab/test/test_pdfgen_callback.py | 39 -
bin/reportlab/test/test_pdfgen_general.py | 840 --
bin/reportlab/test/test_pdfgen_links.py | 187 -
bin/reportlab/test/test_pdfgen_pagemodes.py | 70 -
bin/reportlab/test/test_pdfgen_pycanvas.py | 790 --
bin/reportlab/test/test_platypus_breaking.py | 114 -
bin/reportlab/test/test_platypus_general.py | 581 --
bin/reportlab/test/test_platypus_indents.py | 140 -
bin/reportlab/test/test_platypus_leftright.py | 158 -
.../test/test_platypus_paragraphs.py | 184 -
.../test/test_platypus_paraparser.py | 91 -
bin/reportlab/test/test_platypus_pto.py | 195 -
bin/reportlab/test/test_platypus_tables.py | 717 --
bin/reportlab/test/test_platypus_toc.py | 183 -
bin/reportlab/test/test_platypus_xref.py | 140 -
bin/reportlab/test/test_pyfiles.py | 158 -
bin/reportlab/test/test_renderSVG.py | 165 -
bin/reportlab/test/test_rl_accel.py | 168 -
bin/reportlab/test/test_source_chars.py | 95 -
bin/reportlab/test/test_table_layout.py | 425 -
bin/reportlab/test/test_tools_pythonpoint.py | 39 -
bin/reportlab/test/test_utils.py | 37 -
bin/reportlab/test/test_widgetbase_tpc.py | 138 -
bin/reportlab/test/test_widgets_grids.py | 454 -
bin/reportlab/test/unittest.py | 723 --
bin/reportlab/test/utils.py | 308 -
bin/reportlab/tools/README | 10 -
bin/reportlab/tools/__init__.py | 3 -
bin/reportlab/tools/docco/README | 8 -
bin/reportlab/tools/docco/__init__.py | 3 -
bin/reportlab/tools/docco/codegrab.py | 228 -
bin/reportlab/tools/docco/docpy.py | 1247 ---
bin/reportlab/tools/docco/examples.py | 851 --
bin/reportlab/tools/docco/graphdocpy.py | 980 ---
bin/reportlab/tools/docco/rl_doc_utils.py | 411 -
bin/reportlab/tools/docco/rltemplate.py | 135 -
bin/reportlab/tools/docco/stylesheet.py | 165 -
bin/reportlab/tools/docco/t_parse.py | 247 -
bin/reportlab/tools/docco/yaml.py | 201 -
bin/reportlab/tools/docco/yaml2pdf.py | 104 -
bin/reportlab/tools/py2pdf/README | 8 -
bin/reportlab/tools/py2pdf/__init__.py | 3 -
bin/reportlab/tools/py2pdf/demo-config.txt | 11 -
bin/reportlab/tools/py2pdf/demo.py | 198 -
bin/reportlab/tools/py2pdf/idle_print.py | 56 -
bin/reportlab/tools/py2pdf/py2pdf.py | 1567 ----
bin/reportlab/tools/py2pdf/vertpython.jpg | Bin 22872 -> 0 bytes
bin/reportlab/tools/pythonpoint/README | 29 -
bin/reportlab/tools/pythonpoint/__init__.py | 3 -
.../tools/pythonpoint/customshapes.py | 298 -
.../tools/pythonpoint/demos/LeERC___.AFM | 93 -
.../tools/pythonpoint/demos/LeERC___.PFB | Bin 48590 -> 0 bytes
.../tools/pythonpoint/demos/examples.py | 841 --
.../tools/pythonpoint/demos/figures.xml | 71 -
bin/reportlab/tools/pythonpoint/demos/htu.xml | 96 -
.../tools/pythonpoint/demos/leftlogo.a85 | 53 -
.../tools/pythonpoint/demos/leftlogo.gif | Bin 2198 -> 0 bytes
.../tools/pythonpoint/demos/lj8100.jpg | Bin 12463 -> 0 bytes
.../tools/pythonpoint/demos/monterey.xml | 306 -
.../tools/pythonpoint/demos/outline.gif | Bin 12918 -> 0 bytes
.../tools/pythonpoint/demos/pplogo.gif | Bin 3429 -> 0 bytes
.../tools/pythonpoint/demos/python.gif | Bin 125666 -> 0 bytes
.../tools/pythonpoint/demos/pythonpoint.xml | 1051 ---
.../tools/pythonpoint/demos/slidebox.py | 29 -
.../tools/pythonpoint/demos/spectrum.png | Bin 1855 -> 0 bytes
.../tools/pythonpoint/demos/vertpython.gif | Bin 20910 -> 0 bytes
.../tools/pythonpoint/pythonpoint.dtd | 275 -
.../tools/pythonpoint/pythonpoint.py | 1124 ---
bin/reportlab/tools/pythonpoint/stdparser.py | 813 --
.../tools/pythonpoint/styles/__init__.py | 3 -
.../tools/pythonpoint/styles/horrible.py | 101 -
bin/reportlab/tools/pythonpoint/styles/htu.py | 158 -
.../tools/pythonpoint/styles/modern.py | 120 -
.../tools/pythonpoint/styles/projection.py | 106 -
.../tools/pythonpoint/styles/standard.py | 132 -
bin/reportlab/tools/utils/add_bleed.py | 28 -
bin/reportlab/tools/utils/dumpttf.py | 60 -
405 files changed, 103567 deletions(-)
delete mode 100755 bin/addons/base/ir/workflow/pydot/LICENSE
delete mode 100755 bin/addons/base/ir/workflow/pydot/PKG-INFO
delete mode 100755 bin/addons/base/ir/workflow/pydot/README
delete mode 100644 bin/addons/base/ir/workflow/pydot/__init__.py
delete mode 100644 bin/addons/base/ir/workflow/pydot/dot_parser.py
delete mode 100644 bin/addons/base/ir/workflow/pydot/pydot.py
delete mode 100644 bin/addons/base/ir/workflow/pydot/setup.py
delete mode 100644 bin/pychart/__init__.py
delete mode 100644 bin/pychart/afm/AvantGarde_Book.py
delete mode 100644 bin/pychart/afm/AvantGarde_BookOblique.py
delete mode 100644 bin/pychart/afm/AvantGarde_Demi.py
delete mode 100644 bin/pychart/afm/AvantGarde_DemiOblique.py
delete mode 100644 bin/pychart/afm/Bookman_Demi.py
delete mode 100644 bin/pychart/afm/Bookman_DemiItalic.py
delete mode 100644 bin/pychart/afm/Bookman_Light.py
delete mode 100644 bin/pychart/afm/Bookman_LightItalic.py
delete mode 100644 bin/pychart/afm/Courier.py
delete mode 100644 bin/pychart/afm/Courier_Bold.py
delete mode 100644 bin/pychart/afm/Courier_BoldOblique.py
delete mode 100644 bin/pychart/afm/Courier_Oblique.py
delete mode 100644 bin/pychart/afm/Helvetica.py
delete mode 100644 bin/pychart/afm/Helvetica_Bold.py
delete mode 100644 bin/pychart/afm/Helvetica_BoldOblique.py
delete mode 100644 bin/pychart/afm/Helvetica_Light.py
delete mode 100644 bin/pychart/afm/Helvetica_LightOblique.py
delete mode 100644 bin/pychart/afm/Helvetica_Narrow.py
delete mode 100644 bin/pychart/afm/Helvetica_Narrow_Bold.py
delete mode 100644 bin/pychart/afm/Helvetica_Narrow_BoldOblique.py
delete mode 100644 bin/pychart/afm/Helvetica_Narrow_Oblique.py
delete mode 100644 bin/pychart/afm/Helvetica_Oblique.py
delete mode 100644 bin/pychart/afm/NewCenturySchlbk_Bold.py
delete mode 100644 bin/pychart/afm/NewCenturySchlbk_BoldItalic.py
delete mode 100644 bin/pychart/afm/NewCenturySchlbk_Italic.py
delete mode 100644 bin/pychart/afm/NewCenturySchlbk_Roman.py
delete mode 100644 bin/pychart/afm/Palatino_Bold.py
delete mode 100644 bin/pychart/afm/Palatino_BoldItalic.py
delete mode 100644 bin/pychart/afm/Palatino_Italic.py
delete mode 100644 bin/pychart/afm/Palatino_Roman.py
delete mode 100644 bin/pychart/afm/Symbol.py
delete mode 100644 bin/pychart/afm/Times_Bold.py
delete mode 100644 bin/pychart/afm/Times_BoldItalic.py
delete mode 100644 bin/pychart/afm/Times_Italic.py
delete mode 100644 bin/pychart/afm/Times_Roman.py
delete mode 100644 bin/pychart/afm/Utopia_Bold.py
delete mode 100644 bin/pychart/afm/Utopia_BoldItalic.py
delete mode 100644 bin/pychart/afm/Utopia_Italic.py
delete mode 100644 bin/pychart/afm/Utopia_Regular.py
delete mode 100644 bin/pychart/afm/ZapfChancery_MediumItalic.py
delete mode 100644 bin/pychart/afm/ZapfDingbats.py
delete mode 100644 bin/pychart/afm/__init__.py
delete mode 100644 bin/pychart/afm/dir.py
delete mode 100644 bin/pychart/area.py
delete mode 100644 bin/pychart/area_doc.py
delete mode 100644 bin/pychart/arrow.py
delete mode 100644 bin/pychart/arrow_doc.py
delete mode 100644 bin/pychart/axis.py
delete mode 100644 bin/pychart/axis_doc.py
delete mode 100644 bin/pychart/axis_x_doc.py
delete mode 100644 bin/pychart/axis_y_doc.py
delete mode 100644 bin/pychart/bar_plot.py
delete mode 100644 bin/pychart/bar_plot_doc.py
delete mode 100644 bin/pychart/basecanvas.py
delete mode 100644 bin/pychart/canvas.py
delete mode 100644 bin/pychart/category_coord.py
delete mode 100644 bin/pychart/chart_data.py
delete mode 100644 bin/pychart/chart_object.py
delete mode 100644 bin/pychart/color.py
delete mode 100644 bin/pychart/color_doc.py
delete mode 100644 bin/pychart/coord.py
delete mode 100644 bin/pychart/doc_support.py
delete mode 100644 bin/pychart/empty_docs.py
delete mode 100644 bin/pychart/error_bar.py
delete mode 100644 bin/pychart/error_bar_doc.py
delete mode 100644 bin/pychart/fill_style.py
delete mode 100644 bin/pychart/fill_style_doc.py
delete mode 100644 bin/pychart/font.py
delete mode 100644 bin/pychart/generate_docs.py
delete mode 100644 bin/pychart/gs_frontend.py
delete mode 100644 bin/pychart/interval_bar_plot.py
delete mode 100644 bin/pychart/legend.py
delete mode 100644 bin/pychart/legend_doc.py
delete mode 100644 bin/pychart/line_plot.py
delete mode 100644 bin/pychart/line_plot_doc.py
delete mode 100644 bin/pychart/line_style.py
delete mode 100644 bin/pychart/line_style_doc.py
delete mode 100644 bin/pychart/linear_coord.py
delete mode 100644 bin/pychart/log_coord.py
delete mode 100644 bin/pychart/object_set.py
delete mode 100644 bin/pychart/pdfcanvas.py
delete mode 100644 bin/pychart/pie_plot.py
delete mode 100644 bin/pychart/pie_plot_doc.py
delete mode 100644 bin/pychart/pngcanvas.py
delete mode 100644 bin/pychart/pscanvas.py
delete mode 100644 bin/pychart/pychart_types.py
delete mode 100644 bin/pychart/pychart_util.py
delete mode 100644 bin/pychart/range_plot.py
delete mode 100644 bin/pychart/range_plot_doc.py
delete mode 100644 bin/pychart/rose_plot.py
delete mode 100644 bin/pychart/scaling.py
delete mode 100644 bin/pychart/svgcanvas.py
delete mode 100644 bin/pychart/text_box.py
delete mode 100644 bin/pychart/text_box_doc.py
delete mode 100644 bin/pychart/theme.py
delete mode 100644 bin/pychart/tick_mark.py
delete mode 100644 bin/pychart/tick_mark_doc.py
delete mode 100644 bin/pychart/typechecker.py
delete mode 100644 bin/pychart/version.py
delete mode 100644 bin/pychart/x11canvas.py
delete mode 100644 bin/pychart/zap.py
delete mode 100644 bin/reportlab/MANIFEST.in
delete mode 100644 bin/reportlab/README
delete mode 100644 bin/reportlab/__init__.py
delete mode 100644 bin/reportlab/changes
delete mode 100644 bin/reportlab/demos/colors/colortest.py
delete mode 100644 bin/reportlab/demos/gadflypaper/00readme.txt
delete mode 100644 bin/reportlab/demos/gadflypaper/gfe.py
delete mode 100644 bin/reportlab/demos/odyssey/00readme.txt
delete mode 100644 bin/reportlab/demos/odyssey/dodyssey.py
delete mode 100644 bin/reportlab/demos/odyssey/fodyssey.py
delete mode 100644 bin/reportlab/demos/odyssey/odyssey.py
delete mode 100644 bin/reportlab/demos/odyssey/odyssey.txt
delete mode 100644 bin/reportlab/demos/rlzope/readme.txt
delete mode 100644 bin/reportlab/demos/rlzope/rlzope.py
delete mode 100644 bin/reportlab/demos/stdfonts/00readme.txt
delete mode 100644 bin/reportlab/demos/stdfonts/stdfonts.py
delete mode 100644 bin/reportlab/demos/tests/testdemos.py
delete mode 100644 bin/reportlab/docs/00readme.txt
delete mode 100644 bin/reportlab/docs/genAll.py
delete mode 100644 bin/reportlab/docs/graphguide/ch1_intro.py
delete mode 100644 bin/reportlab/docs/graphguide/ch2_concepts.py
delete mode 100644 bin/reportlab/docs/graphguide/ch3_shapes.py
delete mode 100644 bin/reportlab/docs/graphguide/ch4_widgets.py
delete mode 100644 bin/reportlab/docs/graphguide/ch5_charts.py
delete mode 100644 bin/reportlab/docs/graphguide/gengraphguide.py
delete mode 100644 bin/reportlab/docs/images/Edit_Prefs.gif
delete mode 100644 bin/reportlab/docs/images/Python_21.gif
delete mode 100644 bin/reportlab/docs/images/Python_21_HINT.gif
delete mode 100644 bin/reportlab/docs/images/fileExchange.gif
delete mode 100644 bin/reportlab/docs/images/jpn.gif
delete mode 100644 bin/reportlab/docs/images/jpnchars.jpg
delete mode 100644 bin/reportlab/docs/images/lj8100.jpg
delete mode 100644 bin/reportlab/docs/images/replogo.a85
delete mode 100644 bin/reportlab/docs/images/replogo.gif
delete mode 100755 bin/reportlab/docs/reference/build.bat
delete mode 100644 bin/reportlab/docs/reference/genreference.py
delete mode 100644 bin/reportlab/docs/reference/reference.yml
delete mode 100644 bin/reportlab/docs/userguide/app_demos.py
delete mode 100644 bin/reportlab/docs/userguide/ch1_intro.py
delete mode 100644 bin/reportlab/docs/userguide/ch2_graphics.py
delete mode 100644 bin/reportlab/docs/userguide/ch2a_fonts.py
delete mode 100644 bin/reportlab/docs/userguide/ch3_pdffeatures.py
delete mode 100644 bin/reportlab/docs/userguide/ch4_platypus_concepts.py
delete mode 100644 bin/reportlab/docs/userguide/ch5_paragraphs.py
delete mode 100644 bin/reportlab/docs/userguide/ch6_tables.py
delete mode 100644 bin/reportlab/docs/userguide/ch7_custom.py
delete mode 100644 bin/reportlab/docs/userguide/ch9_future.py
delete mode 100644 bin/reportlab/docs/userguide/genuserguide.py
delete mode 100644 bin/reportlab/docs/userguide/testfile.txt
delete mode 100644 bin/reportlab/extensions/README
delete mode 100644 bin/reportlab/extensions/__init__.py
delete mode 100644 bin/reportlab/extensions/barcode/__init__.py
delete mode 100644 bin/reportlab/extensions/barcode/code128.py
delete mode 100644 bin/reportlab/extensions/barcode/code39.py
delete mode 100644 bin/reportlab/extensions/barcode/code93.py
delete mode 100644 bin/reportlab/extensions/barcode/common.py
delete mode 100644 bin/reportlab/extensions/barcode/fourstate.py
delete mode 100644 bin/reportlab/extensions/barcode/out.pdf
delete mode 100644 bin/reportlab/extensions/barcode/test.py
delete mode 100644 bin/reportlab/extensions/barcode/usps.py
delete mode 100644 bin/reportlab/fonts/00readme.txt
delete mode 100644 bin/reportlab/fonts/LeERC___.AFM
delete mode 100644 bin/reportlab/fonts/LeERC___.PFB
delete mode 100644 bin/reportlab/fonts/luxiserif.ttf
delete mode 100644 bin/reportlab/fonts/luxiserif_license.txt
delete mode 100644 bin/reportlab/fonts/rina.ttf
delete mode 100644 bin/reportlab/fonts/rina_license.txt
delete mode 100644 bin/reportlab/graphics/__init__.py
delete mode 100644 bin/reportlab/graphics/barcode/README
delete mode 100644 bin/reportlab/graphics/barcode/TODO
delete mode 100644 bin/reportlab/graphics/barcode/VERSION
delete mode 100644 bin/reportlab/graphics/barcode/__init__.py
delete mode 100644 bin/reportlab/graphics/barcode/code128.py
delete mode 100644 bin/reportlab/graphics/barcode/code39.py
delete mode 100644 bin/reportlab/graphics/barcode/code93.py
delete mode 100644 bin/reportlab/graphics/barcode/common.py
delete mode 100644 bin/reportlab/graphics/barcode/eanbc.py
delete mode 100644 bin/reportlab/graphics/barcode/fourstate.py
delete mode 100644 bin/reportlab/graphics/barcode/test.py
delete mode 100644 bin/reportlab/graphics/barcode/usps.py
delete mode 100644 bin/reportlab/graphics/barcode/widgets.py
delete mode 100644 bin/reportlab/graphics/charts/__init__.py
delete mode 100644 bin/reportlab/graphics/charts/areas.py
delete mode 100644 bin/reportlab/graphics/charts/axes.py
delete mode 100644 bin/reportlab/graphics/charts/barcharts.py
delete mode 100644 bin/reportlab/graphics/charts/dotbox.py
delete mode 100644 bin/reportlab/graphics/charts/doughnut.py
delete mode 100644 bin/reportlab/graphics/charts/legends.py
delete mode 100644 bin/reportlab/graphics/charts/linecharts.py
delete mode 100644 bin/reportlab/graphics/charts/lineplots.py
delete mode 100644 bin/reportlab/graphics/charts/markers.py
delete mode 100644 bin/reportlab/graphics/charts/piecharts.py
delete mode 100644 bin/reportlab/graphics/charts/slidebox.py
delete mode 100644 bin/reportlab/graphics/charts/spider.py
delete mode 100644 bin/reportlab/graphics/charts/textlabels.py
delete mode 100644 bin/reportlab/graphics/charts/utils.py
delete mode 100644 bin/reportlab/graphics/charts/utils3d.py
delete mode 100644 bin/reportlab/graphics/renderPDF.py
delete mode 100644 bin/reportlab/graphics/renderPM.py
delete mode 100644 bin/reportlab/graphics/renderPS.py
delete mode 100644 bin/reportlab/graphics/renderSVG.py
delete mode 100644 bin/reportlab/graphics/renderbase.py
delete mode 100644 bin/reportlab/graphics/samples/__init__.py
delete mode 100644 bin/reportlab/graphics/samples/bubble.py
delete mode 100644 bin/reportlab/graphics/samples/clustered_bar.py
delete mode 100644 bin/reportlab/graphics/samples/clustered_column.py
delete mode 100644 bin/reportlab/graphics/samples/excelcolors.py
delete mode 100644 bin/reportlab/graphics/samples/exploded_pie.py
delete mode 100644 bin/reportlab/graphics/samples/filled_radar.py
delete mode 100644 bin/reportlab/graphics/samples/line_chart.py
delete mode 100644 bin/reportlab/graphics/samples/linechart_with_markers.py
delete mode 100644 bin/reportlab/graphics/samples/radar.py
delete mode 100644 bin/reportlab/graphics/samples/runall.py
delete mode 100644 bin/reportlab/graphics/samples/scatter.py
delete mode 100644 bin/reportlab/graphics/samples/scatter_lines.py
delete mode 100644 bin/reportlab/graphics/samples/scatter_lines_markers.py
delete mode 100644 bin/reportlab/graphics/samples/simple_pie.py
delete mode 100644 bin/reportlab/graphics/samples/stacked_bar.py
delete mode 100644 bin/reportlab/graphics/samples/stacked_column.py
delete mode 100644 bin/reportlab/graphics/shapes.py
delete mode 100644 bin/reportlab/graphics/testdrawings.py
delete mode 100644 bin/reportlab/graphics/testshapes.py
delete mode 100644 bin/reportlab/graphics/widgetbase.py
delete mode 100644 bin/reportlab/graphics/widgets/__init__.py
delete mode 100644 bin/reportlab/graphics/widgets/eventcal.py
delete mode 100644 bin/reportlab/graphics/widgets/flags.py
delete mode 100644 bin/reportlab/graphics/widgets/grids.py
delete mode 100644 bin/reportlab/graphics/widgets/markers.py
delete mode 100644 bin/reportlab/graphics/widgets/signsandsymbols.py
delete mode 100644 bin/reportlab/lib/PyFontify.py
delete mode 100644 bin/reportlab/lib/__init__.py
delete mode 100644 bin/reportlab/lib/abag.py
delete mode 100644 bin/reportlab/lib/attrmap.py
delete mode 100644 bin/reportlab/lib/codecharts.py
delete mode 100644 bin/reportlab/lib/colors.py
delete mode 100644 bin/reportlab/lib/corp.py
delete mode 100644 bin/reportlab/lib/enums.py
delete mode 100644 bin/reportlab/lib/extformat.py
delete mode 100644 bin/reportlab/lib/fonts.py
delete mode 100644 bin/reportlab/lib/formatters.py
delete mode 100644 bin/reportlab/lib/logger.py
delete mode 100644 bin/reportlab/lib/normalDate.py
delete mode 100644 bin/reportlab/lib/pagesizes.py
delete mode 100644 bin/reportlab/lib/randomtext.py
delete mode 100644 bin/reportlab/lib/rltempfile.py
delete mode 100644 bin/reportlab/lib/rparsexml.py
delete mode 100644 bin/reportlab/lib/sequencer.py
delete mode 100644 bin/reportlab/lib/set_ops.py
delete mode 100644 bin/reportlab/lib/styles.py
delete mode 100644 bin/reportlab/lib/textsplit.py
delete mode 100644 bin/reportlab/lib/tocindex.py
delete mode 100644 bin/reportlab/lib/units.py
delete mode 100644 bin/reportlab/lib/utils.py
delete mode 100644 bin/reportlab/lib/validators.py
delete mode 100644 bin/reportlab/lib/xmllib.py
delete mode 100644 bin/reportlab/lib/yaml.py
delete mode 100644 bin/reportlab/license.txt
delete mode 100755 bin/reportlab/pdfbase/__init__.py
delete mode 100644 bin/reportlab/pdfbase/_can_cmap_data.py
delete mode 100644 bin/reportlab/pdfbase/_cidfontdata.py
delete mode 100644 bin/reportlab/pdfbase/_fontdata.py
delete mode 100644 bin/reportlab/pdfbase/cidfonts.py
delete mode 100755 bin/reportlab/pdfbase/pdfdoc.py
delete mode 100644 bin/reportlab/pdfbase/pdfform.py
delete mode 100755 bin/reportlab/pdfbase/pdfmetrics.py
delete mode 100644 bin/reportlab/pdfbase/pdfpattern.py
delete mode 100755 bin/reportlab/pdfbase/pdfutils.py
delete mode 100644 bin/reportlab/pdfbase/rl_codecs.py
delete mode 100644 bin/reportlab/pdfbase/ttfonts.py
delete mode 100755 bin/reportlab/pdfgen/__init__.py
delete mode 100755 bin/reportlab/pdfgen/canvas.py
delete mode 100755 bin/reportlab/pdfgen/pathobject.py
delete mode 100755 bin/reportlab/pdfgen/pdfgeom.py
delete mode 100644 bin/reportlab/pdfgen/pdfimages.py
delete mode 100644 bin/reportlab/pdfgen/pycanvas.py
delete mode 100755 bin/reportlab/pdfgen/textobject.py
delete mode 100755 bin/reportlab/platypus/__init__.py
delete mode 100644 bin/reportlab/platypus/doctemplate.py
delete mode 100644 bin/reportlab/platypus/figures.py
delete mode 100644 bin/reportlab/platypus/flowables.py
delete mode 100644 bin/reportlab/platypus/frames.py
delete mode 100644 bin/reportlab/platypus/para.py
delete mode 100644 bin/reportlab/platypus/paragraph.py
delete mode 100644 bin/reportlab/platypus/paraparser.py
delete mode 100644 bin/reportlab/platypus/tableofcontents.py
delete mode 100755 bin/reportlab/platypus/tables.py
delete mode 100644 bin/reportlab/platypus/xpreformatted.py
delete mode 100644 bin/reportlab/rl_config.py
delete mode 100644 bin/reportlab/setup.py
delete mode 100644 bin/reportlab/test/00readme.txt
delete mode 100644 bin/reportlab/test/__init__.py
delete mode 100644 bin/reportlab/test/pythonpowered.gif
delete mode 100644 bin/reportlab/test/runAll.py
delete mode 100644 bin/reportlab/test/test_charts_textlabels.py
delete mode 100644 bin/reportlab/test/test_docs_build.py
delete mode 100644 bin/reportlab/test/test_docstrings.py
delete mode 100644 bin/reportlab/test/test_extra.py
delete mode 100644 bin/reportlab/test/test_graphics_charts.py
delete mode 100644 bin/reportlab/test/test_graphics_images.py
delete mode 100644 bin/reportlab/test/test_graphics_layout.py
delete mode 100644 bin/reportlab/test/test_graphics_speed.py
delete mode 100644 bin/reportlab/test/test_hello.py
delete mode 100644 bin/reportlab/test/test_images.py
delete mode 100644 bin/reportlab/test/test_invariant.py
delete mode 100644 bin/reportlab/test/test_lib_colors.py
delete mode 100644 bin/reportlab/test/test_lib_sequencer.py
delete mode 100644 bin/reportlab/test/test_lib_utils.py
delete mode 100644 bin/reportlab/test/test_lib_validators.py
delete mode 100644 bin/reportlab/test/test_multibyte_chs.py
delete mode 100644 bin/reportlab/test/test_multibyte_cht.py
delete mode 100644 bin/reportlab/test/test_multibyte_jpn.py
delete mode 100644 bin/reportlab/test/test_multibyte_kor.py
delete mode 100644 bin/reportlab/test/test_paragraphs.py
delete mode 100644 bin/reportlab/test/test_pdfbase_encodings.py
delete mode 100644 bin/reportlab/test/test_pdfbase_fontembed.py
delete mode 100644 bin/reportlab/test/test_pdfbase_pdfmetrics.py
delete mode 100644 bin/reportlab/test/test_pdfbase_pdfutils.py
delete mode 100644 bin/reportlab/test/test_pdfbase_postscript.py
delete mode 100644 bin/reportlab/test/test_pdfbase_ttfonts.py
delete mode 100644 bin/reportlab/test/test_pdfgen_callback.py
delete mode 100644 bin/reportlab/test/test_pdfgen_general.py
delete mode 100644 bin/reportlab/test/test_pdfgen_links.py
delete mode 100644 bin/reportlab/test/test_pdfgen_pagemodes.py
delete mode 100644 bin/reportlab/test/test_pdfgen_pycanvas.py
delete mode 100644 bin/reportlab/test/test_platypus_breaking.py
delete mode 100644 bin/reportlab/test/test_platypus_general.py
delete mode 100644 bin/reportlab/test/test_platypus_indents.py
delete mode 100644 bin/reportlab/test/test_platypus_leftright.py
delete mode 100644 bin/reportlab/test/test_platypus_paragraphs.py
delete mode 100644 bin/reportlab/test/test_platypus_paraparser.py
delete mode 100644 bin/reportlab/test/test_platypus_pto.py
delete mode 100644 bin/reportlab/test/test_platypus_tables.py
delete mode 100644 bin/reportlab/test/test_platypus_toc.py
delete mode 100644 bin/reportlab/test/test_platypus_xref.py
delete mode 100644 bin/reportlab/test/test_pyfiles.py
delete mode 100755 bin/reportlab/test/test_renderSVG.py
delete mode 100755 bin/reportlab/test/test_rl_accel.py
delete mode 100644 bin/reportlab/test/test_source_chars.py
delete mode 100644 bin/reportlab/test/test_table_layout.py
delete mode 100644 bin/reportlab/test/test_tools_pythonpoint.py
delete mode 100644 bin/reportlab/test/test_utils.py
delete mode 100644 bin/reportlab/test/test_widgetbase_tpc.py
delete mode 100644 bin/reportlab/test/test_widgets_grids.py
delete mode 100644 bin/reportlab/test/unittest.py
delete mode 100644 bin/reportlab/test/utils.py
delete mode 100644 bin/reportlab/tools/README
delete mode 100644 bin/reportlab/tools/__init__.py
delete mode 100644 bin/reportlab/tools/docco/README
delete mode 100644 bin/reportlab/tools/docco/__init__.py
delete mode 100644 bin/reportlab/tools/docco/codegrab.py
delete mode 100644 bin/reportlab/tools/docco/docpy.py
delete mode 100644 bin/reportlab/tools/docco/examples.py
delete mode 100644 bin/reportlab/tools/docco/graphdocpy.py
delete mode 100644 bin/reportlab/tools/docco/rl_doc_utils.py
delete mode 100644 bin/reportlab/tools/docco/rltemplate.py
delete mode 100644 bin/reportlab/tools/docco/stylesheet.py
delete mode 100644 bin/reportlab/tools/docco/t_parse.py
delete mode 100644 bin/reportlab/tools/docco/yaml.py
delete mode 100644 bin/reportlab/tools/docco/yaml2pdf.py
delete mode 100644 bin/reportlab/tools/py2pdf/README
delete mode 100644 bin/reportlab/tools/py2pdf/__init__.py
delete mode 100644 bin/reportlab/tools/py2pdf/demo-config.txt
delete mode 100644 bin/reportlab/tools/py2pdf/demo.py
delete mode 100644 bin/reportlab/tools/py2pdf/idle_print.py
delete mode 100644 bin/reportlab/tools/py2pdf/py2pdf.py
delete mode 100644 bin/reportlab/tools/py2pdf/vertpython.jpg
delete mode 100644 bin/reportlab/tools/pythonpoint/README
delete mode 100644 bin/reportlab/tools/pythonpoint/__init__.py
delete mode 100644 bin/reportlab/tools/pythonpoint/customshapes.py
delete mode 100644 bin/reportlab/tools/pythonpoint/demos/LeERC___.AFM
delete mode 100644 bin/reportlab/tools/pythonpoint/demos/LeERC___.PFB
delete mode 100644 bin/reportlab/tools/pythonpoint/demos/examples.py
delete mode 100644 bin/reportlab/tools/pythonpoint/demos/figures.xml
delete mode 100644 bin/reportlab/tools/pythonpoint/demos/htu.xml
delete mode 100644 bin/reportlab/tools/pythonpoint/demos/leftlogo.a85
delete mode 100644 bin/reportlab/tools/pythonpoint/demos/leftlogo.gif
delete mode 100644 bin/reportlab/tools/pythonpoint/demos/lj8100.jpg
delete mode 100644 bin/reportlab/tools/pythonpoint/demos/monterey.xml
delete mode 100644 bin/reportlab/tools/pythonpoint/demos/outline.gif
delete mode 100644 bin/reportlab/tools/pythonpoint/demos/pplogo.gif
delete mode 100644 bin/reportlab/tools/pythonpoint/demos/python.gif
delete mode 100644 bin/reportlab/tools/pythonpoint/demos/pythonpoint.xml
delete mode 100644 bin/reportlab/tools/pythonpoint/demos/slidebox.py
delete mode 100644 bin/reportlab/tools/pythonpoint/demos/spectrum.png
delete mode 100644 bin/reportlab/tools/pythonpoint/demos/vertpython.gif
delete mode 100644 bin/reportlab/tools/pythonpoint/pythonpoint.dtd
delete mode 100644 bin/reportlab/tools/pythonpoint/pythonpoint.py
delete mode 100644 bin/reportlab/tools/pythonpoint/stdparser.py
delete mode 100644 bin/reportlab/tools/pythonpoint/styles/__init__.py
delete mode 100644 bin/reportlab/tools/pythonpoint/styles/horrible.py
delete mode 100644 bin/reportlab/tools/pythonpoint/styles/htu.py
delete mode 100644 bin/reportlab/tools/pythonpoint/styles/modern.py
delete mode 100644 bin/reportlab/tools/pythonpoint/styles/projection.py
delete mode 100644 bin/reportlab/tools/pythonpoint/styles/standard.py
delete mode 100644 bin/reportlab/tools/utils/add_bleed.py
delete mode 100644 bin/reportlab/tools/utils/dumpttf.py
diff --git a/bin/addons/base/ir/workflow/pydot/LICENSE b/bin/addons/base/ir/workflow/pydot/LICENSE
deleted file mode 100755
index 3291fa10051..00000000000
--- a/bin/addons/base/ir/workflow/pydot/LICENSE
+++ /dev/null
@@ -1,16 +0,0 @@
-Copyright (c) 2004 Ero Carrera
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
-associated documentation files (the "Software"), to deal in the Software without restriction,
-including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
-and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
-subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all copies or substantial
-portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
-LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\ No newline at end of file
diff --git a/bin/addons/base/ir/workflow/pydot/PKG-INFO b/bin/addons/base/ir/workflow/pydot/PKG-INFO
deleted file mode 100755
index 098235a0e70..00000000000
--- a/bin/addons/base/ir/workflow/pydot/PKG-INFO
+++ /dev/null
@@ -1,33 +0,0 @@
-Metadata-Version: 1.0
-Name: pydot
-Version: 0.9.9
-Summary: Python interface to Graphiz's Dot
-Home-page: http://dkbza.org/pydot.html
-Author: Ero Carrera
-Author-email: ero@dkbza.org
-License: MIT
-Description: Graphviz's dot language Python interface.
-
- This module provides with a full interface to create handle modify
- and process graphs in Graphviz's dot language.
-
- References:
-
- pydot Homepage: http://www.dkbza.org/pydot.html
- Graphviz: http://www.research.att.com/sw/tools/graphviz/
- DOT Language: http://www.research.att.com/~erg/graphviz/info/lang.html
-
- Programmed and tested with Graphviz 1.12 and Python 2.3.3 on GNU/Linux
- by Ero Carrera (c) 2004 [ero@dkbza.org]
-
- Distributed under MIT license [http://opensource.org/licenses/mit-license.html].
-
-Platform: any
-Classifier: Development Status :: 5 - Production/Stable
-Classifier: Intended Audience :: Science/Research
-Classifier: License :: OSI Approved :: MIT License
-Classifier: Natural Language :: English
-Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: Python
-Classifier: Topic :: Scientific/Engineering :: Visualization
-Classifier: Topic :: Software Development :: Libraries :: Python Modules
diff --git a/bin/addons/base/ir/workflow/pydot/README b/bin/addons/base/ir/workflow/pydot/README
deleted file mode 100755
index d909fb9a225..00000000000
--- a/bin/addons/base/ir/workflow/pydot/README
+++ /dev/null
@@ -1,29 +0,0 @@
-pydot - Python interface to Graphviz's Dot language
-Ero Carrera (c) 2004
-ero@dkbza.org
-
-This code is distributed under the MIT license.
-
-Requirements:
--------------
-
-pyparsing: pydot requires the pyparsing module in order to be
- able to load DOT files.
-
-GraphViz: is needed in order to render the graphs into any of
- the plethora of output formats supported.
-
-Installation:
--------------
-
-Should suffice with doing:
-
- python setup.py install
-
-Needless to say, no installation is needed just to use the module. A mere:
-
- import pydot
-
-should do it, provided that the directory containing the modules is on Python
-module search path.
-
diff --git a/bin/addons/base/ir/workflow/pydot/__init__.py b/bin/addons/base/ir/workflow/pydot/__init__.py
deleted file mode 100644
index 6232f794cdd..00000000000
--- a/bin/addons/base/ir/workflow/pydot/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-from pydot import *
diff --git a/bin/addons/base/ir/workflow/pydot/dot_parser.py b/bin/addons/base/ir/workflow/pydot/dot_parser.py
deleted file mode 100644
index 67a763144c7..00000000000
--- a/bin/addons/base/ir/workflow/pydot/dot_parser.py
+++ /dev/null
@@ -1,352 +0,0 @@
-#!/bin/env python
-
-"""
-The dotparser parses graphviz files in dot and dot files and transforms them
-into a class representation defined by pydot.
-
-The module needs pyparsing (tested with version 1.2) and pydot (tested with 0.9.9)
-
-Author: Michael Krause
-"""
-
-import sys
-import glob
-import pydot
-
-from pyparsing import __version__ as pyparsing_version
-from pyparsing import Literal, CaselessLiteral, Word, \
- Upcase, OneOrMore, ZeroOrMore, Forward, NotAny, \
- delimitedList, oneOf, Group, Optional, Combine, \
- alphas, nums, restOfLine, cStyleComment, nums, \
- alphanums, printables, empty, quotedString, \
- ParseException, ParseResults, CharsNotIn, _noncomma
-
-
-class P_AttrList:
- def __init__(self, toks):
- self.attrs = {}
- i = 0
- while i < len(toks):
- attrname = toks[i]
- attrvalue = toks[i+1]
- self.attrs[attrname] = attrvalue
- i += 2
-
- def __repr__(self):
- return "%s(%r)" % (self.__class__.__name__, self.attrs)
-
-
-class DefaultStatement(P_AttrList):
- def __init__(self, default_type, attrs):
- self.default_type = default_type
- self.attrs = attrs
-
- def __repr__(self):
- return "%s(%s, %r)" % \
- (self.__class__.__name__, self.default_type, self.attrs)
-
-
-def push_top_graph_stmt(str, loc, toks):
- attrs = {}
- g = None
-
- for element in toks:
- if isinstance(element, ParseResults) or \
- isinstance(element, tuple) or \
- isinstance(element, list):
-
- element = element[0]
-
- if element == 'strict':
- attrs['strict'] = True
- elif element in ['graph', 'digraph']:
- attrs['graph_type'] = element
- elif type(element) == type(''):
- attrs['graph_name'] = element
- elif isinstance(element, pydot.Graph):
- g = pydot.Graph(**attrs)
- g.__dict__.update(element.__dict__)
- for e in g.get_edge_list():
- e.parent_graph = g
- for e in g.get_node_list():
- e.parent_graph = g
- for e in g.get_subgraph_list():
- e.set_graph_parent(g)
-
- elif isinstance(element, P_AttrList):
- attrs.update(element.attrs)
- else:
- raise ValueError, "Unknown element statement: %r " % element
-
- if g is not None:
- g.__dict__.update(attrs)
- return g
-
-
-def add_defaults(element, defaults):
- d = element.__dict__
- for key, value in defaults.items():
- if not d.get(key):
- d[key] = value
-
-
-def add_elements(g, toks, defaults_graph=None, defaults_node=None, defaults_edge=None):
-
- if defaults_graph is None:
- defaults_graph = {}
- if defaults_node is None:
- defaults_node = {}
- if defaults_edge is None:
- defaults_edge = {}
-
- for element in toks:
- if isinstance(element, pydot.Graph):
- add_defaults(element, defaults_graph)
- g.add_subgraph(element)
- elif isinstance(element, pydot.Node):
- add_defaults(element, defaults_node)
- g.add_node(element)
- elif isinstance(element, pydot.Edge):
- add_defaults(element, defaults_edge)
- g.add_edge(element)
- elif isinstance(element, ParseResults):
- for e in element:
- add_elements(g, [e], defaults_graph, defaults_node, defaults_edge)
- elif isinstance(element, DefaultStatement):
- if element.default_type == 'graph':
- default_graph_attrs = pydot.Node('graph')
- default_graph_attrs.__dict__.update(element.attrs)
- g.add_node(default_graph_attrs)
-# defaults_graph.update(element.attrs)
-# g.__dict__.update(element.attrs)
- elif element.default_type == 'node':
- default_node_attrs = pydot.Node('node')
- default_node_attrs.__dict__.update(element.attrs)
- g.add_node(default_node_attrs)
- #defaults_node.update(element.attrs)
- elif element.default_type == 'edge':
- default_edge_attrs = pydot.Node('edge')
- default_edge_attrs.__dict__.update(element.attrs)
- g.add_node(default_edge_attrs)
- #defaults_edge.update(element.attrs)
- else:
- raise ValueError, "Unknown DefaultStatement: %s " % element.default_type
- elif isinstance(element, P_AttrList):
- g.__dict__.update(element.attrs)
- else:
- raise ValueError, "Unknown element statement: %r " % element
-
-
-def push_graph_stmt(str, loc, toks):
- g = pydot.Subgraph()
- add_elements(g, toks)
- return g
-
-
-def push_subgraph_stmt(str, loc, toks):
- for e in toks:
- if len(e)==3:
- g = e[2]
- g.set_name(e[1])
-
- return g
-
-
-def push_default_stmt(str, loc, toks):
- # The pydot class instances should be marked as
- # default statements to be inherited by actual
- # graphs, nodes and edges.
- # print "push_default_stmt", toks
- default_type = toks[0][0]
- if len(toks) > 1:
- attrs = toks[1].attrs
- else:
- attrs = {}
-
- if default_type in ['graph', 'node', 'edge']:
- return DefaultStatement(default_type, attrs)
- else:
- raise ValueError, "Unknown default statement: %r " % toks
-
-
-def push_attr_list(str, loc, toks):
- p = P_AttrList(toks)
- return p
-
-
-def get_port(node):
-
- if len(node)>1:
- if isinstance(node[1], ParseResults):
- if len(node[1][0])==2:
- if node[1][0][0]==':':
- return node[1][0][1]
-
- return None
-
-
-def push_edge_stmt(str, loc, toks):
-
- tok_attrs = [a for a in toks if isinstance(a, P_AttrList)]
- attrs = {}
- for a in tok_attrs:
- attrs.update(a.attrs)
-
- n_prev = toks[0]
- e = []
- for n_next in tuple(toks)[2::2]:
- port = get_port(n_prev)
- if port is not None:
- n_prev_port = ':'+port
- else:
- n_prev_port = ''
-
- port = get_port(n_next)
- if port is not None:
- n_next_port = ':'+port
- else:
- n_next_port = ''
-
- e.append(pydot.Edge(n_prev[0]+n_prev_port, n_next[0]+n_next_port, **attrs))
- n_prev = n_next
- return e
-
-
-def push_node_stmt(str, loc, toks):
-
- if len(toks) == 2:
- attrs = toks[1].attrs
- else:
- attrs = {}
-
- node_name = toks[0]
- if isinstance(node_name, list) or isinstance(node_name, tuple):
- if len(node_name)>0:
- node_name = node_name[0]
-
- n = pydot.Node(node_name, **attrs)
- return n
-
-
-def strip_quotes( s, l, t ):
- return [ t[0].strip('"') ]
-
-
-graphparser = None
-def GRAPH_DEF():
- global graphparser
-
- if not graphparser:
- # punctuation
- colon = Literal(":")
- lbrace = Literal("{")
- rbrace = Literal("}")
- lbrack = Literal("[")
- rbrack = Literal("]")
- lparen = Literal("(")
- rparen = Literal(")")
- equals = Literal("=")
- comma = Literal(",")
- dot = Literal(".")
- slash = Literal("/")
- bslash = Literal("\\")
- star = Literal("*")
- semi = Literal(";")
- at = Literal("@")
- minus = Literal("-")
-
- # keywords
- strict_ = Literal("strict")
- graph_ = Literal("graph")
- digraph_ = Literal("digraph")
- subgraph_ = Literal("subgraph")
- node_ = Literal("node")
- edge_ = Literal("edge")
-
- identifier = Word(alphanums + "_" ).setName("identifier")
-
- double_quote = Literal('"')
- double_quoted_string = \
- Combine( double_quote + ZeroOrMore(CharsNotIn('"')) + double_quote )
-
- alphastring_ = OneOrMore(CharsNotIn(_noncomma))
-
- ID = (identifier | double_quoted_string.setParseAction(strip_quotes) |\
- alphastring_).setName("ID")
-
- html_text = Combine(Literal("<<") + OneOrMore(CharsNotIn(",]")))
-
- float_number = Combine(Optional(minus) + \
- OneOrMore(Word(nums + "."))).setName("float_number")
-
- righthand_id = (float_number | ID | html_text).setName("righthand_id")
-
- port_angle = (at + ID).setName("port_angle")
-
- port_location = (Group(colon + ID) | \
- Group(colon + lparen + ID + comma + ID + rparen)).setName("port_location")
-
- port = (Group(port_location + Optional(port_angle)) | \
- Group(port_angle + Optional(port_location))).setName("port")
-
- node_id = (ID + Optional(port))
- a_list = OneOrMore(ID + Optional(equals.suppress() + righthand_id) + \
- Optional(comma.suppress())).setName("a_list")
-
- attr_list = OneOrMore(lbrack.suppress() + Optional(a_list) + \
- rbrack.suppress()).setName("attr_list")
-
- attr_stmt = (Group(graph_ | node_ | edge_) + attr_list).setName("attr_stmt")
-
- edgeop = (Literal("--") | Literal("->")).setName("edgeop")
-
- stmt_list = Forward()
- graph_stmt = Group(lbrace.suppress() + Optional(stmt_list) + \
- rbrace.suppress()).setName("graph_stmt")
-
- subgraph = (Group(Optional(subgraph_ + Optional(ID)) + graph_stmt) | \
- Group(subgraph_ + ID)).setName("subgraph")
-
- edgeRHS = OneOrMore(edgeop + Group(node_id | subgraph))
-
- edge_stmt = Group(node_id | subgraph) + edgeRHS + Optional(attr_list)
-
- node_stmt = (node_id + Optional(attr_list) + semi.suppress()).setName("node_stmt")
-
- assignment = (ID + equals.suppress() + righthand_id).setName("assignment")
- stmt = (assignment | edge_stmt | attr_stmt | node_stmt | subgraph).setName("stmt")
- stmt_list << OneOrMore(stmt + Optional(semi.suppress()))
-
- graphparser = (Optional(strict_) + Group((graph_ | digraph_)) + \
- Optional(ID) + graph_stmt).setResultsName("graph")
-
- singleLineComment = "//" + restOfLine
- graphparser.ignore(singleLineComment)
- graphparser.ignore(cStyleComment)
-
- assignment.setParseAction(push_attr_list)
- a_list.setParseAction(push_attr_list)
- edge_stmt.setParseAction(push_edge_stmt)
- node_stmt.setParseAction(push_node_stmt)
- attr_stmt.setParseAction(push_default_stmt)
-
- subgraph.setParseAction(push_subgraph_stmt)
- graph_stmt.setParseAction(push_graph_stmt)
- graphparser.setParseAction(push_top_graph_stmt)
-
- return graphparser
-
-
-def parse_dot_data(data):
- try:
- graphparser = GRAPH_DEF()
- if pyparsing_version >= '1.2':
- graphparser.parseWithTabs()
- tokens = graphparser.parseString(data)
- graph = tokens.graph
- return graph
- except ParseException, err:
- print err.line
- print " "*(err.column-1) + "^"
- print err
- return None
diff --git a/bin/addons/base/ir/workflow/pydot/pydot.py b/bin/addons/base/ir/workflow/pydot/pydot.py
deleted file mode 100644
index e793a0a593b..00000000000
--- a/bin/addons/base/ir/workflow/pydot/pydot.py
+++ /dev/null
@@ -1,1075 +0,0 @@
-# -*- coding: Latin-1 -*-
-"""Graphviz's dot language Python interface.
-
-This module provides with a full interface to create handle modify
-and process graphs in Graphviz's dot language.
-
-References:
-
-pydot Homepage: http://www.dkbza.org/pydot.html
-Graphviz: http://www.research.att.com/sw/tools/graphviz/
-DOT Language: http://www.research.att.com/~erg/graphviz/info/lang.html
-
-Programmed and tested with Graphviz 1.12 and Python 2.3.3 on GNU/Linux
-by Ero Carrera (c) 2004 [ero@dkbza.org]
-
-Distributed under MIT license [http://opensource.org/licenses/mit-license.html].
-"""
-
-__author__ = 'Ero Carrera'
-__version__ = '0.9.9'
-__license__ = 'MIT'
-
-import os
-import tempfile
-import copy
-import dot_parser
-
-
-def graph_from_dot_data(data):
- """Load graph as defined by data in DOT format.
-
- The data is assumed to be in DOT format. It will
- be parsed and a Dot class will be returned,
- representing the graph.
- """
-
- graph = dot_parser.parse_dot_data(data)
- if graph is not None:
- dot = Dot()
- dot.__dict__.update(graph.__dict__)
- return dot
-
- return None
-
-def graph_from_dot_file(path):
- """Load graph as defined by a DOT file.
-
- The file is assumed to be in DOT format. It will
- be loaded, parsed and a Dot class will be returned,
- representing the graph.
- """
-
- fd = file(path, 'rb')
- data = fd.read()
- fd.close()
-
- return graph_from_dot_data(data)
-
-
-def graph_from_edges(edge_list, node_prefix='', directed=False):
- """Creates a basic graph out of an edge list.
-
- The edge list has to be a list of tuples representing
- the nodes connected by the edge.
- The values can be anything: bool, int, float, str.
-
- If the graph is undirected by default, it is only
- calculated from one of the symmetric halves of the matrix.
- """
- if directed:
- graph = Dot(graph_type='digraph')
- else:
- graph = Dot(graph_type='graph')
- for edge in edge_list:
- e = Edge(node_prefix+str(edge[0]), node_prefix+str(edge[1]))
- graph.add_edge(e)
- return graph
-
-
-def graph_from_adjacency_matrix(matrix, node_prefix='', directed=False):
- """Creates a basic graph out of an adjacency matrix.
-
- The matrix has to be a list of rows of values
- representing an adjacency matrix.
- The values can be anything: bool, int, float, as long
- as they can evaluate to True or False.
- """
- node_orig = 1
- if directed:
- graph = Dot(graph_type='digraph')
- else:
- graph = Dot(graph_type='graph')
- for row in matrix:
- if not directed:
- skip = matrix.index(row)
- r = row[skip:]
- else:
- skip = 0
- r = row
- node_dest = skip+1
- for e in r:
- if e:
- graph.add_edge( \
- Edge( node_prefix+str(node_orig), \
- node_prefix+str(node_dest)))
- node_dest += 1
- node_orig += 1
- return graph
-
-def graph_from_incidence_matrix(matrix, node_prefix='', directed=False):
- """Creates a basic graph out of an incidence matrix.
-
- The matrix has to be a list of rows of values
- representing an incidence matrix.
- The values can be anything: bool, int, float, as long
- as they can evaluate to True or False.
- """
- node_orig = 1
- if directed:
- graph = Dot(graph_type='digraph')
- else:
- graph = Dot(graph_type='graph')
- for row in matrix:
- nodes = []
- c = 1
- for node in row:
- if node:
- nodes.append(c*node)
- c += 1
- nodes.sort()
- if len(nodes) == 2:
- graph.add_edge( \
- Edge(node_prefix+str(abs(nodes[0])), \
- node_prefix+str(nodes[1]) ))
- if not directed:
- graph.set_simplify(True)
- return graph
-
-
-def find_graphviz():
- """Locate Graphviz's executables in the system.
-
- Attempts to locate graphviz's executables in a Unix system.
- It will look for 'dot', 'twopi' and 'neato' in all the directories
- specified in the PATH environment variable.
- It will return a dictionary containing the program names as keys
- and their paths as values.
- """
- progs = {'dot': '', 'twopi': '', 'neato': '', 'circo': '', 'fdp': ''}
- if not os.environ.has_key('PATH'):
- return None
- for path in os.environ['PATH'].split(os.pathsep):
- for prg in progs.keys():
- if os.path.exists(path+os.path.sep+prg):
- progs[prg] = path+os.path.sep+prg
- elif os.path.exists(path+os.path.sep+prg + '.exe'):
- progs[prg] = path+os.path.sep+prg + '.exe'
- return progs
-
-class Common:
- """Common information to several classes.
-
- Should not be directly used, several classes are derived from
- this one.
- """
- chars_ID = None
- parent_graph = None
-
- def char_range(self, a,b):
- """Generate a list containing a range of characters.
-
- Returns a list of characters starting from 'a' up to 'b'
- both inclusive.
- """
- return map(chr, range(ord(a), ord(b)+1))
-
- def is_ID(self, s):
- """Checks whether a string is an dot language ID.
-
- It will check whether the string is solely composed
- by the characters allowed in an ID or not.
- """
- if not self.chars_ID:
- self.chars_ID = self.char_range('a','z')+self.char_range('A','Z')+ \
- self.char_range('0','9')+['_']
- for c in s:
- if c not in self.chars_ID:
- return False
- return True
-
-class Error(Exception):
- """General error handling class.
- """
- def __init__(self, value):
- self.value = value
- def __str__(self):
- return self.value
-
-
-class Node(object, Common):
- """A graph node.
-
- This class represents a graph's node with all its attributes.
-
- node(name, attribute=value, ...)
-
- name: node's name
-
- All the attributes defined in the Graphviz dot language should
- be supported.
- """
- attributes = ['showboxes', 'URL', 'fontcolor', 'fontsize', 'label', 'fontname', \
- 'comment', 'root', 'toplabel', 'vertices', 'width', 'z', 'bottomlabel', \
- 'distortion', 'fixedsize', 'group', 'height', 'orientation', 'pin', \
- 'rects', 'regular', 'shape', 'shapefile', 'sides', 'skew', 'pos', \
- 'layer', 'tooltip', 'style', 'target', 'color', 'peripheries',
- 'fillcolor']
-
- def __init__(self, name, **attrs):
-
- if isinstance(name, str) and not name.startswith('"'):
- idx = name.find(':')
- if idx>0:
- name = name[:idx]
-
- self.name = str(name)
- for attr in self.attributes:
- # Set all the attributes to None.
- self.__setattr__(attr, None)
- # Generate all the Setter methods.
- self.__setattr__('set_'+attr, lambda x, a=attr : self.__setattr__(a, x))
- # Generate all the Getter methods.
- self.__setattr__('get_'+attr, lambda a=attr : self.__getattribute__(a))
- for attr, val in attrs.items():
- self.__setattr__(attr, val)
-
- def set_name(self, node_name):
- """Set the node's name."""
-
- self.name = str(node_name)
-
- def get_name(self):
- """Get the node's name."""
-
- return self.name
-
- def set(self, name, value):
- """Set an attribute value by name.
-
- Given an attribute 'name' it will set its value to 'value'.
- There's always the possibility of using the methods:
- set_'name'(value)
- which are defined for all the existing attributes.
- """
- if name in self.attributes:
- self.__dict__[name] = value
- return True
- # Attribute is not known
- return False
-
- def to_string(self):
- """Returns a string representation of the node in dot language.
- """
-
- if not isinstance(self.name, str):
- self.name = str(self.name)
-
- # RMF: special case defaults for node, edge and graph properties.
- if self.name in ['node', 'edge', 'graph']:
- node = self.name
- else:
- node = '"'+self.name+'"'
-
- node_attr = None
- all_attrs = [a for a in self.attributes]
- all_attrs += [a for a in Graph.attributes if a not in all_attrs]
- all_attrs += [a for a in Edge.attributes if a not in all_attrs]
- for attr in all_attrs:
- if self.__dict__.has_key(attr) \
- and self.__getattribute__(attr) is not None:
- if not node_attr:
- node_attr = ''
- else:
- node_attr += ', '
- node_attr += attr+'='
- val = self.__dict__[attr]
-
- if val.startswith('<') and val.endswith('>'):
- node_attr += val
- elif (isinstance(val, str) or isinstance(val, unicode)) and not self.is_ID(val):
- node_attr += '"'+val+'"'
- else:
- node_attr += str(val)
-
- if node_attr:
- node += ' ['+node_attr+']'
- node += ';'
-
- return node
-
-
-class Edge(object, Common):
- """A graph edge.
-
- This class represents a graph's edge with all its attributes.
-
- edge(src, dst, attribute=value, ...)
-
- src: source node's name
- dst: destination node's name
-
- All the attributes defined in the Graphviz dot language should
- be supported.
-
- Attributes can be set through the dynamically generated methods:
-
- set_[attribute name], i.e. set_label, set_fontname
-
- or using the instance's attributes:
-
- Edge.[attribute name], i.e. edge_instance.label, edge_instance.fontname
- """
- attributes = ['style', 'target', 'pos', 'layer', 'tooltip', 'color', 'showboxes',\
- 'URL', 'fontcolor', 'fontsize', 'label', 'fontname', 'comment', 'lp', \
- 'arrowhead', 'arrowsize', 'arrowtail', 'constraint', 'decorate', 'dir', \
- 'headURL', 'headclip', 'headhref', 'headlabel', 'headport', \
- 'headtarget', 'headtooltip', 'href', 'labelangle', 'labeldistance', \
- 'labelfloat', 'labelfontcolor', 'labelfontname', 'labelfontsize', 'len',\
- 'lhead', 'ltail', 'minlen', 'samehead', 'sametail', 'weight', 'tailURL',\
- 'tailclip', 'tailhref', 'taillabel', 'tailport', 'tailtarget', \
- 'tailtooltip']
-
- def __init__(self, src, dst, **attrs):
- self.src = src
- self.dst = dst
- for attr in self.attributes:
- # Set all the attributes to None.
- self.__setattr__(attr, None)
- # Generate all the Setter methods.
- self.__setattr__('set_'+attr, lambda x, a=attr : self.__setattr__(a, x))
- # Generate all the Getter methods.
- self.__setattr__('get_'+attr, lambda a=attr : self.__getattribute__(a))
- for attr, val in attrs.items():
- self.__setattr__(attr, val)
-
- def get_source(self):
- """Get the edges source node name."""
-
- return self.src
-
- def get_destination(self):
- """Get the edge's destination node name."""
-
- return self.dst
-
- def __eq__(self, edge):
- """Compare two edges.
-
- If the parent graph is directed, arcs linking
- node A to B are considered equal and A->B != B->A
-
- If the parent graph is undirected, any edge
- connecting two nodes is equal to any other
- edge connecting the same nodes, A->B == B->A
- """
-
- if not isinstance(edge, Edge):
- raise Error, 'Can\'t compare and edge to a non-edge object.'
- if self.parent_graph.graph_type=='graph':
- # If the graph is undirected, the edge has neither
- # source nor destination.
- if (self.src==edge.src and self.dst==edge.dst) or \
- (self.src==edge.dst and self.dst==edge.src):
- return True
- else:
- if self.src==edge.src and self.dst==edge.dst:
- return True
- return False
-
-
- def set(self, name, value):
- """Set an attribute value by name.
-
- Given an attribute 'name' it will set its value to 'value'.
- There's always the possibility of using the methods:
- set_'name'(value)
- which are defined for all the existing attributes.
- """
- if name in self.attributes:
- self.__dict__[name] = value
- return True
- # Attribute is not known
- return False
-
-
- def parse_node_ref(self, node_str):
-
- if not isinstance(node_str, str):
- node_str = str(node_str)
-
- if node_str[0]=='"' and node_str[-1]=='"' and node_str[0].count('"')%2!=0:
- return node_str
-
- node_port_idx = node_str.rfind(':')
-
- if node_port_idx>0 and node_str[0]=='"' and node_str[node_port_idx-1]=='"':
- return node_str
-
- node_str = node_str.replace('"', '')
-
- if node_port_idx>0:
- a = node_str[:node_port_idx]
- b = node_str[node_port_idx+1:]
- if self.is_ID(a):
- node = a
- else:
- node = '"'+a+'"'
- if self.is_ID(b):
- node += ':'+b
- else:
- node+=':"'+b+'"'
- return node
-
- return '"'+node_str+'"'
-
-
- def to_string(self):
- """Returns a string representation of the edge in dot language.
- """
-
- src = self.parse_node_ref(self.src)
- dst = self.parse_node_ref(self.dst)
-
- edge = src
- if self.parent_graph and \
- self.parent_graph.graph_type and \
- self.parent_graph.graph_type=='digraph':
- edge+=' -> '
- else:
- edge+=' -- '
- edge+=dst
-
- edge_attr = None
- for attr in self.attributes:
- if self.__dict__.has_key(attr) \
- and self.__getattribute__(attr) is not None:
- if not edge_attr:
- edge_attr = ''
- else:
- edge_attr+=', '
- edge_attr+=attr+'='
- val = self.__dict__[attr]
- if (isinstance(val, str) or isinstance(val, unicode)) and not self.is_ID(val):
- edge_attr+='"'+val+'"'
- else:
- edge_attr+=str(val)
-
- if edge_attr:
- edge+=' ['+edge_attr+']'
- edge+=';'
-
- return edge
-
-class Graph(object, Common):
-
- """Class representing a graph in Graphviz's dot language.
-
- This class implements the methods to work on a representation
- of a graph in Graphviz's dot language.
-
- graph(graph_name='G', type='digraph', strict=False, suppress_disconnected=False, attribute=value, ...)
-
- graph_name:
- the graph's name
- type:
- can be 'graph' or 'digraph'
- suppress_disconnected:
- defaults to False, which will remove from the
- graph any disconnected nodes.
- simplify:
- if True it will avoid displaying equal edges, i.e.
- only one edge between two nodes. removing the
- duplicated ones.
-
- All the attributes defined in the Graphviz dot language should
- be supported.
-
- Attributes can be set through the dynamically generated methods:
-
- set_[attribute name], i.e. set_size, set_fontname
-
- or using the instance's attributes:
-
- Graph.[attribute name], i.e. graph_instance.label, graph_instance.fontname
- """
-
- attributes = ['Damping', 'bb', 'center', 'clusterrank', 'compound', 'concentrate',\
- 'defaultdist', 'dim', 'fontpath', 'epsilon', 'layers', 'layersep', \
- 'margin', 'maxiter', 'mclimit', 'mindist', 'pack', 'packmode', 'model', \
- 'page', 'pagedir', 'nodesep', 'normalize', 'nslimit1', 'ordering', \
- 'orientation', 'outputorder', 'overlap', 'remincross', 'resolution', \
- 'rankdir', 'ranksep', 'ratio', 'rotate', 'samplepoints', 'searchsize', \
- 'sep', 'size', 'splines', 'start', 'stylesheet', 'truecolor', \
- 'viewport', 'voro_margin', 'quantum', 'bgcolor', 'labeljust', \
- 'labelloc', 'root', 'showboxes', 'URL', 'fontcolor', 'fontsize', \
- 'label' ,'fontname', 'comment', 'lp', 'target', 'color', 'style', \
- 'concentrators']
-
- def __init__(self, graph_name='G', graph_type='digraph', strict=False, \
- suppress_disconnected=False, simplify=False, **attrs):
-
- if graph_type not in ['graph', 'digraph']:
- raise Error, 'Invalid type. Accepted graph types are: graph, digraph, subgraph'
- self.graph_type = graph_type
- self.graph_name = graph_name
- self.strict = strict
- self.suppress_disconnected = suppress_disconnected
- self.simplify = simplify
- self.node_list = []
- self.edge_list = []
- self.edge_src_list = []
- self.edge_dst_list = []
- self.subgraph_list = []
- self.parent_graph = self
- for attr in self.attributes:
- # Set all the attributes to None.
- self.__setattr__(attr, None)
- # Generate all the Setter methods.
- self.__setattr__('set_'+attr, lambda x, a=attr : self.__setattr__(a, x))
- # Generate all the Getter methods.
- self.__setattr__('get_'+attr, lambda a=attr : self.__getattribute__(a))
- for attr, val in attrs.items():
- self.__setattr__(attr, val)
-
- def set_simplify(self, simplify):
- """Set whether to simplify or not.
-
- If True it will avoid displaying equal edges, i.e.
- only one edge between two nodes. removing the
- duplicated ones.
- """
-
- self.simplify = simplify
-
- def get_simplify(self):
- """Get whether to simplify or not.
-
- Refer to set_simplify for more information.
- """
-
- return self.simplify
-
-
- def set_type(self, graph_type):
- """Set the graph's type, 'graph' or 'digraph'."""
- self.graph_type = graph_type
-
- def get_type(self):
- """Get the graph's type, 'graph' or 'digraph'."""
- return self.graph_type
-
- def set_name(self, graph_name):
- """Set the graph's name."""
-
- self.graph_name = graph_name
-
- def get_name(self):
- """Get the graph's name."""
-
- return self.graph_name
-
- def set_strict(self, val):
- """Set graph to 'strict' mode.
-
- This option is only valid for top level graphs.
- """
-
- self.strict = val
-
- def get_strict(self, val):
- """Get graph's 'strict' mode (True, False).
-
- This option is only valid for top level graphs.
- """
-
- return self.strict
-
- def set_suppress_disconnected(self, val):
- """Suppress disconnected nodes in the output graph.
-
- This option will skip nodes in the graph with no incoming or outgoing
- edges. This option works also for subgraphs and has effect only in the
- current graph/subgraph.
- """
-
- self.suppress_disconnected = val
-
- def get_suppress_disconnected(self, val):
- """Get if suppress disconnected is set.
-
- Refer to set_suppress_disconnected for more information.
- """
-
- self.suppress_disconnected = val
-
- def set(self, name, value):
- """Set an attribute value by name.
-
- Given an attribute 'name' it will set its value to 'value'.
- There's always the possibility of using the methods:
-
- set_'name'(value)
-
- which are defined for all the existing attributes.
- """
- if name in self.attributes:
- self.__dict__[name] = value
- return True
- # Attribute is not known
- return False
-
- def get(self, name):
- """Get an attribute value by name.
-
- Given an attribute 'name' it will get its value.
- There's always the possibility of using the methods:
-
- get_'name'()
-
- which are defined for all the existing attributes.
- """
- return self.__dict__[name]
-
- def add_node(self, graph_node):
- """Adds a node object to the graph.
-
- It takes a node object as its only argument and returns
- None.
- """
-
- if not isinstance(graph_node, Node):
- raise Error, 'add_node received a non node class object'
-
- if self.get_node(graph_node.get_name()) is None:
- self.node_list.append(graph_node)
- graph_node.parent_graph = self.parent_graph
-
- def get_node(self, name):
- """Retrieved a node from the graph.
-
- Given a node's name the corresponding Node
- instance will be returned.
-
- If multiple nodes exist with that name, a list of
- Node instances is returned.
- If only one node exists, the instance is returned.
- None is returned otherwise.
- """
-
- match = [node for node in self.node_list if node.get_name() == str(name)]
-
- l = len(match)
- if l==1:
- return match[0]
- elif l>1:
- return match
- else:
- return None
-
- def get_node_list(self):
- """Get the list of Node instances.
-
- This method returns the list of Node instances
- composing the graph.
- """
-
- return self.node_list
-
- def add_edge(self, graph_edge):
- """Adds an edge object to the graph.
-
- It takes a edge object as its only argument and returns
- None.
- """
-
- if not isinstance(graph_edge, Edge):
- raise Error, 'add_edge received a non edge class object'
-
- self.edge_list.append(graph_edge)
-
- src = self.get_node(graph_edge.get_source())
- if src is None:
- self.add_node(Node(graph_edge.get_source()))
-
- dst = self.get_node(graph_edge.get_destination())
- if dst is None:
- self.add_node(Node(graph_edge.get_destination()))
-
- graph_edge.parent_graph = self.parent_graph
-
- if graph_edge.src not in self.edge_src_list:
- self.edge_src_list.append(graph_edge.src)
-
- if graph_edge.dst not in self.edge_dst_list:
- self.edge_dst_list.append(graph_edge.dst)
-
- def get_edge(self, src, dst):
- """Retrieved an edge from the graph.
-
- Given an edge's source and destination the corresponding
- Edge instance will be returned.
-
- If multiple edges exist with that source and destination,
- a list of Edge instances is returned.
- If only one edge exists, the instance is returned.
- None is returned otherwise.
- """
-
- match = [edge for edge in self.edge_list if edge.src == src and edge.dst == dst]
-
- l = len(match)
- if l==1:
- return match[0]
- elif l>1:
- return match
- else:
- return None
-
- def get_edge_list(self):
- """Get the list of Edge instances.
-
- This method returns the list of Edge instances
- composing the graph.
- """
-
- return self.edge_list
-
- def add_subgraph(self, sgraph):
- """Adds an edge object to the graph.
-
- It takes a subgraph object as its only argument and returns
- None.
- """
- if not isinstance(sgraph, Subgraph) and not isinstance(sgraph, Cluster):
- raise Error, 'add_subgraph received a non subgraph class object'
-
- self.subgraph_list.append(sgraph)
-
- sgraph.set_graph_parent(self.parent_graph)
- return None
-
- def get_subgraph(self, name):
- """Retrieved a subgraph from the graph.
-
- Given a subgraph's name the corresponding
- Subgraph instance will be returned.
-
- If multiple subgraphs exist with the same name, a list of
- Subgraph instances is returned.
- If only one Subgraph exists, the instance is returned.
- None is returned otherwise.
- """
-
- match = [sgraph for sgraph in self.subgraph_list if sgraph.graph_name == name]
-
- l = len(match)
- if l==1:
- return match[0]
- elif l>1:
- return match
- else:
- return None
-
- def get_subgraph_list(self):
- """Get the list of Subgraph instances.
-
- This method returns the list of Subgraph instances
- in the graph.
- """
-
- return self.subgraph_list
-
- def set_graph_parent(self, parent):
- """Sets a graph and its elements to point the the parent.
-
- Any subgraph added to a parent graph receives a reference
- to the parent to access some common data.
- """
- self.parent_graph = parent
-
- for elm in self.edge_list:
- elm.parent_graph = parent
-
- for elm in self.node_list:
- elm.parent_graph = parent
-
- for elm in self.subgraph_list:
- elm.parent_graph = parent
- elm.set_graph_parent(parent)
-
- def to_string(self, indent=''):
- """Returns a string representation of the graph in dot language.
-
- It will return the graph and all its subelements in string from.
- """
- graph = indent+''
- if self.__dict__.has_key('strict'):
- if self==self.parent_graph and self.strict:
- graph+='strict '
-
- graph+=self.graph_type+' '+self.graph_name+' {\n'
-
- for attr in self.attributes:
- if self.__dict__.has_key(attr) \
- and self.__getattribute__(attr) is not None:
- graph += indent+'\t'+attr+'='
- val = self.__dict__[attr]
- if isinstance(val, str) and not self.is_ID(val):
- graph += '"'+val+'"'
- else:
- graph += str(val)
- graph+=';\n'
-
- # RMF: for graphviz to handle edge/node defaults correctly,
- # it seems they must appear before the rest of the nodes/edges
- # so if they exist, dump them out first.
- for elm in self.node_list:
- if elm.name in ['node', 'edge', 'graph']:
- graph += indent+'\t'+elm.to_string()+'\n'
-
- for elm in self.subgraph_list:
- graph += elm.to_string(indent+'\t')+'\n'
-
- for elm in self.node_list:
- # RMF: don't repeat the node/edge defaults
- if elm.name in ['node', 'edge', 'graph']:
- continue
- if self.suppress_disconnected:
- if elm.name not in self.edge_src_list+self.edge_dst_list:
- continue
- graph+=indent+'\t'+elm.to_string()+'\n'
-
- edges_done = []
- for elm in self.edge_list:
- if self.simplify and elm in edges_done:
- continue
- graph+=indent+'\t'+elm.to_string()+'\n'
- edges_done.append(elm)
-
- graph+=indent+'}\n'
-
- return graph
-
-
-class Subgraph(Graph):
-
- """Class representing a subgraph in Graphviz's dot language.
-
- This class implements the methods to work on a representation
- of a subgraph in Graphviz's dot language.
-
- subgraph(graph_name='subG', suppress_disconnected=False, attribute=value, ...)
-
- graph_name:
- the subgraph's name
- suppress_disconnected:
- defaults to false, which will remove from the
- subgraph any disconnected nodes.
- All the attributes defined in the Graphviz dot language should
- be supported.
-
- Attributes can be set through the dynamically generated methods:
-
- set_[attribute name], i.e. set_size, set_fontname
-
- or using the instance's attributes:
-
- Subgraph.[attribute name], i.e.
- subgraph_instance.label, subgraph_instance.fontname
- """
-
- attributes = Graph.attributes+['rank']
-
- # RMF: subgraph should have all the attributes of graph so it can be passed
- # as a graph to all methods
- def __init__(self, graph_name='subG', suppress_disconnected=False, \
- simplify=False, **attrs):
-
- self.graph_type = 'subgraph'
- self.graph_name = graph_name
- self.suppress_disconnected = suppress_disconnected
- self.simplify = simplify
- self.node_list = []
- self.edge_list = []
- self.edge_src_list = []
- self.edge_dst_list = []
- self.subgraph_list = []
- for attr in self.attributes:
- # Set all the attributes to None.
- self.__setattr__(attr, None)
- # Generate all the Setter methods.
- self.__setattr__('set_'+attr, lambda x, a=attr : self.__setattr__(a, x))
- # Generate all the Getter methods.
- self.__setattr__('get_'+attr, lambda a=attr : self.__getattribute__(a))
- for attr, val in attrs.items():
- self.__setattr__(attr, val)
-
-
-class Cluster(Graph):
-
- """Class representing a cluster in Graphviz's dot language.
-
- This class implements the methods to work on a representation
- of a cluster in Graphviz's dot language.
-
- cluster(graph_name='subG', suppress_disconnected=False, attribute=value, ...)
-
- graph_name:
- the cluster's name (the string 'cluster' will be always prepended)
- suppress_disconnected:
- defaults to false, which will remove from the
- cluster any disconnected nodes.
- All the attributes defined in the Graphviz dot language should
- be supported.
-
- Attributes can be set through the dynamically generated methods:
-
- set_[attribute name], i.e. set_color, set_fontname
-
- or using the instance's attributes:
-
- Cluster.[attribute name], i.e.
- cluster_instance.color, cluster_instance.fontname
- """
-
- attributes = ['pencolor', 'bgcolor', 'labeljust', 'labelloc', 'URL', 'fontcolor', \
- 'fontsize', 'label', 'fontname', 'lp', 'style', 'target', 'color', \
- 'peripheries', 'fillcolor']
-
- def __init__(self, graph_name='subG', suppress_disconnected=False, \
- simplify=False, **attrs):
-
- #if type not in ['subgraph']:
- # raise Error, 'Invalid type. Accepted graph types are: subgraph'
- self.graph_type = 'subgraph'
- self.graph_name = 'cluster_'+graph_name
- self.suppress_disconnected = suppress_disconnected
- self.simplify = simplify
- self.node_list = []
- self.edge_list = []
- self.edge_src_list = []
- self.edge_dst_list = []
- self.subgraph_list = []
- for attr in self.attributes:
- # Set all the attributes to None.
- self.__setattr__(attr, None)
- # Generate all the Setter methods.
- self.__setattr__('set_'+attr, lambda x, a=attr : self.__setattr__(a, x))
- # Generate all the Getter methods.
- self.__setattr__('get_'+attr, lambda a=attr : self.__getattribute__(a))
- for attr, val in attrs.items():
- self.__setattr__(attr, val)
-
-
-class Dot(Graph):
- """A container for handling a dot language file.
-
- This class implements methods to write and process
- a dot language file. It is a derived class of
- the base class 'Graph'.
- """
-
- progs = None
-
- formats = ['ps', 'ps2', 'hpgl', 'pcl', 'mif', 'pic', 'gd', 'gd2', 'gif', 'jpg', \
- 'jpeg', 'png', 'wbmp', 'ismap', 'imap', 'cmap', 'vrml', 'vtx', 'mp', \
- 'fig', 'svg', 'svgz', 'dia', 'dot', 'canon', 'plain', 'plain-ext', 'xdot']
-
- def __init__(self, prog='dot', **args):
- Graph.__init__(self, **args)
-
- self.prog = prog
-
- # Automatically creates all the methods enabling the creation
- # of output in any of the supported formats.
- for frmt in self.formats:
- self.__setattr__('create_'+frmt, lambda f=frmt, prog=self.prog : self.create(format=f, prog=prog))
- f = self.__dict__['create_'+frmt]
- f.__doc__ = '''Refer to docstring from 'create' for more information.'''
-
- for frmt in self.formats+['raw']:
- self.__setattr__('write_'+frmt, lambda path, f=frmt, prog=self.prog : self.write(path, format=f, prog=prog))
- f = self.__dict__['write_'+frmt]
- f.__doc__ = '''Refer to docstring from 'write' for more information.'''
-
- def set_prog(self, prog):
- """Sets the default program.
-
- Sets the default program in charge of processing
- the dot file into a graph.
- """
- self.prog = prog
-
- def write(self, path, prog=None, format='raw'):
- """Writes a graph to a file.
-
- Given a filename 'path' it will open/create and truncate
- such file and write on it a representation of the graph
- defined by the dot object and in the format specified by
- 'format'.
- The format 'raw' is used to dump the string representation
- of the Dot object, without further processing.
- The output can be processed by any of graphviz tools, defined
- in 'prog', which defaults to 'dot'
- Returns True or False according to the success of the write
- operation.
-
- There's also the preferred possibility of using:
-
- write_'format'(path, prog='program')
-
- which are automatically defined for all the supported formats.
- [write_ps(), write_gif(), write_dia(), ...]
- """
-
- if prog is None:
- prog = self.prog
-
- dot_fd = file(path, "w+b")
- if format == 'raw':
- dot_fd.write(self.to_string())
- else:
- dot_fd.write(self.create(prog, format))
- dot_fd.close()
-
- return True
-
- def create(self, prog=None, format='ps'):
- """Creates and returns a Postscript representation of the graph.
-
- create will write the graph to a temporary dot file and process
- it with the program given by 'prog' (which defaults to 'twopi'),
- reading the Postscript output and returning it as a string is the
- operation is successful.
- On failure None is returned.
-
- There's also the preferred possibility of using:
-
- create_'format'(prog='program')
-
- which are automatically defined for all the supported formats.
- [create_ps(), create_gif(), create_dia(), ...]
- """
- if prog is None:
- prog = self.prog
-
- if self.progs is None:
- self.progs = find_graphviz()
- if self.progs is None:
- return None
- if not self.progs.has_key(prog):
- # Program not found ?!?!
- return None
-
- tmp_fd, tmp_name = tempfile.mkstemp()
- os.close(tmp_fd)
- self.write(tmp_name)
- stdin, stdout, stderr = os.popen3(self.progs[prog]+' -T'+format+' '+tmp_name, 'b')
- stdin.close()
- stderr.close()
- data = stdout.read()
- stdout.close()
- os.unlink(tmp_name)
- return data
-
diff --git a/bin/addons/base/ir/workflow/pydot/setup.py b/bin/addons/base/ir/workflow/pydot/setup.py
deleted file mode 100644
index 5209f242d81..00000000000
--- a/bin/addons/base/ir/workflow/pydot/setup.py
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/usr/bin/env python
-
-from distutils.core import setup
-import pydot
-
-setup( name = 'pydot',
- version = pydot.__version__,
- description = 'Python interface to Graphiz\'s Dot',
- author = 'Ero Carrera',
- author_email = 'ero@dkbza.org',
- url = 'http://dkbza.org/pydot.html',
- license = 'MIT',
- platforms = ["any"],
- classifiers = ['Development Status :: 5 - Production/Stable', \
- 'Intended Audience :: Science/Research', \
- 'License :: OSI Approved :: MIT License',\
- 'Natural Language :: English', \
- 'Operating System :: OS Independent', \
- 'Programming Language :: Python', \
- 'Topic :: Scientific/Engineering :: Visualization',\
- 'Topic :: Software Development :: Libraries :: Python Modules'],
- long_description = "\n".join(pydot.__doc__.split('\n')),
- py_modules = ['pydot', 'dot_parser'])
diff --git a/bin/pychart/__init__.py b/bin/pychart/__init__.py
deleted file mode 100644
index 37b0fccf5dc..00000000000
--- a/bin/pychart/__init__.py
+++ /dev/null
@@ -1,21 +0,0 @@
-#
-# Copyright (C) 2000-2005 by Yasushi Saito (yasushi.saito@gmail.com)
-#
-# Jockey is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2, or (at your option) any
-# later version.
-#
-# Jockey is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# for more details.
-#
-__all__ = [ "axis", "area", "basecanvas", "canvas",
- "line_plot", "pie_plot", "rose_plot", "tick_mark",
- "bar_plot", "chart_data", "arrow", "text_box", "color", "font",
- "fill_style", "error_bar", "range_plot", "chart_object",
- "line_style", "legend", "pychart_util", "theme", "scaling",
- "zap", "coord", "linear_coord", "log_coord",
- "category_coord", "afm", "interval_bar_plot" ]
-
diff --git a/bin/pychart/afm/AvantGarde_Book.py b/bin/pychart/afm/AvantGarde_Book.py
deleted file mode 100644
index 62afd5ae7a2..00000000000
--- a/bin/pychart/afm/AvantGarde_Book.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# AFM font AvantGarde-Book (path: /usr/share/fonts/afms/adobe/pagk8a.afm).
-# Derived from Ghostscript distribution.
-# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
-import dir
-dir.afm["AvantGarde-Book"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 277, 295, 309, 554, 554, 775, 757, 351, 369, 369, 425, 606, 277, 332, 277, 437, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 277, 277, 606, 606, 606, 591, 867, 740, 574, 813, 744, 536, 485, 872, 683, 226, 482, 591, 462, 919, 740, 869, 592, 871, 607, 498, 426, 655, 702, 960, 609, 592, 480, 351, 605, 351, 606, 500, 351, 683, 682, 647, 685, 650, 314, 673, 610, 200, 203, 502, 200, 938, 610, 655, 682, 682, 301, 388, 339, 608, 554, 831, 480, 536, 425, 351, 672, 351, 606, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 295, 554, 554, 166, 554, 554, 615, 554, 198, 502, 425, 251, 251, 487, 485, 500, 500, 553, 553, 277, 500, 564, 606, 354, 502, 484, 425, 1000, 1174, 500, 591, 500, 378, 375, 502, 439, 485, 453, 222, 369, 500, 332, 324, 500, 552, 302, 502, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 992, 500, 369, 500, 500, 500, 500, 517, 868, 1194, 369, 500, 500, 500, 500, 500, 1157, 500, 500, 500, 200, 500, 500, 300, 653, 1137, 554, )
diff --git a/bin/pychart/afm/AvantGarde_BookOblique.py b/bin/pychart/afm/AvantGarde_BookOblique.py
deleted file mode 100644
index 11c29aa416a..00000000000
--- a/bin/pychart/afm/AvantGarde_BookOblique.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# AFM font AvantGarde-BookOblique (path: /usr/share/fonts/afms/adobe/pagko8a.afm).
-# Derived from Ghostscript distribution.
-# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
-import dir
-dir.afm["AvantGarde-BookOblique"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 277, 295, 309, 554, 554, 775, 757, 351, 369, 369, 425, 606, 277, 332, 277, 437, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 277, 277, 606, 606, 606, 591, 867, 740, 574, 813, 744, 536, 485, 872, 683, 226, 482, 591, 462, 919, 740, 869, 592, 871, 607, 498, 426, 655, 702, 960, 609, 592, 480, 351, 605, 351, 606, 500, 351, 683, 682, 647, 685, 650, 314, 673, 610, 200, 203, 502, 200, 938, 610, 655, 682, 682, 301, 388, 339, 608, 554, 831, 480, 536, 425, 351, 672, 351, 606, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 295, 554, 554, 166, 554, 554, 615, 554, 198, 502, 425, 251, 251, 487, 485, 500, 500, 553, 553, 277, 500, 564, 606, 354, 502, 484, 425, 1000, 1174, 500, 591, 500, 378, 375, 502, 439, 485, 453, 222, 369, 500, 332, 324, 500, 552, 302, 502, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 992, 500, 369, 500, 500, 500, 500, 517, 868, 1194, 369, 500, 500, 500, 500, 500, 1157, 500, 500, 500, 200, 500, 500, 300, 653, 1137, 554, )
diff --git a/bin/pychart/afm/AvantGarde_Demi.py b/bin/pychart/afm/AvantGarde_Demi.py
deleted file mode 100644
index ee69d2fbd74..00000000000
--- a/bin/pychart/afm/AvantGarde_Demi.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# AFM font AvantGarde-Demi (path: /usr/share/fonts/afms/adobe/pagd8a.afm).
-# Derived from Ghostscript distribution.
-# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
-import dir
-dir.afm["AvantGarde-Demi"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 280, 280, 360, 560, 560, 860, 680, 280, 380, 380, 440, 600, 280, 420, 280, 460, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 280, 280, 600, 600, 600, 560, 740, 740, 580, 780, 700, 520, 480, 840, 680, 280, 480, 620, 440, 900, 740, 840, 560, 840, 580, 520, 420, 640, 700, 900, 680, 620, 500, 320, 640, 320, 600, 500, 280, 660, 660, 640, 660, 640, 280, 660, 600, 240, 260, 580, 240, 940, 600, 640, 660, 660, 320, 440, 300, 600, 560, 800, 560, 580, 460, 340, 600, 340, 600, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 280, 560, 560, 160, 560, 560, 560, 560, 220, 480, 460, 240, 240, 520, 520, 500, 500, 560, 560, 280, 500, 600, 600, 280, 480, 480, 460, 1000, 1280, 500, 560, 500, 420, 420, 540, 480, 420, 480, 280, 500, 500, 360, 340, 500, 700, 340, 540, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 900, 500, 360, 500, 500, 500, 500, 480, 840, 1060, 360, 500, 500, 500, 500, 500, 1080, 500, 500, 500, 240, 500, 500, 320, 660, 1080, 600, )
diff --git a/bin/pychart/afm/AvantGarde_DemiOblique.py b/bin/pychart/afm/AvantGarde_DemiOblique.py
deleted file mode 100644
index 09a08c53447..00000000000
--- a/bin/pychart/afm/AvantGarde_DemiOblique.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# AFM font AvantGarde-DemiOblique (path: /usr/share/fonts/afms/adobe/pagdo8a.afm).
-# Derived from Ghostscript distribution.
-# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
-import dir
-dir.afm["AvantGarde-DemiOblique"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 280, 280, 360, 560, 560, 860, 680, 280, 380, 380, 440, 600, 280, 420, 280, 460, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 280, 280, 600, 600, 600, 560, 740, 740, 580, 780, 700, 520, 480, 840, 680, 280, 480, 620, 440, 900, 740, 840, 560, 840, 580, 520, 420, 640, 700, 900, 680, 620, 500, 320, 640, 320, 600, 500, 280, 660, 660, 640, 660, 640, 280, 660, 600, 240, 260, 580, 240, 940, 600, 640, 660, 660, 320, 440, 300, 600, 560, 800, 560, 580, 460, 340, 600, 340, 600, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 280, 560, 560, 160, 560, 560, 560, 560, 220, 480, 460, 240, 240, 520, 520, 500, 500, 560, 560, 280, 500, 600, 600, 280, 480, 480, 460, 1000, 1280, 500, 560, 500, 420, 420, 540, 480, 420, 480, 280, 500, 500, 360, 340, 500, 700, 340, 540, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 900, 500, 360, 500, 500, 500, 500, 480, 840, 1060, 360, 500, 500, 500, 500, 500, 1080, 500, 500, 500, 240, 500, 500, 320, 660, 1080, 600, )
diff --git a/bin/pychart/afm/Bookman_Demi.py b/bin/pychart/afm/Bookman_Demi.py
deleted file mode 100644
index 199315d3a8a..00000000000
--- a/bin/pychart/afm/Bookman_Demi.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# AFM font Bookman-Demi (path: /usr/share/fonts/afms/adobe/pbkd8a.afm).
-# Derived from Ghostscript distribution.
-# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
-import dir
-dir.afm["Bookman-Demi"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 340, 360, 420, 660, 660, 940, 800, 320, 320, 320, 460, 600, 340, 360, 340, 600, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 340, 340, 600, 600, 600, 660, 820, 720, 720, 740, 780, 720, 680, 780, 820, 400, 640, 800, 640, 940, 740, 800, 660, 800, 780, 660, 700, 740, 720, 940, 780, 700, 640, 300, 600, 300, 600, 500, 320, 580, 600, 580, 640, 580, 380, 580, 680, 360, 340, 660, 340, 1000, 680, 620, 640, 620, 460, 520, 460, 660, 600, 800, 600, 620, 560, 320, 600, 320, 600, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 360, 660, 660, 120, 660, 660, 600, 660, 240, 540, 400, 220, 220, 740, 740, 500, 500, 440, 380, 340, 500, 800, 460, 320, 540, 540, 400, 1000, 1360, 500, 660, 500, 400, 400, 500, 480, 460, 500, 320, 500, 500, 340, 360, 500, 440, 320, 500, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 1140, 500, 400, 500, 500, 500, 500, 640, 800, 1220, 400, 500, 500, 500, 500, 500, 880, 500, 500, 500, 360, 500, 500, 340, 620, 940, 660, )
diff --git a/bin/pychart/afm/Bookman_DemiItalic.py b/bin/pychart/afm/Bookman_DemiItalic.py
deleted file mode 100644
index 9e13c8f6516..00000000000
--- a/bin/pychart/afm/Bookman_DemiItalic.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# AFM font Bookman-DemiItalic (path: /usr/share/fonts/afms/adobe/pbkdi8a.afm).
-# Derived from Ghostscript distribution.
-# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
-import dir
-dir.afm["Bookman-DemiItalic"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 340, 320, 380, 680, 680, 880, 980, 320, 260, 260, 460, 600, 340, 280, 340, 360, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 340, 340, 620, 600, 620, 620, 780, 720, 720, 700, 760, 720, 660, 760, 800, 380, 620, 780, 640, 860, 740, 760, 640, 760, 740, 700, 700, 740, 660, 1000, 740, 660, 680, 260, 580, 260, 620, 500, 320, 680, 600, 560, 680, 560, 420, 620, 700, 380, 320, 700, 380, 960, 680, 600, 660, 620, 500, 540, 440, 680, 540, 860, 620, 600, 560, 300, 620, 300, 620, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 320, 680, 680, 120, 680, 680, 620, 680, 180, 520, 380, 220, 220, 820, 820, 500, 500, 420, 420, 340, 500, 680, 360, 300, 520, 520, 380, 1000, 1360, 500, 620, 500, 380, 340, 480, 480, 480, 460, 380, 520, 500, 360, 360, 500, 560, 320, 480, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 1140, 500, 440, 500, 500, 500, 500, 640, 760, 1180, 440, 500, 500, 500, 500, 500, 880, 500, 500, 500, 380, 500, 500, 380, 600, 920, 660, )
diff --git a/bin/pychart/afm/Bookman_Light.py b/bin/pychart/afm/Bookman_Light.py
deleted file mode 100644
index 031f86a6206..00000000000
--- a/bin/pychart/afm/Bookman_Light.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# AFM font Bookman-Light (path: /usr/share/fonts/afms/adobe/pbkl8a.afm).
-# Derived from Ghostscript distribution.
-# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
-import dir
-dir.afm["Bookman-Light"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 320, 300, 380, 620, 620, 900, 800, 220, 300, 300, 440, 600, 320, 400, 320, 600, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 320, 320, 600, 600, 600, 540, 820, 680, 740, 740, 800, 720, 640, 800, 800, 340, 600, 720, 600, 920, 740, 800, 620, 820, 720, 660, 620, 780, 700, 960, 720, 640, 640, 300, 600, 300, 600, 500, 220, 580, 620, 520, 620, 520, 320, 540, 660, 300, 300, 620, 300, 940, 660, 560, 620, 580, 440, 520, 380, 680, 520, 780, 560, 540, 480, 280, 600, 280, 600, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 300, 620, 620, 140, 620, 620, 520, 620, 220, 400, 360, 240, 240, 620, 620, 500, 500, 540, 540, 320, 500, 600, 460, 220, 400, 400, 360, 1000, 1280, 500, 540, 500, 340, 340, 420, 440, 440, 460, 260, 420, 500, 320, 320, 500, 380, 320, 420, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 1260, 500, 420, 500, 500, 500, 500, 600, 800, 1240, 420, 500, 500, 500, 500, 500, 860, 500, 500, 500, 300, 500, 500, 320, 560, 900, 660, )
diff --git a/bin/pychart/afm/Bookman_LightItalic.py b/bin/pychart/afm/Bookman_LightItalic.py
deleted file mode 100644
index 8a3d8d26fe8..00000000000
--- a/bin/pychart/afm/Bookman_LightItalic.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# AFM font Bookman-LightItalic (path: /usr/share/fonts/afms/adobe/pbkli8a.afm).
-# Derived from Ghostscript distribution.
-# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
-import dir
-dir.afm["Bookman-LightItalic"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 300, 320, 360, 620, 620, 800, 820, 280, 280, 280, 440, 600, 300, 320, 300, 600, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 300, 300, 600, 600, 600, 540, 780, 700, 720, 720, 740, 680, 620, 760, 800, 320, 560, 720, 580, 860, 720, 760, 600, 780, 700, 640, 600, 720, 680, 960, 700, 660, 580, 260, 600, 260, 600, 500, 280, 620, 600, 480, 640, 540, 340, 560, 620, 280, 280, 600, 280, 880, 620, 540, 600, 560, 400, 540, 340, 620, 540, 880, 540, 600, 520, 360, 600, 380, 600, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 320, 620, 620, 20, 620, 620, 620, 620, 200, 440, 300, 180, 180, 640, 660, 500, 500, 620, 620, 300, 500, 620, 460, 320, 480, 440, 300, 1000, 1180, 500, 540, 500, 340, 320, 440, 440, 440, 440, 260, 420, 500, 300, 320, 500, 340, 260, 440, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 1220, 500, 440, 500, 500, 500, 500, 580, 760, 1180, 400, 500, 500, 500, 500, 500, 880, 500, 500, 500, 280, 500, 500, 340, 540, 900, 620, )
diff --git a/bin/pychart/afm/Courier.py b/bin/pychart/afm/Courier.py
deleted file mode 100644
index 92da5498f3e..00000000000
--- a/bin/pychart/afm/Courier.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# AFM font Courier (path: /usr/share/fonts/afms/adobe/pcrr8a.afm).
-# Derived from Ghostscript distribution.
-# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
-import dir
-dir.afm["Courier"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 500, 600, 600, 600, 600, 500, 600, 600, 600, 600, 600, 600, 600, 600, 500, 600, 500, 600, 600, 600, 600, 600, 600, 600, 600, 500, 600, 600, 500, 600, 600, 600, 600, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 600, 500, 600, 500, 500, 500, 500, 600, 600, 600, 600, 500, 500, 500, 500, 500, 600, 500, 500, 500, 600, 500, 500, 600, 600, 600, 600, )
diff --git a/bin/pychart/afm/Courier_Bold.py b/bin/pychart/afm/Courier_Bold.py
deleted file mode 100644
index 3b8d493e022..00000000000
--- a/bin/pychart/afm/Courier_Bold.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# AFM font Courier-Bold (path: /usr/share/fonts/afms/adobe/pcrb8a.afm).
-# Derived from Ghostscript distribution.
-# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
-import dir
-dir.afm["Courier-Bold"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 500, 600, 600, 600, 600, 500, 600, 600, 600, 600, 600, 600, 600, 600, 500, 600, 500, 600, 600, 600, 600, 600, 600, 600, 600, 500, 600, 600, 500, 600, 600, 600, 600, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 600, 500, 600, 500, 500, 500, 500, 600, 600, 600, 600, 500, 500, 500, 500, 500, 600, 500, 500, 500, 600, 500, 500, 600, 600, 600, 600, )
diff --git a/bin/pychart/afm/Courier_BoldOblique.py b/bin/pychart/afm/Courier_BoldOblique.py
deleted file mode 100644
index 44abc0b75be..00000000000
--- a/bin/pychart/afm/Courier_BoldOblique.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# AFM font Courier-BoldOblique (path: /usr/share/fonts/afms/adobe/pcrbo8a.afm).
-# Derived from Ghostscript distribution.
-# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
-import dir
-dir.afm["Courier-BoldOblique"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 500, 600, 600, 600, 600, 500, 600, 600, 600, 600, 600, 600, 600, 600, 500, 600, 500, 600, 600, 600, 600, 600, 600, 600, 600, 500, 600, 600, 500, 600, 600, 600, 600, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 600, 500, 600, 500, 500, 500, 500, 600, 600, 600, 600, 500, 500, 500, 500, 500, 600, 500, 500, 500, 600, 500, 500, 600, 600, 600, 600, )
diff --git a/bin/pychart/afm/Courier_Oblique.py b/bin/pychart/afm/Courier_Oblique.py
deleted file mode 100644
index 834d14bcacd..00000000000
--- a/bin/pychart/afm/Courier_Oblique.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# AFM font Courier-Oblique (path: /usr/share/fonts/afms/adobe/pcrro8a.afm).
-# Derived from Ghostscript distribution.
-# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
-import dir
-dir.afm["Courier-Oblique"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 500, 600, 600, 600, 600, 500, 600, 600, 600, 600, 600, 600, 600, 600, 500, 600, 500, 600, 600, 600, 600, 600, 600, 600, 600, 500, 600, 600, 500, 600, 600, 600, 600, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 600, 500, 600, 500, 500, 500, 500, 600, 600, 600, 600, 500, 500, 500, 500, 500, 600, 500, 500, 500, 600, 500, 500, 600, 600, 600, 600, )
diff --git a/bin/pychart/afm/Helvetica.py b/bin/pychart/afm/Helvetica.py
deleted file mode 100644
index b9a0f775ed2..00000000000
--- a/bin/pychart/afm/Helvetica.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# AFM font Helvetica (path: /usr/share/fonts/afms/adobe/phvr8a.afm).
-# Derived from Ghostscript distribution.
-# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
-import dir
-dir.afm["Helvetica"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 278, 278, 355, 556, 556, 889, 667, 222, 333, 333, 389, 584, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 278, 278, 584, 584, 584, 556, 1015, 667, 667, 722, 722, 667, 611, 778, 722, 278, 500, 667, 556, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 278, 278, 278, 469, 556, 222, 556, 556, 500, 556, 556, 278, 556, 556, 222, 222, 500, 222, 833, 556, 556, 556, 556, 333, 500, 278, 556, 500, 722, 500, 500, 500, 334, 260, 334, 584, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 333, 556, 556, 167, 556, 556, 556, 556, 191, 333, 556, 333, 333, 500, 500, 500, 556, 556, 556, 278, 500, 537, 350, 222, 333, 333, 556, 1000, 1000, 500, 611, 500, 333, 333, 333, 333, 333, 333, 333, 333, 500, 333, 333, 500, 333, 333, 333, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 1000, 500, 370, 500, 500, 500, 500, 556, 778, 1000, 365, 500, 500, 500, 500, 500, 889, 500, 500, 500, 278, 500, 500, 222, 611, 944, 611, )
diff --git a/bin/pychart/afm/Helvetica_Bold.py b/bin/pychart/afm/Helvetica_Bold.py
deleted file mode 100644
index 1e6b332d384..00000000000
--- a/bin/pychart/afm/Helvetica_Bold.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# AFM font Helvetica-Bold (path: /usr/share/fonts/afms/adobe/phvb8a.afm).
-# Derived from Ghostscript distribution.
-# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
-import dir
-dir.afm["Helvetica-Bold"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 278, 333, 474, 556, 556, 889, 722, 278, 333, 333, 389, 584, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 333, 333, 584, 584, 584, 611, 975, 722, 722, 722, 722, 667, 611, 778, 722, 278, 556, 722, 611, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 333, 278, 333, 584, 556, 278, 556, 611, 556, 611, 556, 333, 611, 611, 278, 278, 556, 278, 889, 611, 611, 611, 611, 389, 556, 333, 611, 556, 778, 556, 556, 500, 389, 280, 389, 584, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 333, 556, 556, 167, 556, 556, 556, 556, 238, 500, 556, 333, 333, 611, 611, 500, 556, 556, 556, 278, 500, 556, 350, 278, 500, 500, 556, 1000, 1000, 500, 611, 500, 333, 333, 333, 333, 333, 333, 333, 333, 500, 333, 333, 500, 333, 333, 333, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 1000, 500, 370, 500, 500, 500, 500, 611, 778, 1000, 365, 500, 500, 500, 500, 500, 889, 500, 500, 500, 278, 500, 500, 278, 611, 944, 611, )
diff --git a/bin/pychart/afm/Helvetica_BoldOblique.py b/bin/pychart/afm/Helvetica_BoldOblique.py
deleted file mode 100644
index 98e8ea9edde..00000000000
--- a/bin/pychart/afm/Helvetica_BoldOblique.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# AFM font Helvetica-BoldOblique (path: /usr/share/fonts/afms/adobe/phvbo8a.afm).
-# Derived from Ghostscript distribution.
-# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
-import dir
-dir.afm["Helvetica-BoldOblique"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 278, 333, 474, 556, 556, 889, 722, 278, 333, 333, 389, 584, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 333, 333, 584, 584, 584, 611, 975, 722, 722, 722, 722, 667, 611, 778, 722, 278, 556, 722, 611, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 333, 278, 333, 584, 556, 278, 556, 611, 556, 611, 556, 333, 611, 611, 278, 278, 556, 278, 889, 611, 611, 611, 611, 389, 556, 333, 611, 556, 778, 556, 556, 500, 389, 280, 389, 584, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 333, 556, 556, 167, 556, 556, 556, 556, 238, 500, 556, 333, 333, 611, 611, 500, 556, 556, 556, 278, 500, 556, 350, 278, 500, 500, 556, 1000, 1000, 500, 611, 500, 333, 333, 333, 333, 333, 333, 333, 333, 500, 333, 333, 500, 333, 333, 333, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 1000, 500, 370, 500, 500, 500, 500, 611, 778, 1000, 365, 500, 500, 500, 500, 500, 889, 500, 500, 500, 278, 500, 500, 278, 611, 944, 611, )
diff --git a/bin/pychart/afm/Helvetica_Light.py b/bin/pychart/afm/Helvetica_Light.py
deleted file mode 100644
index 69128431e80..00000000000
--- a/bin/pychart/afm/Helvetica_Light.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# AFM font Helvetica-Light (path: /usr/share/fonts/afms/adobe/phvl8a.afm).
-# Derived from Ghostscript distribution.
-# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
-import dir
-dir.afm["Helvetica-Light"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 278, 333, 278, 556, 556, 889, 667, 222, 333, 333, 389, 660, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 278, 278, 660, 660, 660, 500, 800, 667, 667, 722, 722, 611, 556, 778, 722, 278, 500, 667, 556, 833, 722, 778, 611, 778, 667, 611, 556, 722, 611, 889, 611, 611, 611, 333, 278, 333, 660, 500, 222, 556, 611, 556, 611, 556, 278, 611, 556, 222, 222, 500, 222, 833, 556, 556, 611, 611, 333, 500, 278, 556, 500, 722, 500, 500, 500, 333, 222, 333, 660, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 333, 556, 556, 167, 556, 556, 556, 556, 222, 389, 556, 389, 389, 500, 500, 500, 500, 556, 556, 278, 500, 650, 500, 222, 389, 389, 556, 1000, 1000, 500, 500, 500, 333, 333, 333, 333, 333, 333, 333, 333, 500, 333, 333, 500, 333, 333, 333, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 1000, 500, 334, 500, 500, 500, 500, 556, 778, 1000, 334, 500, 500, 500, 500, 500, 889, 500, 500, 500, 222, 500, 500, 222, 556, 944, 500, )
diff --git a/bin/pychart/afm/Helvetica_LightOblique.py b/bin/pychart/afm/Helvetica_LightOblique.py
deleted file mode 100644
index efc82aabe4f..00000000000
--- a/bin/pychart/afm/Helvetica_LightOblique.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# AFM font Helvetica-LightOblique (path: /usr/share/fonts/afms/adobe/phvlo8a.afm).
-# Derived from Ghostscript distribution.
-# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
-import dir
-dir.afm["Helvetica-LightOblique"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 278, 333, 278, 556, 556, 889, 667, 222, 333, 333, 389, 660, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 278, 278, 660, 660, 660, 500, 800, 667, 667, 722, 722, 611, 556, 778, 722, 278, 500, 667, 556, 833, 722, 778, 611, 778, 667, 611, 556, 722, 611, 889, 611, 611, 611, 333, 278, 333, 660, 500, 222, 556, 611, 556, 611, 556, 278, 611, 556, 222, 222, 500, 222, 833, 556, 556, 611, 611, 333, 500, 278, 556, 500, 722, 500, 500, 500, 333, 222, 333, 660, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 333, 556, 556, 167, 556, 556, 556, 556, 222, 389, 556, 389, 389, 500, 500, 500, 500, 556, 556, 278, 500, 650, 500, 222, 389, 389, 556, 1000, 1000, 500, 500, 500, 333, 333, 333, 333, 333, 333, 333, 333, 500, 333, 333, 500, 333, 333, 333, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 1000, 500, 334, 500, 500, 500, 500, 556, 778, 1000, 334, 500, 500, 500, 500, 500, 889, 500, 500, 500, 222, 500, 500, 222, 556, 944, 500, )
diff --git a/bin/pychart/afm/Helvetica_Narrow.py b/bin/pychart/afm/Helvetica_Narrow.py
deleted file mode 100644
index 4b570843741..00000000000
--- a/bin/pychart/afm/Helvetica_Narrow.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# AFM font Helvetica-Narrow (path: /usr/share/fonts/afms/adobe/phvr8an.afm).
-# Derived from Ghostscript distribution.
-# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
-import dir
-dir.afm["Helvetica-Narrow"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 228, 228, 291, 456, 456, 729, 547, 182, 273, 273, 319, 479, 228, 273, 228, 228, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 228, 228, 479, 479, 479, 456, 832, 547, 547, 592, 592, 547, 501, 638, 592, 228, 410, 547, 456, 683, 592, 638, 547, 638, 592, 547, 501, 592, 547, 774, 547, 547, 501, 228, 228, 228, 385, 456, 182, 456, 456, 410, 456, 456, 228, 456, 456, 182, 182, 410, 182, 683, 456, 456, 456, 456, 273, 410, 228, 456, 410, 592, 410, 410, 410, 274, 213, 274, 479, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 273, 456, 456, 137, 456, 456, 456, 456, 157, 273, 456, 273, 273, 410, 410, 500, 456, 456, 456, 228, 500, 440, 287, 182, 273, 273, 456, 820, 820, 500, 501, 500, 273, 273, 273, 273, 273, 273, 273, 273, 500, 273, 273, 500, 273, 273, 273, 820, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 820, 500, 303, 500, 500, 500, 500, 456, 638, 820, 299, 500, 500, 500, 500, 500, 729, 500, 500, 500, 228, 500, 500, 182, 501, 774, 501, )
diff --git a/bin/pychart/afm/Helvetica_Narrow_Bold.py b/bin/pychart/afm/Helvetica_Narrow_Bold.py
deleted file mode 100644
index 009b6987003..00000000000
--- a/bin/pychart/afm/Helvetica_Narrow_Bold.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# AFM font Helvetica-Narrow-Bold (path: /usr/share/fonts/afms/adobe/phvb8an.afm).
-# Derived from Ghostscript distribution.
-# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
-import dir
-dir.afm["Helvetica-Narrow-Bold"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 228, 273, 389, 456, 456, 729, 592, 228, 273, 273, 319, 479, 228, 273, 228, 228, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 273, 273, 479, 479, 479, 501, 800, 592, 592, 592, 592, 547, 501, 638, 592, 228, 456, 592, 501, 683, 592, 638, 547, 638, 592, 547, 501, 592, 547, 774, 547, 547, 501, 273, 228, 273, 479, 456, 228, 456, 501, 456, 501, 456, 273, 501, 501, 228, 228, 456, 228, 729, 501, 501, 501, 501, 319, 456, 273, 501, 456, 638, 456, 456, 410, 319, 230, 319, 479, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 273, 456, 456, 137, 456, 456, 456, 456, 195, 410, 456, 273, 273, 501, 501, 500, 456, 456, 456, 228, 500, 456, 287, 228, 410, 410, 456, 820, 820, 500, 501, 500, 273, 273, 273, 273, 273, 273, 273, 273, 500, 273, 273, 500, 273, 273, 273, 820, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 820, 500, 303, 500, 500, 500, 500, 501, 638, 820, 299, 500, 500, 500, 500, 500, 729, 500, 500, 500, 228, 500, 500, 228, 501, 774, 501, )
diff --git a/bin/pychart/afm/Helvetica_Narrow_BoldOblique.py b/bin/pychart/afm/Helvetica_Narrow_BoldOblique.py
deleted file mode 100644
index 98d7e2ef4a7..00000000000
--- a/bin/pychart/afm/Helvetica_Narrow_BoldOblique.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# AFM font Helvetica-Narrow-BoldOblique (path: /usr/share/fonts/afms/adobe/phvbo8an.afm).
-# Derived from Ghostscript distribution.
-# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
-import dir
-dir.afm["Helvetica-Narrow-BoldOblique"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 228, 273, 389, 456, 456, 729, 592, 228, 273, 273, 319, 479, 228, 273, 228, 228, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 273, 273, 479, 479, 479, 501, 800, 592, 592, 592, 592, 547, 501, 638, 592, 228, 456, 592, 501, 683, 592, 638, 547, 638, 592, 547, 501, 592, 547, 774, 547, 547, 501, 273, 228, 273, 479, 456, 228, 456, 501, 456, 501, 456, 273, 501, 501, 228, 228, 456, 228, 729, 501, 501, 501, 501, 319, 456, 273, 501, 456, 638, 456, 456, 410, 319, 230, 319, 479, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 273, 456, 456, 137, 456, 456, 456, 456, 195, 410, 456, 273, 273, 501, 501, 500, 456, 456, 456, 228, 500, 456, 287, 228, 410, 410, 456, 820, 820, 500, 501, 500, 273, 273, 273, 273, 273, 273, 273, 273, 500, 273, 273, 500, 273, 273, 273, 820, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 820, 500, 303, 500, 500, 500, 500, 501, 638, 820, 299, 500, 500, 500, 500, 500, 729, 500, 500, 500, 228, 500, 500, 228, 501, 774, 501, )
diff --git a/bin/pychart/afm/Helvetica_Narrow_Oblique.py b/bin/pychart/afm/Helvetica_Narrow_Oblique.py
deleted file mode 100644
index 8612d7211b0..00000000000
--- a/bin/pychart/afm/Helvetica_Narrow_Oblique.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# AFM font Helvetica-Narrow-Oblique (path: /usr/share/fonts/afms/adobe/phvro8an.afm).
-# Derived from Ghostscript distribution.
-# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
-import dir
-dir.afm["Helvetica-Narrow-Oblique"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 228, 228, 291, 456, 456, 729, 547, 182, 273, 273, 319, 479, 228, 273, 228, 228, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 228, 228, 479, 479, 479, 456, 832, 547, 547, 592, 592, 547, 501, 638, 592, 228, 410, 547, 456, 683, 592, 638, 547, 638, 592, 547, 501, 592, 547, 774, 547, 547, 501, 228, 228, 228, 385, 456, 182, 456, 456, 410, 456, 456, 228, 456, 456, 182, 182, 410, 182, 683, 456, 456, 456, 456, 273, 410, 228, 456, 410, 592, 410, 410, 410, 274, 213, 274, 479, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 273, 456, 456, 137, 456, 456, 456, 456, 157, 273, 456, 273, 273, 410, 410, 500, 456, 456, 456, 228, 500, 440, 287, 182, 273, 273, 456, 820, 820, 500, 501, 500, 273, 273, 273, 273, 273, 273, 273, 273, 500, 273, 273, 500, 273, 273, 273, 820, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 820, 500, 303, 500, 500, 500, 500, 456, 638, 820, 299, 500, 500, 500, 500, 500, 729, 500, 500, 500, 228, 500, 500, 182, 501, 774, 501, )
diff --git a/bin/pychart/afm/Helvetica_Oblique.py b/bin/pychart/afm/Helvetica_Oblique.py
deleted file mode 100644
index b8ee7e383e6..00000000000
--- a/bin/pychart/afm/Helvetica_Oblique.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# AFM font Helvetica-Oblique (path: /usr/share/fonts/afms/adobe/phvro8a.afm).
-# Derived from Ghostscript distribution.
-# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
-import dir
-dir.afm["Helvetica-Oblique"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 278, 278, 355, 556, 556, 889, 667, 222, 333, 333, 389, 584, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 278, 278, 584, 584, 584, 556, 1015, 667, 667, 722, 722, 667, 611, 778, 722, 278, 500, 667, 556, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 278, 278, 278, 469, 556, 222, 556, 556, 500, 556, 556, 278, 556, 556, 222, 222, 500, 222, 833, 556, 556, 556, 556, 333, 500, 278, 556, 500, 722, 500, 500, 500, 334, 260, 334, 584, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 333, 556, 556, 167, 556, 556, 556, 556, 191, 333, 556, 333, 333, 500, 500, 500, 556, 556, 556, 278, 500, 537, 350, 222, 333, 333, 556, 1000, 1000, 500, 611, 500, 333, 333, 333, 333, 333, 333, 333, 333, 500, 333, 333, 500, 333, 333, 333, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 1000, 500, 370, 500, 500, 500, 500, 556, 778, 1000, 365, 500, 500, 500, 500, 500, 889, 500, 500, 500, 278, 500, 500, 222, 611, 944, 611, )
diff --git a/bin/pychart/afm/NewCenturySchlbk_Bold.py b/bin/pychart/afm/NewCenturySchlbk_Bold.py
deleted file mode 100644
index a553f31bb20..00000000000
--- a/bin/pychart/afm/NewCenturySchlbk_Bold.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# AFM font NewCenturySchlbk-Bold (path: /usr/share/fonts/afms/adobe/pncb8a.afm).
-# Derived from Ghostscript distribution.
-# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
-import dir
-dir.afm["NewCenturySchlbk-Bold"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 287, 296, 333, 574, 574, 833, 852, 241, 389, 389, 500, 606, 278, 333, 278, 278, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 278, 278, 606, 606, 606, 500, 747, 759, 778, 778, 833, 759, 722, 833, 870, 444, 648, 815, 722, 981, 833, 833, 759, 833, 815, 667, 722, 833, 759, 981, 722, 722, 667, 389, 606, 389, 606, 500, 241, 611, 648, 556, 667, 574, 389, 611, 685, 370, 352, 667, 352, 963, 685, 611, 667, 648, 519, 500, 426, 685, 611, 889, 611, 611, 537, 389, 606, 389, 606, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 296, 574, 574, 167, 574, 574, 500, 574, 241, 481, 500, 333, 333, 685, 685, 500, 500, 500, 500, 278, 500, 747, 606, 241, 481, 481, 500, 1000, 1000, 500, 500, 500, 333, 333, 333, 333, 333, 333, 333, 333, 500, 333, 333, 500, 333, 333, 333, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 981, 500, 367, 500, 500, 500, 500, 722, 833, 1000, 367, 500, 500, 500, 500, 500, 870, 500, 500, 500, 370, 500, 500, 352, 611, 907, 611, )
diff --git a/bin/pychart/afm/NewCenturySchlbk_BoldItalic.py b/bin/pychart/afm/NewCenturySchlbk_BoldItalic.py
deleted file mode 100644
index 7daa58ee2ff..00000000000
--- a/bin/pychart/afm/NewCenturySchlbk_BoldItalic.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# AFM font NewCenturySchlbk-BoldItalic (path: /usr/share/fonts/afms/adobe/pncbi8a.afm).
-# Derived from Ghostscript distribution.
-# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
-import dir
-dir.afm["NewCenturySchlbk-BoldItalic"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 287, 333, 400, 574, 574, 889, 889, 259, 407, 407, 500, 606, 287, 333, 287, 278, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 287, 287, 606, 606, 606, 481, 747, 741, 759, 759, 833, 741, 704, 815, 870, 444, 667, 778, 704, 944, 852, 833, 741, 833, 796, 685, 722, 833, 741, 944, 741, 704, 704, 407, 606, 407, 606, 500, 259, 667, 611, 537, 667, 519, 389, 611, 685, 389, 370, 648, 389, 944, 685, 574, 648, 630, 519, 481, 407, 685, 556, 833, 574, 519, 519, 407, 606, 407, 606, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 333, 574, 574, 167, 574, 574, 500, 574, 287, 481, 481, 278, 278, 685, 685, 500, 500, 500, 500, 287, 500, 650, 606, 259, 481, 481, 481, 1000, 1167, 500, 481, 500, 333, 333, 333, 333, 333, 333, 333, 333, 500, 333, 333, 500, 333, 333, 333, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 889, 500, 412, 500, 500, 500, 500, 704, 833, 963, 356, 500, 500, 500, 500, 500, 815, 500, 500, 500, 389, 500, 500, 389, 574, 852, 574, )
diff --git a/bin/pychart/afm/NewCenturySchlbk_Italic.py b/bin/pychart/afm/NewCenturySchlbk_Italic.py
deleted file mode 100644
index cfe6b4f060b..00000000000
--- a/bin/pychart/afm/NewCenturySchlbk_Italic.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# AFM font NewCenturySchlbk-Italic (path: /usr/share/fonts/afms/adobe/pncri8a.afm).
-# Derived from Ghostscript distribution.
-# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
-import dir
-dir.afm["NewCenturySchlbk-Italic"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 278, 333, 400, 556, 556, 833, 852, 204, 333, 333, 500, 606, 278, 333, 278, 606, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 278, 278, 606, 606, 606, 444, 747, 704, 722, 722, 778, 722, 667, 778, 833, 407, 611, 741, 667, 944, 815, 778, 667, 778, 741, 667, 685, 815, 704, 926, 704, 685, 667, 333, 606, 333, 606, 500, 204, 574, 556, 444, 611, 444, 333, 537, 611, 333, 315, 556, 333, 889, 611, 500, 574, 556, 444, 444, 352, 611, 519, 778, 500, 500, 463, 333, 606, 333, 606, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 333, 556, 556, 167, 556, 556, 500, 556, 278, 389, 426, 333, 333, 611, 611, 500, 500, 500, 500, 278, 500, 650, 606, 204, 389, 389, 426, 1000, 1000, 500, 444, 500, 333, 333, 333, 333, 333, 333, 333, 333, 500, 333, 333, 500, 333, 333, 333, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 870, 500, 422, 500, 500, 500, 500, 667, 778, 981, 372, 500, 500, 500, 500, 500, 722, 500, 500, 500, 333, 500, 500, 333, 500, 778, 556, )
diff --git a/bin/pychart/afm/NewCenturySchlbk_Roman.py b/bin/pychart/afm/NewCenturySchlbk_Roman.py
deleted file mode 100644
index 07e62553fed..00000000000
--- a/bin/pychart/afm/NewCenturySchlbk_Roman.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# AFM font NewCenturySchlbk-Roman (path: /usr/share/fonts/afms/adobe/pncr8a.afm).
-# Derived from Ghostscript distribution.
-# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
-import dir
-dir.afm["NewCenturySchlbk-Roman"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 278, 296, 389, 556, 556, 833, 815, 204, 333, 333, 500, 606, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 278, 278, 606, 606, 606, 444, 737, 722, 722, 722, 778, 722, 667, 778, 833, 407, 556, 778, 667, 944, 815, 778, 667, 778, 722, 630, 667, 815, 722, 981, 704, 704, 611, 333, 606, 333, 606, 500, 204, 556, 556, 444, 574, 500, 333, 537, 611, 315, 296, 593, 315, 889, 611, 500, 574, 556, 444, 463, 389, 611, 537, 778, 537, 537, 481, 333, 606, 333, 606, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 296, 556, 556, 167, 556, 556, 500, 556, 204, 389, 426, 259, 259, 611, 611, 500, 556, 500, 500, 278, 500, 606, 606, 204, 389, 389, 426, 1000, 1000, 500, 444, 500, 333, 333, 333, 333, 333, 333, 333, 333, 500, 333, 333, 500, 333, 333, 333, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 1000, 500, 334, 500, 500, 500, 500, 667, 778, 1000, 300, 500, 500, 500, 500, 500, 796, 500, 500, 500, 315, 500, 500, 315, 500, 833, 574, )
diff --git a/bin/pychart/afm/Palatino_Bold.py b/bin/pychart/afm/Palatino_Bold.py
deleted file mode 100644
index ecc968966cb..00000000000
--- a/bin/pychart/afm/Palatino_Bold.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# AFM font Palatino-Bold (path: /usr/share/fonts/afms/adobe/pplb8a.afm).
-# Derived from Ghostscript distribution.
-# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
-import dir
-dir.afm["Palatino-Bold"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 250, 278, 402, 500, 500, 889, 833, 278, 333, 333, 444, 606, 250, 333, 250, 296, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 250, 250, 606, 606, 606, 444, 747, 778, 667, 722, 833, 611, 556, 833, 833, 389, 389, 778, 611, 1000, 833, 833, 611, 833, 722, 611, 667, 778, 778, 1000, 667, 667, 667, 333, 606, 333, 606, 500, 278, 500, 611, 444, 611, 500, 389, 556, 611, 333, 333, 611, 333, 889, 611, 556, 611, 611, 389, 444, 333, 611, 556, 833, 500, 556, 500, 310, 606, 310, 606, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 278, 500, 500, 167, 500, 500, 500, 500, 227, 500, 500, 389, 389, 611, 611, 500, 500, 500, 500, 250, 500, 641, 606, 333, 500, 500, 500, 1000, 1000, 500, 444, 500, 333, 333, 333, 333, 333, 333, 333, 333, 500, 333, 333, 500, 333, 333, 333, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 1000, 500, 438, 500, 500, 500, 500, 611, 833, 1000, 488, 500, 500, 500, 500, 500, 778, 500, 500, 500, 333, 500, 500, 333, 556, 833, 611, )
diff --git a/bin/pychart/afm/Palatino_BoldItalic.py b/bin/pychart/afm/Palatino_BoldItalic.py
deleted file mode 100644
index 64c12005939..00000000000
--- a/bin/pychart/afm/Palatino_BoldItalic.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# AFM font Palatino-BoldItalic (path: /usr/share/fonts/afms/adobe/pplbi8a.afm).
-# Derived from Ghostscript distribution.
-# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
-import dir
-dir.afm["Palatino-BoldItalic"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 250, 333, 500, 500, 500, 889, 833, 278, 333, 333, 444, 606, 250, 389, 250, 315, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 250, 250, 606, 606, 606, 444, 833, 722, 667, 685, 778, 611, 556, 778, 778, 389, 389, 722, 611, 944, 778, 833, 667, 833, 722, 556, 611, 778, 667, 1000, 722, 611, 667, 333, 606, 333, 606, 500, 278, 556, 537, 444, 556, 444, 333, 500, 556, 333, 333, 556, 333, 833, 556, 556, 556, 537, 389, 444, 389, 556, 556, 833, 500, 556, 500, 333, 606, 333, 606, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 333, 500, 500, 167, 500, 500, 556, 500, 250, 500, 500, 333, 333, 611, 611, 500, 500, 556, 556, 250, 500, 556, 606, 250, 500, 500, 500, 1000, 1000, 500, 444, 500, 333, 333, 333, 333, 333, 333, 333, 333, 500, 556, 333, 500, 333, 333, 333, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 944, 500, 333, 500, 500, 500, 500, 611, 833, 944, 333, 500, 500, 500, 500, 500, 738, 500, 500, 500, 333, 500, 500, 333, 556, 778, 556, )
diff --git a/bin/pychart/afm/Palatino_Italic.py b/bin/pychart/afm/Palatino_Italic.py
deleted file mode 100644
index 9e22479089d..00000000000
--- a/bin/pychart/afm/Palatino_Italic.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# AFM font Palatino-Italic (path: /usr/share/fonts/afms/adobe/pplri8a.afm).
-# Derived from Ghostscript distribution.
-# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
-import dir
-dir.afm["Palatino-Italic"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 250, 333, 500, 500, 500, 889, 778, 278, 333, 333, 389, 606, 250, 333, 250, 296, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 250, 250, 606, 606, 606, 500, 747, 722, 611, 667, 778, 611, 556, 722, 778, 333, 333, 667, 556, 944, 778, 778, 611, 778, 667, 556, 611, 778, 722, 944, 722, 667, 667, 333, 606, 333, 606, 500, 278, 444, 463, 407, 500, 389, 278, 500, 500, 278, 278, 444, 278, 778, 556, 444, 500, 463, 389, 389, 333, 556, 500, 722, 500, 500, 444, 333, 606, 333, 606, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 333, 500, 500, 167, 500, 500, 500, 500, 333, 500, 500, 333, 333, 528, 545, 500, 500, 500, 500, 250, 500, 500, 500, 278, 500, 500, 500, 1000, 1000, 500, 500, 500, 333, 333, 333, 333, 333, 333, 333, 333, 500, 333, 333, 500, 333, 333, 333, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 941, 500, 333, 500, 500, 500, 500, 556, 778, 1028, 333, 500, 500, 500, 500, 500, 638, 500, 500, 500, 278, 500, 500, 278, 444, 669, 500, )
diff --git a/bin/pychart/afm/Palatino_Roman.py b/bin/pychart/afm/Palatino_Roman.py
deleted file mode 100644
index ada67fc41da..00000000000
--- a/bin/pychart/afm/Palatino_Roman.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# AFM font Palatino-Roman (path: /usr/share/fonts/afms/adobe/pplr8a.afm).
-# Derived from Ghostscript distribution.
-# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
-import dir
-dir.afm["Palatino-Roman"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 250, 278, 371, 500, 500, 840, 778, 278, 333, 333, 389, 606, 250, 333, 250, 606, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 250, 250, 606, 606, 606, 444, 747, 778, 611, 709, 774, 611, 556, 763, 832, 337, 333, 726, 611, 946, 831, 786, 604, 786, 668, 525, 613, 778, 722, 1000, 667, 667, 667, 333, 606, 333, 606, 500, 278, 500, 553, 444, 611, 479, 333, 556, 582, 291, 234, 556, 291, 883, 582, 546, 601, 560, 395, 424, 326, 603, 565, 834, 516, 556, 500, 333, 606, 333, 606, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 278, 500, 500, 167, 500, 500, 500, 500, 208, 500, 500, 331, 331, 605, 608, 500, 500, 500, 500, 250, 500, 628, 606, 278, 500, 500, 500, 1000, 1144, 500, 444, 500, 333, 333, 333, 333, 333, 333, 250, 333, 500, 333, 333, 500, 380, 313, 333, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 944, 500, 333, 500, 500, 500, 500, 611, 833, 998, 333, 500, 500, 500, 500, 500, 758, 500, 500, 500, 287, 500, 500, 291, 556, 827, 556, )
diff --git a/bin/pychart/afm/Symbol.py b/bin/pychart/afm/Symbol.py
deleted file mode 100644
index a9e7b9af4d8..00000000000
--- a/bin/pychart/afm/Symbol.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# AFM font Symbol (path: /usr/share/fonts/afms/adobe/psyr.afm).
-# Derived from Ghostscript distribution.
-# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
-import dir
-dir.afm["Symbol"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 250, 333, 713, 500, 549, 833, 778, 439, 333, 333, 500, 549, 250, 549, 250, 278, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 278, 278, 549, 549, 549, 444, 549, 722, 667, 722, 612, 611, 763, 603, 722, 333, 631, 722, 686, 889, 722, 722, 768, 741, 556, 592, 611, 690, 439, 768, 645, 795, 611, 333, 863, 333, 658, 500, 500, 631, 549, 549, 494, 439, 521, 411, 603, 329, 603, 549, 549, 576, 521, 549, 549, 521, 549, 603, 439, 576, 713, 686, 493, 686, 494, 480, 200, 480, 549, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 620, 247, 549, 167, 713, 500, 753, 753, 753, 753, 1042, 987, 603, 987, 603, 400, 549, 411, 549, 549, 713, 494, 460, 549, 549, 549, 549, 1000, 603, 1000, 658, 823, 686, 795, 987, 768, 768, 823, 768, 768, 713, 713, 713, 713, 713, 713, 713, 768, 713, 790, 790, 890, 823, 549, 250, 713, 603, 603, 1042, 987, 603, 987, 603, 494, 329, 790, 790, 786, 713, 384, 384, 384, 384, 384, 384, 494, 494, 494, 494, 500, 329, 274, 686, 686, 686, 384, 384, 384, 384, 384, 384, 494, 494, 494, )
diff --git a/bin/pychart/afm/Times_Bold.py b/bin/pychart/afm/Times_Bold.py
deleted file mode 100644
index 6db5447bfbf..00000000000
--- a/bin/pychart/afm/Times_Bold.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# AFM font Times-Bold (path: /usr/share/fonts/afms/adobe/ptmb8a.afm).
-# Derived from Ghostscript distribution.
-# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
-import dir
-dir.afm["Times-Bold"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 250, 333, 555, 500, 500, 1000, 833, 333, 333, 333, 500, 570, 250, 333, 250, 278, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 333, 333, 570, 570, 570, 500, 930, 722, 667, 722, 722, 667, 611, 778, 778, 389, 500, 778, 667, 944, 722, 778, 611, 778, 722, 556, 667, 722, 722, 1000, 722, 722, 667, 333, 278, 333, 581, 500, 333, 500, 556, 444, 556, 444, 333, 500, 556, 278, 333, 556, 278, 833, 556, 500, 556, 556, 444, 389, 333, 556, 500, 722, 500, 500, 444, 394, 220, 394, 520, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 333, 500, 500, 167, 500, 500, 500, 500, 278, 500, 500, 333, 333, 556, 556, 500, 500, 500, 500, 250, 500, 540, 350, 333, 500, 500, 500, 1000, 1000, 500, 500, 500, 333, 333, 333, 333, 333, 333, 333, 333, 500, 333, 333, 500, 333, 333, 333, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 1000, 500, 300, 500, 500, 500, 500, 667, 778, 1000, 330, 500, 500, 500, 500, 500, 722, 500, 500, 500, 278, 500, 500, 278, 500, 722, 556, )
diff --git a/bin/pychart/afm/Times_BoldItalic.py b/bin/pychart/afm/Times_BoldItalic.py
deleted file mode 100644
index 3188d46f813..00000000000
--- a/bin/pychart/afm/Times_BoldItalic.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# AFM font Times-BoldItalic (path: /usr/share/fonts/afms/adobe/ptmbi8a.afm).
-# Derived from Ghostscript distribution.
-# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
-import dir
-dir.afm["Times-BoldItalic"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 250, 389, 555, 500, 500, 833, 778, 333, 333, 333, 500, 570, 250, 333, 250, 278, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 333, 333, 570, 570, 570, 500, 832, 667, 667, 667, 722, 667, 667, 722, 778, 389, 500, 667, 611, 889, 722, 722, 611, 722, 667, 556, 611, 722, 667, 889, 667, 611, 611, 333, 278, 333, 570, 500, 333, 500, 500, 444, 500, 444, 333, 500, 556, 278, 278, 500, 278, 778, 556, 500, 500, 500, 389, 389, 278, 556, 444, 667, 500, 444, 389, 348, 220, 348, 570, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 389, 500, 500, 167, 500, 500, 500, 500, 278, 500, 500, 333, 333, 556, 556, 500, 500, 500, 500, 250, 500, 500, 350, 333, 500, 500, 500, 1000, 1000, 500, 500, 500, 333, 333, 333, 333, 333, 333, 333, 333, 500, 333, 333, 500, 333, 333, 333, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 944, 500, 266, 500, 500, 500, 500, 611, 722, 944, 300, 500, 500, 500, 500, 500, 722, 500, 500, 500, 278, 500, 500, 278, 500, 722, 500, )
diff --git a/bin/pychart/afm/Times_Italic.py b/bin/pychart/afm/Times_Italic.py
deleted file mode 100644
index 4a4df2b8a98..00000000000
--- a/bin/pychart/afm/Times_Italic.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# AFM font Times-Italic (path: /usr/share/fonts/afms/adobe/ptmri8a.afm).
-# Derived from Ghostscript distribution.
-# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
-import dir
-dir.afm["Times-Italic"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 250, 333, 420, 500, 500, 833, 778, 333, 333, 333, 500, 675, 250, 333, 250, 278, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 333, 333, 675, 675, 675, 500, 920, 611, 611, 667, 722, 611, 611, 722, 722, 333, 444, 667, 556, 833, 667, 722, 611, 722, 611, 500, 556, 722, 611, 833, 611, 556, 556, 389, 278, 389, 422, 500, 333, 500, 500, 444, 500, 444, 278, 500, 500, 278, 278, 444, 278, 722, 500, 500, 500, 500, 389, 389, 278, 500, 444, 667, 444, 444, 389, 400, 275, 400, 541, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 389, 500, 500, 167, 500, 500, 500, 500, 214, 556, 500, 333, 333, 500, 500, 500, 500, 500, 500, 250, 500, 523, 350, 333, 556, 556, 500, 889, 1000, 500, 500, 500, 333, 333, 333, 333, 333, 333, 333, 333, 500, 333, 333, 500, 333, 333, 333, 889, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 889, 500, 276, 500, 500, 500, 500, 556, 722, 944, 310, 500, 500, 500, 500, 500, 667, 500, 500, 500, 278, 500, 500, 278, 500, 667, 500, )
diff --git a/bin/pychart/afm/Times_Roman.py b/bin/pychart/afm/Times_Roman.py
deleted file mode 100644
index a03ee6591e4..00000000000
--- a/bin/pychart/afm/Times_Roman.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# AFM font Times-Roman (path: /usr/share/fonts/afms/adobe/ptmr8a.afm).
-# Derived from Ghostscript distribution.
-# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
-import dir
-dir.afm["Times-Roman"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 250, 333, 408, 500, 500, 833, 778, 333, 333, 333, 500, 564, 250, 333, 250, 278, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 278, 278, 564, 564, 564, 444, 921, 722, 667, 667, 722, 611, 556, 722, 722, 333, 389, 722, 611, 889, 722, 722, 556, 722, 667, 556, 611, 722, 722, 944, 722, 722, 611, 333, 278, 333, 469, 500, 333, 444, 500, 444, 500, 444, 333, 500, 500, 278, 278, 500, 278, 778, 500, 500, 500, 500, 333, 389, 278, 500, 500, 722, 500, 500, 444, 480, 200, 480, 541, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 333, 500, 500, 167, 500, 500, 500, 500, 180, 444, 500, 333, 333, 556, 556, 500, 500, 500, 500, 250, 500, 453, 350, 333, 444, 444, 500, 1000, 1000, 500, 444, 500, 333, 333, 333, 333, 333, 333, 333, 333, 500, 333, 333, 500, 333, 333, 333, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 889, 500, 276, 500, 500, 500, 500, 611, 722, 889, 310, 500, 500, 500, 500, 500, 667, 500, 500, 500, 278, 500, 500, 278, 500, 722, 500, )
diff --git a/bin/pychart/afm/Utopia_Bold.py b/bin/pychart/afm/Utopia_Bold.py
deleted file mode 100644
index 5f9c25c158f..00000000000
--- a/bin/pychart/afm/Utopia_Bold.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# AFM font Utopia-Bold (path: /usr/share/fonts/afms/adobe/putb8a.afm).
-# Derived from Ghostscript distribution.
-# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
-import dir
-dir.afm["Utopia-Bold"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 210, 278, 473, 560, 560, 887, 748, 252, 365, 365, 442, 600, 280, 392, 280, 378, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 280, 280, 600, 600, 600, 456, 833, 644, 683, 689, 777, 629, 593, 726, 807, 384, 386, 707, 585, 918, 739, 768, 650, 768, 684, 561, 624, 786, 645, 933, 634, 617, 614, 335, 379, 335, 600, 500, 252, 544, 605, 494, 605, 519, 342, 533, 631, 316, 316, 582, 309, 948, 638, 585, 615, 597, 440, 446, 370, 629, 520, 774, 522, 524, 483, 365, 284, 365, 600, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 278, 560, 560, 100, 560, 560, 566, 560, 252, 473, 487, 287, 287, 639, 639, 500, 500, 510, 486, 280, 500, 552, 455, 252, 473, 473, 487, 1000, 1289, 500, 456, 500, 430, 430, 430, 430, 430, 430, 430, 430, 500, 430, 430, 500, 430, 430, 430, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 879, 500, 405, 500, 500, 500, 500, 591, 768, 1049, 427, 500, 500, 500, 500, 500, 806, 500, 500, 500, 316, 500, 500, 321, 585, 866, 662, )
diff --git a/bin/pychart/afm/Utopia_BoldItalic.py b/bin/pychart/afm/Utopia_BoldItalic.py
deleted file mode 100644
index 9ef88006c6b..00000000000
--- a/bin/pychart/afm/Utopia_BoldItalic.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# AFM font Utopia-BoldItalic (path: /usr/share/fonts/afms/adobe/putbi8a.afm).
-# Derived from Ghostscript distribution.
-# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
-import dir
-dir.afm["Utopia-BoldItalic"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 210, 285, 455, 560, 560, 896, 752, 246, 350, 350, 500, 600, 280, 392, 280, 260, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 280, 280, 600, 600, 600, 454, 828, 634, 680, 672, 774, 622, 585, 726, 800, 386, 388, 688, 586, 921, 741, 761, 660, 761, 681, 551, 616, 776, 630, 920, 630, 622, 618, 350, 460, 350, 600, 500, 246, 596, 586, 456, 609, 476, 348, 522, 629, 339, 333, 570, 327, 914, 635, 562, 606, 584, 440, 417, 359, 634, 518, 795, 516, 489, 466, 340, 265, 340, 600, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 285, 560, 560, 100, 560, 560, 568, 560, 246, 455, 560, 360, 360, 651, 652, 500, 500, 514, 490, 280, 500, 580, 465, 246, 455, 455, 560, 1000, 1297, 500, 454, 500, 400, 400, 400, 400, 400, 400, 402, 400, 500, 400, 400, 500, 400, 350, 400, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 890, 500, 444, 500, 500, 500, 500, 592, 761, 1016, 412, 500, 500, 500, 500, 500, 789, 500, 500, 500, 339, 500, 500, 339, 562, 811, 628, )
diff --git a/bin/pychart/afm/Utopia_Italic.py b/bin/pychart/afm/Utopia_Italic.py
deleted file mode 100644
index 920c1271193..00000000000
--- a/bin/pychart/afm/Utopia_Italic.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# AFM font Utopia-Italic (path: /usr/share/fonts/afms/adobe/putri8a.afm).
-# Derived from Ghostscript distribution.
-# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
-import dir
-dir.afm["Utopia-Italic"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 225, 240, 402, 530, 530, 826, 725, 216, 350, 350, 412, 570, 265, 392, 265, 270, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 265, 265, 570, 570, 570, 425, 794, 624, 632, 661, 763, 596, 571, 709, 775, 345, 352, 650, 565, 920, 763, 753, 614, 753, 640, 533, 606, 794, 637, 946, 632, 591, 622, 330, 390, 330, 570, 500, 216, 561, 559, 441, 587, 453, 315, 499, 607, 317, 309, 545, 306, 912, 618, 537, 590, 559, 402, 389, 341, 618, 510, 785, 516, 468, 468, 340, 270, 340, 570, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 240, 530, 530, 100, 530, 530, 530, 530, 216, 402, 462, 277, 277, 607, 603, 500, 500, 500, 490, 265, 500, 560, 500, 216, 402, 402, 462, 1000, 1200, 500, 425, 500, 400, 400, 400, 400, 400, 400, 402, 400, 500, 400, 400, 500, 400, 350, 400, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 880, 500, 425, 500, 500, 500, 500, 571, 753, 1020, 389, 500, 500, 500, 500, 500, 779, 500, 500, 500, 317, 500, 500, 318, 537, 806, 577, )
diff --git a/bin/pychart/afm/Utopia_Regular.py b/bin/pychart/afm/Utopia_Regular.py
deleted file mode 100644
index 656c6a58d7d..00000000000
--- a/bin/pychart/afm/Utopia_Regular.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# AFM font Utopia-Regular (path: /usr/share/fonts/afms/adobe/putr8a.afm).
-# Derived from Ghostscript distribution.
-# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
-import dir
-dir.afm["Utopia-Regular"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 225, 242, 458, 530, 530, 838, 706, 278, 350, 350, 412, 570, 265, 392, 265, 460, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 265, 265, 570, 570, 570, 389, 793, 635, 646, 684, 779, 606, 580, 734, 798, 349, 350, 658, 568, 944, 780, 762, 600, 762, 644, 541, 621, 791, 634, 940, 624, 588, 610, 330, 460, 330, 570, 500, 278, 523, 598, 496, 598, 514, 319, 520, 607, 291, 280, 524, 279, 923, 619, 577, 608, 591, 389, 436, 344, 606, 504, 768, 486, 506, 480, 340, 228, 340, 570, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 242, 530, 530, 150, 530, 530, 554, 530, 278, 458, 442, 257, 257, 610, 610, 500, 500, 504, 488, 265, 500, 555, 409, 278, 458, 458, 442, 1000, 1208, 500, 389, 500, 400, 400, 400, 400, 400, 400, 400, 400, 500, 400, 400, 500, 400, 400, 400, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 876, 500, 390, 500, 500, 500, 500, 574, 762, 1025, 398, 500, 500, 500, 500, 500, 797, 500, 500, 500, 291, 500, 500, 294, 577, 882, 601, )
diff --git a/bin/pychart/afm/ZapfChancery_MediumItalic.py b/bin/pychart/afm/ZapfChancery_MediumItalic.py
deleted file mode 100644
index 00e0e93f809..00000000000
--- a/bin/pychart/afm/ZapfChancery_MediumItalic.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# AFM font ZapfChancery-MediumItalic (path: /usr/share/fonts/afms/adobe/pzcmi8a.afm).
-# Derived from Ghostscript distribution.
-# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
-import dir
-dir.afm["ZapfChancery-MediumItalic"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 220, 280, 220, 440, 440, 680, 780, 240, 260, 220, 420, 520, 220, 280, 220, 340, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 260, 240, 520, 520, 520, 380, 700, 620, 600, 520, 700, 620, 580, 620, 680, 380, 400, 660, 580, 840, 700, 600, 540, 600, 600, 460, 500, 740, 640, 880, 560, 560, 620, 240, 480, 320, 520, 500, 240, 420, 420, 340, 440, 340, 320, 400, 440, 240, 220, 440, 240, 620, 460, 400, 440, 400, 300, 320, 320, 460, 440, 680, 420, 400, 440, 240, 520, 240, 520, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 280, 440, 440, 60, 440, 440, 420, 440, 160, 340, 340, 240, 260, 520, 520, 500, 500, 460, 480, 220, 500, 500, 600, 180, 280, 360, 380, 1000, 960, 500, 400, 500, 220, 300, 340, 440, 440, 440, 220, 360, 500, 300, 300, 500, 400, 280, 340, 1000, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 740, 500, 260, 500, 500, 500, 500, 580, 660, 820, 260, 500, 500, 500, 500, 500, 540, 500, 500, 500, 240, 500, 500, 300, 440, 560, 420, )
diff --git a/bin/pychart/afm/ZapfDingbats.py b/bin/pychart/afm/ZapfDingbats.py
deleted file mode 100644
index d93cdda3893..00000000000
--- a/bin/pychart/afm/ZapfDingbats.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# AFM font ZapfDingbats (path: /usr/share/fonts/afms/adobe/pzdr.afm).
-# Derived from Ghostscript distribution.
-# Go to www.cs.wisc.edu/~ghost to get the Ghostcript source code.
-import dir
-dir.afm["ZapfDingbats"] = (500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 278, 974, 961, 974, 980, 719, 789, 790, 791, 690, 960, 939, 549, 855, 911, 933, 911, 945, 974, 755, 846, 762, 761, 571, 677, 763, 760, 759, 754, 494, 552, 537, 577, 692, 786, 788, 788, 790, 793, 794, 816, 823, 789, 841, 823, 833, 816, 831, 923, 744, 723, 749, 790, 792, 695, 776, 768, 792, 759, 707, 708, 682, 701, 826, 815, 789, 789, 707, 687, 696, 689, 786, 787, 713, 791, 785, 791, 873, 761, 762, 762, 759, 759, 892, 892, 788, 784, 438, 138, 277, 415, 392, 392, 668, 668, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 732, 544, 544, 910, 667, 760, 760, 776, 595, 694, 626, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 788, 894, 838, 1016, 458, 748, 924, 748, 918, 927, 928, 928, 834, 873, 828, 924, 924, 917, 930, 931, 463, 883, 836, 836, 867, 867, 696, 696, 874, 500, 874, 760, 946, 771, 865, 771, 888, 967, 888, 831, 873, 927, 970, 918, )
diff --git a/bin/pychart/afm/__init__.py b/bin/pychart/afm/__init__.py
deleted file mode 100644
index 93cb9f953e7..00000000000
--- a/bin/pychart/afm/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-__all__ = ["Courier_Oblique", "AvantGarde_BookOblique", "Times_Italic", "Helvetica_Bold", "NewCenturySchlbk_Roman", "Helvetica", "Helvetica_Narrow", "AvantGarde_Demi", "Times_BoldItalic", "Helvetica_Narrow_Bold", "Helvetica_Light", "Bookman_DemiItalic", "Utopia_Regular", "Times_Roman", "Palatino_Italic", "Courier_Bold", "ZapfChancery_MediumItalic", "NewCenturySchlbk_Italic", "NewCenturySchlbk_BoldItalic", "Helvetica_Narrow_BoldOblique", "Courier", "AvantGarde_DemiOblique", "Courier_BoldOblique", "Bookman_LightItalic", "Symbol", "Utopia_Bold", "Times_Bold", "Helvetica_BoldOblique", "Utopia_BoldItalic", "AvantGarde_Book", "Bookman_Demi", "Palatino_Roman", "Bookman_Light", "Utopia_Italic", "NewCenturySchlbk_Bold", "Helvetica_LightOblique", "ZapfDingbats", "Helvetica_Narrow_Oblique", "Helvetica_Oblique", "Palatino_BoldItalic", "Palatino_Bold", "dir"]
diff --git a/bin/pychart/afm/dir.py b/bin/pychart/afm/dir.py
deleted file mode 100644
index a978c1b85b7..00000000000
--- a/bin/pychart/afm/dir.py
+++ /dev/null
@@ -1,2 +0,0 @@
-afm = {}
-
diff --git a/bin/pychart/area.py b/bin/pychart/area.py
deleted file mode 100644
index a0e76876ec0..00000000000
--- a/bin/pychart/area.py
+++ /dev/null
@@ -1,249 +0,0 @@
-#
-# Copyright (C) 2000-2005 by Yasushi Saito (yasushi.saito@gmail.com)
-#
-# Jockey is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2, or (at your option) any
-# later version.
-#
-# Jockey is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# for more details.
-#
-import coord
-import line_style
-import legend
-import axis
-import pychart_util
-import chart_object
-import fill_style
-import canvas
-import area_doc
-import linear_coord
-import category_coord
-import theme
-from pychart_types import *
-from types import *
-
-_dummy_legend = legend.T()
-
-def range_doc(t):
- u = t.upper()
-
- return """Specifies the range of %s values that are displayed in the
- chart. IF the value is None, both the values are computed
- automatically from the samples. Otherwise, the value must be a
- tuple of format (MIN, MAX). MIN and MAX must be either None or a
- number. If None, the value is computed automatically from the
- samples. For example, if %s_range = (None,5), then the minimum %s
- value is computed automatically, but the maximum %s value is fixed
- at 5.""" % (u, t, u, u)
-
-_keys = {
- "loc" : (CoordType, (0,0),
- """The location of the bottom-left corner of the chart.
-@cindex chart location
-@cindex location, chart
-"""),
- "size" : (CoordType, (120,110),
- """The size of the chart-drawing area, excluding axis labels,
- legends, tick marks, etc.
-@cindex chart size
-@cindex size, chart
- """),
- "bg_style": (fill_style.T, None, "Background fill-pattern."),
- "border_line_style": (line_style.T, None, "Line style of the outer frame of the chart."),
- "x_coord":
- (coord.T, linear_coord.T(),
- """Set the X coordinate system.""",
- """A linear coordinate system."""),
- "y_coord": (coord.T, linear_coord.T(),
- "Set the Y coordinate system.",
- """A linear coordinate system."""),
- "x_range": (CoordType, None, range_doc("x")),
- "y_range": (CoordType, None, range_doc("y")),
- "x_axis": (axis.X, None, "The X axis. <>."),
- "x_axis2": (axis.X, None, """The second X axis. This axis should be non-None either when you want to display plots with two distinct domains or when
- you just want to display two axes at the top and bottom of the chart.
- <>"""),
- "y_axis": (axis.Y, None, "The Y axis. <>."),
- "y_axis2": (axis.Y, None,
- """The second Y axis. This axis should be non-None either when you want to display plots with two distinct ranges or when
- you just want to display two axes at the left and right of the chart. <>"""),
- "x_grid_style" : (line_style.T, None,
- """The style of horizontal grid lines.
-@cindex grid lines"""),
- "y_grid_style" : (line_style.T, line_style.gray70_dash3,
- "The style of vertical grid lines."),
- "x_grid_interval": (IntervalType, None,
- """The horizontal grid-line interval.
- A numeric value
- specifies the interval at which
- lines are drawn. If value is a function, it
- takes two arguments, (MIN, MAX), that tells
- the minimum and maximum values found in the
- sample data. The function should return a list
- of values at which lines are drawn."""),
- "y_grid_interval": (IntervalType, None,
- "The vertical grid-line interval. See also x_grid_interval"),
- "x_grid_over_plot": (IntType, False,
- "If True, grid lines are drawn over plots. Otherwise, plots are drawn over grid lines."),
- "y_grid_over_plot": (IntType, False, "See x_grid_over_plot."),
- "plots": (ListType, pychart_util.new_list,
- """Used only internally by pychart."""),
- "legend": (legend.T, _dummy_legend, "The legend of the chart.",
- """a legend is by default displayed
- in the right-center of the chart."""),
- }
-
-
-class T(chart_object.T):
- keys = _keys
- __doc__ = area_doc.doc
-##AUTOMATICALLY GENERATED
-
-##END AUTOMATICALLY GENERATED
- def x_pos(self, xval):
- "Return the x position (on the canvas) corresponding to XVAL."
- off = self.x_coord.get_canvas_pos(self.size[0], xval,
- self.x_range[0], self.x_range[1])
- return self.loc[0] + off
-
- def y_pos(self, yval):
- "Return the y position (on the canvas) corresponding to YVAL."
- off = self.y_coord.get_canvas_pos(self.size[1], yval,
- self.y_range[0], self.y_range[1])
- return self.loc[1] + off
-
- def x_tic_points(self, interval):
- "Return the list of X values for which tick marks and grid lines are drawn."
- if type(interval) == FunctionType:
- return apply(interval, self.x_range)
-
- return self.x_coord.get_tics(self.x_range[0], self.x_range[1], interval)
- def y_tic_points(self, interval):
- "Return the list of Y values for which tick marks and grid lines are drawn."
- if type(interval) == FunctionType:
- return apply(interval, self.y_range)
-
- return self.y_coord.get_tics(self.y_range[0], self.y_range[1], interval)
- def __draw_x_grid_and_axis(self, can):
- if self.x_grid_style:
- for i in self.x_tic_points(self.x_grid_interval):
- x = self.x_pos(i)
- if x > self.loc[0]:
- can.line(self.x_grid_style,
- x, self.loc[1], x, self.loc[1]+self.size[1])
- if self.x_axis:
- self.x_axis.draw(self, can)
- if self.x_axis2:
- self.x_axis2.draw(self, can)
- def __draw_y_grid_and_axis(self, can):
- if self.y_grid_style:
- for i in self.y_tic_points(self.y_grid_interval):
- y = self.y_pos(i)
- if y > self.loc[1]:
- can.line(self.y_grid_style,
- self.loc[0], y,
- self.loc[0]+self.size[0], y)
- if self.y_axis:
- self.y_axis.draw(self, can)
- if self.y_axis2:
- self.y_axis2.draw(self, can)
-
- def __get_data_range(self, r, which, coord, interval):
- if isinstance(coord, category_coord.T):
- # This info is unused for the category coord type.
- # So I just return a random value.
- return ((0,0), 1)
-
- r = r or (None, None)
-
- if len(self.plots) == 0:
- raise ValueError, "No chart to draw, and no data range specified.\n";
- dmin, dmax = 999999, -999999
-
- for plot in self.plots:
- this_min, this_max = plot.get_data_range(which)
- dmin = min(this_min, dmin)
- dmax = max(this_max, dmax)
-
- if interval and type(interval) == FunctionType:
- tics = apply(interval, (dmin, dmax))
- dmin = tics[0]
- dmax = tics[len(tics)-1]
- else:
- dmin, dmax, interval = coord.get_min_max(dmin, dmax, interval)
-
- if r[0] != None:
- dmin = r[0]
- if r[1] != None:
- dmax = r[1]
- return ((dmin, dmax), interval)
- def draw(self, can = None):
- "Draw the charts."
-
- if can == None:
- can = canvas.default_canvas()
-
- self.type_check()
- for plot in self.plots:
- plot.check_integrity()
-
- self.x_range, self.x_grid_interval = \
- self.__get_data_range(self.x_range, 'X',
- self.x_coord,
- self.x_grid_interval)
-
- self.y_range, self.y_grid_interval = \
- self.__get_data_range(self.y_range, 'Y',
- self.y_coord,
- self.y_grid_interval)
-
- can.rectangle(self.border_line_style, self.bg_style,
- self.loc[0], self.loc[1],
- self.loc[0] + self.size[0], self.loc[1] + self.size[1])
-
- if not self.x_grid_over_plot:
- self.__draw_x_grid_and_axis(can)
-
- if not self.y_grid_over_plot:
- self.__draw_y_grid_and_axis(can)
-
- clipbox = theme.adjust_bounding_box([self.loc[0], self.loc[1],
- self.loc[0] + self.size[0],
- self.loc[1] + self.size[1]])
-
- can.clip(clipbox[0], clipbox[1],
- clipbox[2], clipbox[3])
-
- for plot in self.plots:
- plot.draw(self, can)
-
- can.endclip()
-
- if self.x_grid_over_plot:
- self.__draw_x_grid_and_axis(can)
- if self.y_grid_over_plot:
- self.__draw_y_grid_and_axis(can)
-
- if self.legend == _dummy_legend:
- self.legend = legend.T()
-
- if self.legend:
- legends = []
- for plot in self.plots:
- entry = plot.get_legend_entry()
- if entry == None:
- pass
- elif type(entry) != ListType:
- legends.append(entry)
- else:
- for e in entry:
- legends.append(e)
- self.legend.draw(self, legends, can)
-
- def add_plot(self, *plots):
- "Add PLOTS... to the area."
- self.plots.extend(plots)
diff --git a/bin/pychart/area_doc.py b/bin/pychart/area_doc.py
deleted file mode 100644
index 63f8f6ae430..00000000000
--- a/bin/pychart/area_doc.py
+++ /dev/null
@@ -1,63 +0,0 @@
-# automatically generated by generate_docs.py.
-doc="""Attributes supported by this class are:
-plots(type:list) default="Used only internally by pychart.".
-loc(type:(x,y)) default="The location of the bottom-left corner of the chart.
-@cindex chart location
-@cindex location, chart
-".
-y_grid_style(type:line_style.T) default="The style of vertical grid lines.".
-y_grid_interval(type:Number or function) default="The vertical grid-line interval. See also x_grid_interval".
-x_grid_over_plot(type:int) default="If True, grid lines are drawn over plots. Otherwise, plots are drawn over grid lines.".
-x_range(type:(x,y)) default="Specifies the range of X values that are displayed in the
- chart. IF the value is None, both the values are computed
- automatically from the samples. Otherwise, the value must be a
- tuple of format (MIN, MAX). MIN and MAX must be either None or a
- number. If None, the value is computed automatically from the
- samples. For example, if x_range = (None,5), then the minimum X
- value is computed automatically, but the maximum X value is fixed
- at 5.".
-y_coord(type:coord.T) default="Set the Y coordinate system.".
- A linear coordinate system.
-
-y_range(type:(x,y)) default="Specifies the range of Y values that are displayed in the
- chart. IF the value is None, both the values are computed
- automatically from the samples. Otherwise, the value must be a
- tuple of format (MIN, MAX). MIN and MAX must be either None or a
- number. If None, the value is computed automatically from the
- samples. For example, if y_range = (None,5), then the minimum Y
- value is computed automatically, but the maximum Y value is fixed
- at 5.".
-x_axis(type:axis.X) default="The X axis. <>.".
-bg_style(type:fill_style.T) default="Background fill-pattern.".
-x_coord(type:coord.T) default="Set the X coordinate system.".
- A linear coordinate system.
-
-legend(type:legend.T) default="The legend of the chart.".
- a legend is by default displayed in the right-center of the
- chart.
-
-y_grid_over_plot(type:int) default="See x_grid_over_plot.".
-x_axis2(type:axis.X) default="The second X axis. This axis should be non-None either when you want to display plots with two distinct domains or when
- you just want to display two axes at the top and bottom of the chart.
- <>".
-y_axis2(type:axis.Y) default="The second Y axis. This axis should be non-None either when you want to display plots with two distinct ranges or when
- you just want to display two axes at the left and right of the chart. <>".
-x_grid_style(type:line_style.T) default="The style of horizontal grid lines.
-@cindex grid lines".
-y_axis(type:axis.Y) default="The Y axis. <>.".
-border_line_style(type:line_style.T) default="Line style of the outer frame of the chart.".
-x_grid_interval(type:Number or function) default="The horizontal grid-line interval.
- A numeric value
- specifies the interval at which
- lines are drawn. If value is a function, it
- takes two arguments, (MIN, MAX), that tells
- the minimum and maximum values found in the
- sample data. The function should return a list
- of values at which lines are drawn.".
-size(type:(x,y)) default="The size of the chart-drawing area, excluding axis labels,
- legends, tick marks, etc.
-@cindex chart size
-@cindex size, chart
- ".
-"""
-
diff --git a/bin/pychart/arrow.py b/bin/pychart/arrow.py
deleted file mode 100644
index e0b931fb8a2..00000000000
--- a/bin/pychart/arrow.py
+++ /dev/null
@@ -1,184 +0,0 @@
-#
-# Copyright (C) 2000-2005 by Yasushi Saito (yasushi.saito@gmail.com)
-#
-# Jockey is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2, or (at your option) any
-# later version.
-#
-# Jockey is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# for more details.
-#
-import line_style
-import color
-import chart_object
-import object_set
-import math
-import arrow_doc
-import canvas
-
-from pychart_types import *
-from types import *
-from scaling import *
-
-__doc__ = """
-Arrow is an optional component of a chart that draws line segments with
-an arrowhead. To draw an arrow, one creates an arrow.T object, and calls
-its "draw" method usually after area.draw() is called (otherwise, area.draw()
-may overwrite the arrow). For example, the below code draws an arrow
-from (10,10) to (20,30).
-
-ar = area.T(...)
-a = arrow.T(head_style = 1)
-ar.draw()
-a.draw([(10,10), (20,30)])
-"""
-
-def draw_arrowhead(can, tailx, taily, tipx, tipy, thickness, head_len, style):
- can.comment("ARROWHEAD tail=(%d,%d) tip=(%d,%d)\n"
- % (tailx, taily, tipx, tipy))
-
- halfthickness = thickness/2.0
- dx = tipx - tailx
- dy = tipy - taily
- arrow_len = math.sqrt(dx*dx + dy*dy)
- angle = math.atan2(dy, dx) * 360 / (2*math.pi)
- base = arrow_len - head_len
- can.push_transformation((tailx, taily), None, angle)
-
- can.newpath()
- if style == 0:
- can.moveto(base, - halfthickness)
- can.lineto(base, halfthickness)
- can.lineto(arrow_len, 0)
- can.closepath()
- elif style == 1:
- depth = head_len / 2.5
- can.moveto(base - depth, -halfthickness)
- can.lineto(base, 0)
- can.lineto(base - depth, halfthickness)
- can.lineto(arrow_len, 0)
- can.closepath()
- elif style == 2:
- can.moveto(base + head_len/2.0, 0)
- can.path_arc(base + head_len / 2.0, 0, head_len / 2.0, 1.0, 0, 400)
- elif style == 3:
- can.moveto(base, 0)
- can.lineto(base + head_len/2.0, -halfthickness)
- can.lineto(arrow_len, 0)
- can.lineto(base + head_len/2.0, halfthickness)
- can.closepath()
- else:
- raise Exception, "Arrow style must be a number between 0 and 3."
- can.fill()
- can.pop_transformation()
- can.comment("end ARROWHEAD.\n")
-
-def draw_arrowbody(can, tailx, taily, tipx, tipy, head_len):
- dx = tipx - tailx
- dy = tipy - taily
- arrow_len = math.sqrt(dx*dx + dy*dy)
- angle = math.atan2(dy, dx) * 360 / (2*math.pi)
- base = arrow_len - head_len
- can.push_transformation((tailx, taily), None, angle)
- can.moveto(0, 0)
- can.lineto(base+head_len*0.1, 0)
- can.stroke()
- can.pop_transformation()
-
-
-class T(chart_object.T):
- __doc__ = arrow_doc.doc
- keys = {
- "thickness" : (UnitType, 4,
- "The width of the arrow head."),
- "head_len": (UnitType, 8,
- "The length of the arrow head."),
- "head_color": (color.T, color.default,
- "The color of the arrow head."),
- "line_style": (line_style.T, line_style.default,
- "Line style."),
- "head_style": (IntType, 1,
- "The value of 0 draws a triangular arrow head. The value of 1 draws a swallow-tail arrow head. The value of 2 draws a circular head. The value of 3 draws a diamond-shaped head.")
- }
-##AUTOMATICALLY GENERATED
-
-##END AUTOMATICALLY GENERATED
- def draw(self, points, can = None):
- """Parameter specifies the
- list of points the arrow traverses through.
- It should contain at least two points, i.e.,
- the tail and tip. Parameter
- is an optional parameter that specifies the output.
- <>
- """
- if can == None: can = canvas.default_canvas()
- self.type_check()
- xtip = points[-1][0]
- ytip = points[-1][1]
-
- xtail = points[-2][0]
- ytail = points[-2][1]
-
- can.newpath()
- can.set_line_style(self.line_style)
- if len(points) > 2:
- can.moveto(points[0][0], points[0][1])
- for i in range(1, len(points)-1):
- can.lineto(points[i][0], points[i][1])
-
- draw_arrowbody(can, xscale(xtail), yscale(ytail),
- yscale(xtip), yscale(ytip),
- nscale(self.head_len))
-
- can.set_fill_color(self.head_color)
- draw_arrowhead(can, xscale(xtail), yscale(ytail),
- xscale(xtip), yscale(ytip),
- nscale(self.thickness),
- nscale(self.head_len),
- self.head_style)
-
- can.setbb(xtail, ytail)
- can.setbb(xtip, ytip)
-
-standards = object_set.T()
-def _intern(a):
- global standards
- standards.add(a)
- return a
-
-a0 = _intern(T(head_style=0))
-a1 = _intern(T(head_style=1))
-a2 = _intern(T(head_style=2))
-a3 = _intern(T(head_style=3))
-gray0 = _intern(T(head_style=0, head_color = color.gray50,
- line_style=line_style.T(color=color.gray50)))
-gray1 = _intern(T(head_style=1, head_color = color.gray50,
- line_style=line_style.T(color=color.gray50)))
-gray2 = _intern(T(head_style=2, head_color = color.gray50,
- line_style=line_style.T(color=color.gray50)))
-gray3 = _intern(T(head_style=3, head_color = color.gray50,
- line_style=line_style.T(color=color.gray50)))
-
-fat0 = _intern(T(head_style=0, head_len=12, thickness=10, line_style=line_style.T(width=2)))
-fat1 = _intern(T(head_style=1, head_len=12, thickness=10, line_style=line_style.T(width=2)))
-fat2 = _intern(T(head_style=2, head_len=12, thickness=10, line_style=line_style.T(width=2)))
-fat3 = _intern(T(head_style=3, head_len=12, thickness=10, line_style=line_style.T(width=2)))
-fatgray0 = _intern(T(head_style=0, head_len=12, thickness=10,
- head_color = color.gray50,
- line_style=line_style.T(width=2, color=color.gray50)))
-fatgray1 = _intern(T(head_style=1, head_len=12, thickness=10,
- head_color = color.gray50,
- line_style=line_style.T(width=2, color=color.gray50)))
-fatgray2 = _intern(T(head_style=2, head_len=12, thickness=10,
- head_color = color.gray50,
- line_style=line_style.T(width=2, color=color.gray50)))
-fatgray3 = _intern(T(head_style=3, head_len=12, thickness=10,
- head_color = color.gray50,
- line_style=line_style.T(width=2, color=color.gray50)))
-
-default = a1
-
-
diff --git a/bin/pychart/arrow_doc.py b/bin/pychart/arrow_doc.py
deleted file mode 100644
index f76958d9864..00000000000
--- a/bin/pychart/arrow_doc.py
+++ /dev/null
@@ -1,9 +0,0 @@
-# automatically generated by generate_docs.py.
-doc="""Attributes supported by this class are:
-head_color(type:color.T) default="The color of the arrow head.".
-head_style(type:int) default="The value of 0 draws a triangular arrow head. The value of 1 draws a swallow-tail arrow head. The value of 2 draws a circular head. The value of 3 draws a diamond-shaped head.".
-head_len(type:length in points (\\xref{unit})) default="The length of the arrow head.".
-line_style(type:line_style.T) default="Line style.".
-thickness(type:length in points (\\xref{unit})) default="The width of the arrow head.".
-"""
-
diff --git a/bin/pychart/axis.py b/bin/pychart/axis.py
deleted file mode 100644
index 64d3fd2409d..00000000000
--- a/bin/pychart/axis.py
+++ /dev/null
@@ -1,241 +0,0 @@
-#
-# Copyright (C) 2000-2005 by Yasushi Saito (yasushi.saito@gmail.com)
-#
-# Jockey is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2, or (at your option) any
-# later version.
-#
-# Jockey is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# for more details.
-#
-import font
-import pychart_util
-import chart_object
-import line_style
-import math
-import theme
-import axis_doc
-from pychart_types import *
-from types import *
-
-class T(chart_object.T):
- keys = {
- "tic_interval" : (IntervalType, None,
- pychart_util.interval_desc("tick marks")),
- "tic_len" : (UnitType, 6, """The length of tick lines. The value can be negative, in which case the tick lines are drawn right of (or above) the axis."""),
- "minor_tic_interval" : (IntervalType, None,
- pychart_util.interval_desc("minor tick marks")),
- "minor_tic_len" : (UnitType, 3, """The length of minor tick marks. The value can be negative, in which case the tick lines are drawn right of (or above) the axis."""),
- "line_style": (line_style.T, line_style.default,
- "Specifies the style of axis and tick lines."),
- "label": (types.StringType, "axis label",
- "The descriptive string displayed below (or to the left of) the axis. <>."),
- "format": (FormatType, "%s",
- """The format string for tick labels.
- It can be a `printf' style format string, or
- a single-parameter function that takes an X (or Y) value
- and returns a string. """ +
- pychart_util.string_desc),
- "label_offset": (CoordOrNoneType, (None,None),
- """The location for drawing the axis label,
- relative to the middle point of the axis.
- If the value is None, the label is displayed
- below (or to the left of) of axis at the middle."""),
- "tic_label_offset": (CoordType, (0,0),
- """The location for drawing tick labels,
- relative to the tip of the tick line."""),
- "offset": (UnitType, 0,
- """The location of the axis.
- The value of 0 draws the
- axis at the left (for the Y axis) or bottom (for the X axis)
- edge of the drawing area.
- """)
- }
-
-class X(T):
- keys = pychart_util.union_dict(T.keys,
- {"draw_tics_above": (IntType, 0,
- "If true, tick lines and labels are drawn above the axis line.")})
- __doc__ = axis_doc.doc_x
-##AUTOMATICALLY GENERATED
-
-##END AUTOMATICALLY GENERATED
- def draw_below(self, ar, can):
- self.type_check()
- self.tic_interval = self.tic_interval or ar.x_grid_interval
- y_base = ar.loc[1] + self.offset
-
- can.line(self.line_style, ar.loc[0], y_base,
- ar.loc[0]+ ar.size[0], y_base)
-
- tic_dic = {}
- max_tic_height = 0
-
- for i in ar.x_tic_points(self.tic_interval):
- tic_dic[i] = 1
- ticx = ar.x_pos(i)
-
- str = "/hC" + pychart_util.apply_format(self.format, (i, ), 0)
-
- (total_height, base_height) = font.text_height(str)
- max_tic_height = max(max_tic_height, total_height)
-
- can.line(self.line_style, ticx, y_base, ticx, y_base-self.tic_len)
- can.show(ticx+self.tic_label_offset[0],
- y_base-self.tic_len-base_height+self.tic_label_offset[1],
- str)
-
- if self.minor_tic_interval:
- for i in ar.x_tic_points(self.minor_tic_interval):
- if tic_dic.has_key(i):
- # a major tic was drawn already.
- pass
- else:
- ticx = ar.x_pos(i)
- can.line(self.line_style, ticx, y_base, ticx,
- y_base-self.minor_tic_len)
-
- self.draw_label(ar, can, y_base - self.tic_len - max_tic_height - 10)
-
- def draw_above(self, ar, can):
- y_base = ar.loc[1] + self.offset
-
- tic_dic = {}
- max_tic_height = 0
-
- for i in ar.x_tic_points(self.tic_interval):
- tic_dic[i] = 1
- ticx = ar.x_pos(i)
-
- str = "/hC" + pychart_util.apply_format(self.format, (i, ), 0)
-
- (total_height, base_height) = font.text_height(str)
- max_tic_height = max(max_tic_height, total_height)
-
- can.line(self.line_style, ticx, y_base, ticx, y_base + self.tic_len)
- can.show(ticx+self.tic_label_offset[0],
- y_base + self.tic_len + base_height + self.tic_label_offset[1],
- str)
-
- if self.minor_tic_interval:
- for i in ar.x_tic_points(self.minor_tic_interval):
- if tic_dic.has_key(i):
- # a major tic was drawn already.
- pass
- else:
- ticx = ar.x_pos(i)
- can.line(self.line_style, ticx, y_base, ticx,
- y_base + self.minor_tic_len)
- self.draw_label(ar, can, y_base + self.tic_len + max_tic_height + 10)
-
- def draw_label(self, ar, can, ylabel):
- if self.label == None: return
-
- str = "/hC/vM" + self.label
- (label_height, base_height) = font.text_height(str)
- xlabel = ar.loc[0] + ar.size[0]/2.0
- if self.label_offset[0] != None:
- xlabel += self.label_offset[0]
- if self.label_offset[1] != None:
- ylabel += self.label_offset[1]
- can.show(xlabel, ylabel, str)
-
- def draw(self, ar, can):
- self.type_check()
- self.tic_interval = self.tic_interval or ar.x_grid_interval
- y_base = ar.loc[1] + self.offset
- can.line(self.line_style, ar.loc[0], y_base,
- ar.loc[0]+ ar.size[0], y_base)
- if self.draw_tics_above:
- self.draw_above(ar, can)
- else:
- self.draw_below(ar, can)
-class Y(T):
- __doc__ = axis_doc.doc_y
- keys = pychart_util.union_dict(T.keys,
- {"draw_tics_right": (IntType, 0,
- "If true, tick lines and labels are drawn right of the axis line.")})
-
- def draw_left(self, ar, can):
- x_base = ar.loc[0] + self.offset
- xmin = 999999
- tic_dic = {}
- for i in ar.y_tic_points(self.tic_interval):
- y_tic = ar.y_pos(i)
- tic_dic[i] = 1
- can.line(self.line_style, x_base, y_tic,
- x_base - self.tic_len, y_tic)
- str = pychart_util.apply_format(self.format, (i,), 0)
- if self.tic_len > 0: str = "/hR" + str
-
- tic_height, base_height = font.text_height(str)
- x = x_base - self.tic_len + self.tic_label_offset[0]
- can.show(x, y_tic - tic_height/2.0 + self.tic_label_offset[1],
- str)
- xmin = min(xmin, x - font.text_width(str))
-
- if self.minor_tic_interval:
- for i in ar.y_tic_points(self.minor_tic_interval):
- if tic_dic.has_key(i):
- # a major tic line was drawn already.
- pass
- else:
- y_tic = ar.y_pos(i)
- can.line(self.line_style, x_base, y_tic,
- x_base - self.minor_tic_len, y_tic)
-
- self.draw_label(ar, can, xmin - theme.default_font_size/2.0)
-
- def draw_right(self, ar, can):
- x_base = ar.loc[0] + self.offset
- xmax = 0
- tic_dic = {}
- for i in ar.y_tic_points(self.tic_interval):
- y_tic = ar.y_pos(i)
- tic_dic[i] = 1
- can.line(self.line_style, x_base, y_tic,
- x_base + self.tic_len, y_tic)
- str = pychart_util.apply_format(self.format, (i,), 0)
- if self.tic_len > 0: str = "/hL" + str
-
- tic_height, base_height = font.text_height(str)
- x = x_base + self.tic_len + self.tic_label_offset[0]
- can.show(x, y_tic - tic_height/2.0 + self.tic_label_offset[1],
- str)
- xmax = max(xmax, x + font.text_width(str))
-
- if self.minor_tic_interval:
- for i in ar.y_tic_points(self.minor_tic_interval):
- if tic_dic.has_key(i):
- # a major tic line was drawn already.
- pass
- else:
- y_tic = ar.y_pos(i)
- can.line(self.line_style, x_base, y_tic,
- x_base + self.minor_tic_len, y_tic)
-
- self.draw_label(ar, can, xmax + theme.default_font_size)
-
- def draw_label(self, ar, can, xlabel):
- if self.label == None:
- return
- ylabel = ar.loc[1] + ar.size[1] / 2
- if self.label_offset[0] != None:
- xlabel += self.label_offset[0]
- if self.label_offset[1] != None:
- ylabel += self.label_offset[1]
- can.show(xlabel, ylabel, "/a90/hC" + self.label)
-
- def draw(self, ar, can):
- self.type_check()
- self.tic_interval = self.tic_interval or ar.y_grid_interval
-
- x_base = ar.loc[0] + self.offset
- can.line(self.line_style, x_base, ar.loc[1], x_base, ar.loc[1]+ar.size[1])
- if self.draw_tics_right:
- self.draw_right(ar, can)
- else:
- self.draw_left(ar, can)
diff --git a/bin/pychart/axis_doc.py b/bin/pychart/axis_doc.py
deleted file mode 100644
index 48184d405a5..00000000000
--- a/bin/pychart/axis_doc.py
+++ /dev/null
@@ -1,53 +0,0 @@
-# automatically generated by generate_docs.py.
-doc_x="""Attributes supported by this class are:
-draw_tics_above(type:int) default="If true, tick lines and labels are drawn above the axis line.".
-minor_tic_len(type:length in points (\\xref{unit})) default="The length of minor tick marks. The value can be negative, in which case the tick lines are drawn right of (or above) the axis.".
-tic_label_offset(type:(x,y)) default="The location for drawing tick labels,
- relative to the tip of the tick line.".
-format(type:printf format string) default="The format string for tick labels.
- It can be a `printf' style format string, or
- a single-parameter function that takes an X (or Y) value
- and returns a string. The appearance of the string produced here can be
-controlled using escape sequences. <>".
-label_offset(type:(x,y) or None) default="The location for drawing the axis label,
- relative to the middle point of the axis.
- If the value is None, the label is displayed
- below (or to the left of) of axis at the middle.".
-label(type:str) default="The descriptive string displayed below (or to the left of) the axis. <>.".
-offset(type:length in points (\\xref{unit})) default="The location of the axis.
- The value of 0 draws the
- axis at the left (for the Y axis) or bottom (for the X axis)
- edge of the drawing area.
- ".
-tic_interval(type:Number or function) default="When the value is a number, it specifies the interval at which tick marks are drawn. Otherwise, the value must be a function that takes no argument and returns the list of numbers. The return value specifies the X or Y points at which tick marks are drawn.".
-line_style(type:line_style.T) default="Specifies the style of axis and tick lines.".
-tic_len(type:length in points (\\xref{unit})) default="The length of tick lines. The value can be negative, in which case the tick lines are drawn right of (or above) the axis.".
-minor_tic_interval(type:Number or function) default="When the value is a number, it specifies the interval at which minor tick marks are drawn. Otherwise, the value must be a function that takes no argument and returns the list of numbers. The return value specifies the X or Y points at which minor tick marks are drawn.".
-"""
-
-doc_y="""Attributes supported by this class are:
-draw_tics_right(type:int) default="If true, tick lines and labels are drawn right of the axis line.".
-minor_tic_len(type:length in points (\\xref{unit})) default="The length of minor tick marks. The value can be negative, in which case the tick lines are drawn right of (or above) the axis.".
-tic_label_offset(type:(x,y)) default="The location for drawing tick labels,
- relative to the tip of the tick line.".
-format(type:printf format string) default="The format string for tick labels.
- It can be a `printf' style format string, or
- a single-parameter function that takes an X (or Y) value
- and returns a string. The appearance of the string produced here can be
-controlled using escape sequences. <>".
-label_offset(type:(x,y) or None) default="The location for drawing the axis label,
- relative to the middle point of the axis.
- If the value is None, the label is displayed
- below (or to the left of) of axis at the middle.".
-label(type:str) default="The descriptive string displayed below (or to the left of) the axis. <>.".
-offset(type:length in points (\\xref{unit})) default="The location of the axis.
- The value of 0 draws the
- axis at the left (for the Y axis) or bottom (for the X axis)
- edge of the drawing area.
- ".
-tic_interval(type:Number or function) default="When the value is a number, it specifies the interval at which tick marks are drawn. Otherwise, the value must be a function that takes no argument and returns the list of numbers. The return value specifies the X or Y points at which tick marks are drawn.".
-line_style(type:line_style.T) default="Specifies the style of axis and tick lines.".
-tic_len(type:length in points (\\xref{unit})) default="The length of tick lines. The value can be negative, in which case the tick lines are drawn right of (or above) the axis.".
-minor_tic_interval(type:Number or function) default="When the value is a number, it specifies the interval at which minor tick marks are drawn. Otherwise, the value must be a function that takes no argument and returns the list of numbers. The return value specifies the X or Y points at which minor tick marks are drawn.".
-"""
-
diff --git a/bin/pychart/axis_x_doc.py b/bin/pychart/axis_x_doc.py
deleted file mode 100644
index 899b2b0b1de..00000000000
--- a/bin/pychart/axis_x_doc.py
+++ /dev/null
@@ -1,65 +0,0 @@
-#
-# Copyright (C) 2000-2005 by Yasushi Saito (yasushi.saito@gmail.com)
-#
-# Jockey is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2, or (at your option) any
-# later version.
-#
-# Jockey is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# for more details.
-#
-doc="""Attributes supported by this class are:
-tic_label_offset(type:(x,y)):
- The location where the tick labels is drawn. Relative to the
- tip of the tick mark.
- default value=(0, 0).
-format(type:printf format string):
- The format string for tick labels. It can be a `printf' style
- format string, or a single-parameter function that returns a
- string. See also font.
- default value=%s.
-minor_tic_len(type:number):
- The length of minor tick marks.
- default value=3.
-label_offset(type:(x,y) or None):
- The location where the axis label is drawn. Relative to the
- left-bottom corner of the axis.
- default value=(None, None).
-grid_interval(type:Number or function):
- When the value is a number, it specifies the interval with which
- grid lines are drawn. Otherwise, the value must be a function.
- It must take no argument and return the list of numbers, which
- specifies the X or Y points where grid lines are drawn.
- default value=None.
-label(type:str):
- The description of the axis. See also font.
- default value=axis label.
-grid_style(type:line_style.T):
- The style of grid lines.
- default value=None.
-tic_interval(type:Number or function):
- When the value is a number, it specifies the interval with which
- tick marks are drawn. Otherwise, the value must be a function.
- It must take no argument and return the list of numbers, which
- specifies the X or Y points where tick marks are drawn.
- default value=None.
-line_style(type:line_style.T):
- The style of tick lines.
- default value=default.
-tic_len(type:number):
- The length of tick lines
- default value=6.
-minor_tic_interval(type:Number or function):
- When the value is a number, it specifies the interval with which
- minor tick marks are drawn. Otherwise, the value must be a function.
- It must take no argument and return the list of numbers, which
- specifies the X or Y points where minor tick marks are drawn.
- default value=None.
-first_tic_value(type:number):
- The location of the first tick mark. Defaults to the x_range[0]
- (or y_range[0]) of the area.
- default value=None.
-"""
\ No newline at end of file
diff --git a/bin/pychart/axis_y_doc.py b/bin/pychart/axis_y_doc.py
deleted file mode 100644
index e254f0ef7a8..00000000000
--- a/bin/pychart/axis_y_doc.py
+++ /dev/null
@@ -1,65 +0,0 @@
-#
-# Copyright (C) 2000-2005 by Yasushi Saito (yasushi.saito@gmail.com)
-#
-# Jockey is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2, or (at your option) any
-# later version.
-#
-# Jockey is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# for more details.
-#
-doc="""Attributes supported by this class are:
-minor_tic_len(type:number):
- The length of minor tick marks.
- default value=3.
-tic_label_offset(type:(x,y)):
- The location where the tick labels is drawn. Relative to the
- tip of the tick mark.
- default value=(0, 0).
-format(type:printf format string):
- The format string for tick labels. It can be a `printf' style
- format string, or a single-parameter function that returns a
- string. See also font.
- default value=%s.
-label_offset(type:(x,y) or None):
- The location where the axis label is drawn. Relative to the
- left-bottom corner of the axis.
- default value=(None, None).
-grid_interval(type:Number or function):
- When the value is a number, it specifies the interval with which
- grid lines are drawn. Otherwise, the value must be a function.
- It must take no argument and return the list of numbers, which
- specifies the X or Y points where grid lines are drawn.
- default value=None.
-tic_len(type:number):
- The length of tick lines
- default value=6.
-grid_style(type:line_style.T):
-
- default value=gray70dash3.
-tic_interval(type:Number or function):
- When the value is a number, it specifies the interval with which
- tick marks are drawn. Otherwise, the value must be a function.
- It must take no argument and return the list of numbers, which
- specifies the X or Y points where tick marks are drawn.
- default value=None.
-line_style(type:line_style.T):
- The style of tick lines.
- default value=default.
-label(type:str):
- The description of the axis. See also font.
- default value=axis label.
-minor_tic_interval(type:Number or function):
- When the value is a number, it specifies the interval with which
- minor tick marks are drawn. Otherwise, the value must be a function.
- It must take no argument and return the list of numbers, which
- specifies the X or Y points where minor tick marks are drawn.
- default value=None.
-first_tic_value(type:number):
- The location of the first tick mark. Defaults to the x_range[0]
- (or y_range[0]) of the area.
- default value=None.
-"""
diff --git a/bin/pychart/bar_plot.py b/bin/pychart/bar_plot.py
deleted file mode 100644
index 7e9a8d815f7..00000000000
--- a/bin/pychart/bar_plot.py
+++ /dev/null
@@ -1,268 +0,0 @@
-#
-# Copyright (C) 2000-2005 by Yasushi Saito (yasushi.saito@gmail.com)
-#
-# Jockey is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2, or (at your option) any
-# later version.
-#
-# Jockey is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# for more details.
-#
-import line_style
-import fill_style
-import pychart_util
-import chart_object
-import legend
-import error_bar
-import bar_plot_doc
-import theme
-from types import *
-from pychart_types import *
-
-fill_styles = None
-
-_keys = {
- "direction" : (StringType, "vertical",
- """The direction the growth of the bars. The value is either 'horizontal'
- or 'vertical'."""),
- "data" : (AnyType, None, pychart_util.data_desc),
- "data_label_offset": (CoordType, (0, 5),
- "The location of data labels relative to the sample point. See also attribute data_label_format."),
-
- "data_label_format": (FormatType, None, """The
- format string for the label displayed besides each
- bar. It can be a `printf' style format
- string, or a two-parameter function that
- takes (x,y) values and returns a string. """
- + pychart_util.string_desc),
-
- "label": (StringType, "???", pychart_util.label_desc),
- "bcol" : (IntType, 0,
- """Specifies the column from which base values (i.e., X values when attribute "direction" is "vertical", Y values otherwise) are extracted.
-The
- combination of "data", "bcol", and "hcol" attributes defines
- the set of boxes drawn by this chart. See the
- below example:
-
-@example
- d = [[5,10], [7,22], [8,25]]
- p = bar_plot.T(data = d, bcol = 1, hcol = 2)
-@end example
-
- Here, three bars will be drawn. The X values of the bars
- will be 5, 7, and 8. The Y values of the bars will be
- 10, 22, and 25, respectively. (In practice, because
- the values of bcol and hcol defaults to 1 and 2, you can
- write the above example just as "p = bar_plot.T(data = d)".
- """),
- "hcol": (IntType, 1,
- """The column from which the height of each bar is extracted.
- See also the description of the 'bcol' attribute."""),
- "line_style": (line_style.T, line_style.default,
- "The style of the outer frame of each box."),
- "fill_style": (fill_style.T, lambda: fill_styles.next(),
- "Defines the fill style of each box.",
- "The style is picked from standard styles round-robin."),
- "legend_line_style": (line_style.T, None,
- """The line style used to draw a legend entry. Usually, the value is None, meaning that the value of "line_style" attribute is used."""),
- "legend_fill_style": (fill_style.T, None,
- """The fill style used to draw a legend entry. Usually, the value is None, meaning that the value of "fill_style" attribute is used."""),
-
- "cluster": (TupleType, (0, 1), """This attribute is used to
- cluster multiple bar plots side by side in a single chart.
- The value should be a tuple of two integers. The second value should be equal to the total number of bar plots in the chart. The first value should be the relative position of this chart; 0 places this chart the leftmost, and N-1
- (where N is the 2nd value of this attribute) places this chart the rightmost. Consider the below example:
-
-@example
- a = area.T(...)
- p1 = bar_plot.T(data = [[1,20][2,30]], cluster=(0,2))
- p2 = bar_plot.T(data = [[1,25],[2,10]], cluster=(1,2))
- a.add_plot(p1, p2)
- a.draw()
-@end example
-
- In this example, one group of bars will be drawn side-by-side at
- position x=1, one with height 20, the other with height 25. The
- other two bars will be drawn side by side at position x=2, one
- with height 30 and the other with height 10.
- """),
- "width": (UnitType, 5, """Width of each box.
-@cindex width, bar chart
-@cindex size, bar chart
-"""),
- "cluster_sep": (UnitType, 0, """The separation between
- clustered boxes."""),
- "stack_on": (AnyType, None,
- "The value must be either None or bar_plot.T. If not None, bars of this plot are stacked on top of another bar plot."),
- "error_minus_col": (IntType, -1,
- """Specifies the column from which the depth of the errorbar is extracted. This attribute is meaningful only when
- error_bar != None.
- """),
- "qerror_minus_col": (IntType, -1,
- """The depth of the "quartile" errorbar is extracted from
- this column in data. This attribute is meaningful only
- when error_bar != None. """),
- "error_plus_col": (IntType, -1,
- """The depth of the errorbar is extracted from
- this column in data. This attribute is meaningful only
- when error_bar != None."""),
- "qerror_plus_col": (IntType, -1,
- """The depth of the "quartile" errorbar is extracted from
- this column in data. This attribute is meaningful only
- when error_bar != None."""),
- "error_bar": (error_bar.T, None,
- "Specifies the style of the error bar. <>"),
- "_abs_data" : (ListType, None,
- "Used only internally."),
- }
-
-def find_bar_plot(ar, nth):
- "Find the NTH barplot of the cluster in area AR."
- for plot in ar.plots:
- if isinstance(plot, T) and plot.cluster[0] == nth:
- return plot
- raise Exception, "The %dth bar plot in the cluster not found." % nth
-
-class T(chart_object.T):
- __doc__ = bar_plot_doc.doc
- keys = _keys
- def check_integrity(self):
- self.type_check()
- self.compute_abs_data()
- def compute_abs_data(self):
- if self._abs_data != None:
- return
-
- if self.stack_on == None:
- self._abs_data = self.data
- else:
- n = []
- for pair in self.data:
- self.stack_on.compute_abs_data()
- newpair = list(pair[:])
- newpair[self.hcol] = self.stack_on.get_value(newpair[self.bcol]) + pair[self.hcol]
- n.append(newpair)
- self._abs_data = n
-
-##AUTOMATICALLY GENERATED
-
-##END AUTOMATICALLY GENERATED
- def get_value(self, bval):
- for pair in self._abs_data:
- if pair[self.bcol] == bval:
- return pair[self.hcol]
- raise ValueError, str(bval) + ": can't find the xval"
-
- def get_data_range(self, which):
- if self.direction == 'vertical':
- if which == 'X':
- return pychart_util.get_data_range(self._abs_data, self.bcol)
- else:
- return pychart_util.get_data_range(self._abs_data, self.hcol)
- else:
- assert self.direction == 'horizontal'
- if which == 'Y':
- return pychart_util.get_data_range(self._abs_data, self.bcol)
- else:
- return pychart_util.get_data_range(self._abs_data, self.hcol)
-
- def get_bar_width(self, ar, nth):
- off = 0
- for i in range(0, nth):
- plot = find_bar_plot(ar, i)
- off += plot.width + plot.cluster_sep
- return off
-
- def draw_vertical(self, ar, can):
- for pair in self.data:
- xval = pair[self.bcol]
- yval = pychart_util.get_sample_val(pair, self.hcol)
-
- if None in (xval, yval): continue
-
- ybot = 0
- if self.stack_on:
- ybot = self.stack_on.get_value(xval)
- yval += ybot
-
- totalWidth = self.get_bar_width(ar, self.cluster[1])
- firstX = ar.x_pos(xval) - totalWidth/2.0
- thisX = firstX + self.get_bar_width(ar, self.cluster[0])
-
- can.rectangle(self.line_style, self.fill_style,
- thisX, ar.y_pos(ybot), thisX+self.width,
- ar.y_pos(yval))
-
- if self.error_bar:
- plus = pair[self.error_minus_col or self.error_plus_col]
- minus = pair[self.error_plus_col or self.error_minus_col]
- qplus = 0
- qminus = 0
- if self.qerror_minus_col or self.qerror_plus_col:
- qplus = pair[self.qerror_minus_col or self.qerror_plus_col]
- qminus = pair[self.qerror_plus_col or self.qerror_minus_col]
- if None not in (plus, minus, qplus, qminus):
- self.error_bar.draw(can, (thisX+self.width/2.0, ar.y_pos(yval)),
- ar.y_pos(yval - minus),
- ar.y_pos(yval + plus),
- ar.y_pos(yval - qminus),
- ar.y_pos(yval + qplus))
-
- if self.data_label_format:
- can.show(thisX + self.width/2.0 + self.data_label_offset[0],
- ar.y_pos(yval) + self.data_label_offset[1],
- "/hC" + pychart_util.apply_format(self.data_label_format, (pair[self.bcol], pair[self.hcol]), 1))
-
- def draw_horizontal(self, ar, can):
- for pair in self.data:
- yval = pair[self.bcol]
- xval = pychart_util.get_sample_val(pair, self.hcol)
-
- if None in (xval, yval): continue
-
- xbot = 0
- if self.stack_on:
- xbot = self.stack_on.get_value(yval)
- xval += xbot
- totalWidth = self.get_bar_width(ar, self.cluster[1])
- firstY = ar.y_pos(yval) - totalWidth/2.0
- thisY = firstY + self.get_bar_width(ar, self.cluster[0])
-
- can.rectangle(self.line_style, self.fill_style,
- ar.x_pos(xbot), thisY,
- ar.x_pos(xval), thisY+self.width)
-
- if self.data_label_format:
- can.show(ar.x_pos(xval) + self.data_label_offset[0],
- thisY + self.width/2.0 + self.data_label_offset[1],
- "/vM/hL" + pychart_util.apply_format(self.data_label_format, (pair[self.bcol], pair[self.hcol]), 1))
-
- def get_legend_entry(self):
- if self.label:
- return legend.Entry(line_style=(self.legend_line_style or self.line_style),
- fill_style=(self.legend_fill_style or self.fill_style),
- label=self.label)
- return None
-
- def draw(self, ar, can):
- self.type_check()
- can.clip(ar.loc[0], ar.loc[1],
- ar.loc[0] + ar.size[0], ar.loc[1] + ar.size[1])
-
- if self.direction == "vertical":
- self.draw_vertical(ar, can)
- else:
- self.draw_horizontal(ar, can)
-
- can.endclip()
-
-
-def init():
- global fill_styles
- fill_styles = fill_style.standards.iterate()
-
-theme.add_reinitialization_hook(init)
-
diff --git a/bin/pychart/bar_plot_doc.py b/bin/pychart/bar_plot_doc.py
deleted file mode 100644
index c47492ef280..00000000000
--- a/bin/pychart/bar_plot_doc.py
+++ /dev/null
@@ -1,79 +0,0 @@
-# automatically generated by generate_docs.py.
-doc="""Attributes supported by this class are:
-cluster_sep(type:length in points (\\xref{unit})) default="The separation between
- clustered boxes.".
-error_plus_col(type:int) default="The depth of the errorbar is extracted from
- this column in data. This attribute is meaningful only
- when error_bar != None.".
-direction(type:str) default="The direction the growth of the bars. The value is either 'horizontal'
- or 'vertical'.".
-legend_line_style(type:line_style.T) default="The line style used to draw a legend entry. Usually, the value is None, meaning that the value of "line_style" attribute is used.".
-error_bar(type:error_bar.T) default="Specifies the style of the error bar. <>".
-data_label_format(type:printf format string) default="The
- format string for the label displayed besides each
- bar. It can be a `printf' style format
- string, or a two-parameter function that
- takes (x,y) values and returns a string. The appearance of the string produced here can be
-controlled using escape sequences. <>".
-width(type:length in points (\\xref{unit})) default="Width of each box.
-@cindex width, bar chart
-@cindex size, bar chart
-".
-bcol(type:int) default="Specifies the column from which base values (i.e., X values when attribute "direction" is "vertical", Y values otherwise) are extracted.
-The
- combination of "data", "bcol", and "hcol" attributes defines
- the set of boxes drawn by this chart. See the
- below example:
-
-@example
- d = [[5,10], [7,22], [8,25]]
- p = bar_plot.T(data = d, bcol = 1, hcol = 2)
-@end example
-
- Here, three bars will be drawn. The X values of the bars
- will be 5, 7, and 8. The Y values of the bars will be
- 10, 22, and 25, respectively. (In practice, because
- the values of bcol and hcol defaults to 1 and 2, you can
- write the above example just as "p = bar_plot.T(data = d)".
- ".
-qerror_minus_col(type:int) default="The depth of the "quartile" errorbar is extracted from
- this column in data. This attribute is meaningful only
- when error_bar != None. ".
-_abs_data(type:list) default="Used only internally.".
-label(type:str) default="The label to be displayed in the legend. <>, <>".
-cluster(type:tuple) default="This attribute is used to
- cluster multiple bar plots side by side in a single chart.
- The value should be a tuple of two integers. The second value should be equal to the total number of bar plots in the chart. The first value should be the relative position of this chart; 0 places this chart the leftmost, and N-1
- (where N is the 2nd value of this attribute) places this chart the rightmost. Consider the below example:
-
-@example
- a = area.T(...)
- p1 = bar_plot.T(data = [[1,20][2,30]], cluster=(0,2))
- p2 = bar_plot.T(data = [[1,25],[2,10]], cluster=(1,2))
- a.add_plot(p1, p2)
- a.draw()
-@end example
-
- In this example, one group of bars will be drawn side-by-side at
- position x=1, one with height 20, the other with height 25. The
- other two bars will be drawn side by side at position x=2, one
- with height 30 and the other with height 10.
- ".
-hcol(type:int) default="The column from which the height of each bar is extracted.
- See also the description of the 'bcol' attribute.".
-stack_on(type:any) default="The value must be either None or bar_plot.T. If not None, bars of this plot are stacked on top of another bar plot.".
-qerror_plus_col(type:int) default="The depth of the "quartile" errorbar is extracted from
- this column in data. This attribute is meaningful only
- when error_bar != None.".
-data_label_offset(type:(x,y)) default="The location of data labels relative to the sample point. See also attribute data_label_format.".
-fill_style(type:fill_style.T) default="Defines the fill style of each box.".
- The style is picked from standard styles round-robin.
-
-data(type:any) default="Specifies the data points. <>".
-line_style(type:line_style.T) default="The style of the outer frame of each box.".
-legend_fill_style(type:fill_style.T) default="The fill style used to draw a legend entry. Usually, the value is None, meaning that the value of "fill_style" attribute is used.".
-error_minus_col(type:int) default="Specifies the column from which the depth of the errorbar is extracted. This attribute is meaningful only when
- error_bar != None.
- ".
-"""
-
diff --git a/bin/pychart/basecanvas.py b/bin/pychart/basecanvas.py
deleted file mode 100644
index bef3573cb44..00000000000
--- a/bin/pychart/basecanvas.py
+++ /dev/null
@@ -1,505 +0,0 @@
-#
-# Copyright (C) 2000-2005 by Yasushi Saito (yasushi.saito@gmail.com)
-#
-# Jockey is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2, or (at your option) any
-# later version.
-#
-# Jockey is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# for more details.
-#
-import math
-import sys
-import time
-import re
-
-import font
-import pychart_util
-import version
-from scaling import *
-
-def _compute_bounding_box(points):
- """Given the list of coordinates (x,y), this procedure computes
- the smallest rectangle that covers all the points."""
- (xmin, ymin, xmax, ymax) = (999999, 999999, -999999, -999999)
- for p in points:
- xmin = min(xmin, p[0])
- xmax = max(xmax, p[0])
- ymin = min(ymin, p[1])
- ymax = max(ymax, p[1])
- return (xmin, ymin, xmax, ymax)
-
-def _intersect_box(b1, b2):
- xmin = max(b1[0], b2[0])
- ymin = max(b1[1], b2[1])
- xmax = min(b1[2], b2[2])
- ymax = min(b1[3], b2[3])
- return (xmin, ymin, xmax, ymax)
-
-def invisible_p(x, y):
- """Return true if the point (X, Y) is visible in the canvas."""
- if x < -499999 or y < -499999:
- return 1
- return 0
-
-def to_radian(deg):
- return deg*2*math.pi / 360.0
-
-def midpoint(p1, p2):
- return ( (p1[0]+p2[0])/2.0, (p1[1]+p2[1])/2.0 )
-
-
-active_canvases = []
-
-InvalidCoord = 999999
-class T(object):
- def __init__(self):
- global active_canvases
-
- self.__xmax = -InvalidCoord
- self.__xmin = InvalidCoord
- self.__ymax = -InvalidCoord
- self.__ymin = InvalidCoord
- self.__clip_box = (-InvalidCoord, -InvalidCoord, InvalidCoord, InvalidCoord)
- self.__clip_stack = []
- self.__nr_gsave = 0
-
- self.title = re.sub("(.*)\\.py$", "\\1", sys.argv[0])
- self.creator = "pychart %s" % (version.version,)
- self.creation_date = time.strftime("(%m/%d/%y) (%I:%M %p)")
- self.aux_comments = ""
- self.author = None
- active_canvases.append(self)
-
- def set_title(self, s):
- """Define the string to shown in EPS/PDF "Title" field. The default value is the name of the script that creates the EPS/PDF file."""
- self.title = s
-
- def set_creator(self, tag):
- """Define the string to be shown in EPS %%Creator or PDF Producer field. The default value is "pychart"."""
- self.creator = tag
-
- def set_creation_date(self, s):
- """Define the string to shown in EPS/PDF "CreationDate" field. Defalt value of this field is the current time."""
- self.creation_date = s
-
- def set_author(self, s):
- """Set the author string. Unless this method is called, the Author field is not output in EPS or PDF."""
- self.author = s
-
- def add_aux_comments(self, s):
- """Define an auxiliary comments to be output to the file, just after the required headers"""
- self.aux_comments += s
-
- def close(self):
- """This method closes the canvas and writes
- contents to the associated file.
- Calling this procedure is optional, because
- Pychart calls this procedure for every open canvas on normal exit."""
- for i in range(0, len(active_canvases)):
- if active_canvases[i] == self:
- del active_canvases[i]
- return
-
- def open_output(self, fname):
- """Open the output file FNAME. Returns tuple (FD, NEED_CLOSE),
- where FD is a file (or file-like) object, and NEED_CLOSE is a
- boolean flag that tells whether FD.close() should be called
- after finishing writing to the file.
-
- FNAME can be one of the three things:
- (1) None, in which case (sys.stdout, False) is returned.
- (2) A file-like object, in which case (fname, False) is returned.
- (3) A string, in which case this procedure opens the file and returns
- (fd, True)."""
-
- if not fname:
- return (sys.stdout, False)
- elif isinstance(fname, str):
- return (file(fname, "wb"), True)
- else:
- if not hasattr(fname, "write"):
- raise Exception, "Expecting either a filename or a file-like object, but got %s" % fname
- return (fname, False)
-
- def setbb(self, x, y):
- """Call this method when point (X,Y) is to be drawn in the
- canvas. This methods expands the bounding box to include
- this point."""
- self.__xmin = min(self.__xmin, max(x, self.__clip_box[0]))
- self.__xmax = max(self.__xmax, min(x, self.__clip_box[2]))
- self.__ymin = min(self.__ymin, max(y, self.__clip_box[1]))
- self.__ymax = max(self.__ymax, min(y, self.__clip_box[3]))
-
- def fill_with_pattern(self, pat, x1, y1, x2, y2):
- if invisible_p(x2, y2): return
-
- self.comment("FILL pat=%s (%d %d)-(%d %d)\n" % (pat, x1, y1, x2, y2))
- self.set_fill_color(pat.bgcolor)
- self._path_polygon([(x1, y1), (x1, y2), (x2, y2), (x2, y1)])
- self.fill()
- pat.draw(self, x1, y1, x2, y2)
- self.comment("end FILL.\n")
-
- def _path_polygon(self, points):
- "Low-level polygon-drawing routine."
- (xmin, ymin, xmax, ymax) = _compute_bounding_box(points)
- if invisible_p(xmax, ymax):
- return
- self.setbb(xmin, ymin)
- self.setbb(xmax, ymax)
-
- self.newpath()
- self.moveto(xscale(points[0][0]), yscale(points[0][1]))
- for point in points[1:]:
- self.lineto(xscale(point[0]), yscale(point[1]))
- self.closepath()
-
- def polygon(self, edge_style, pat, points, shadow = None):
- """Draw a polygon with EDGE_STYLE, fill with PAT, and the edges
- POINTS. POINTS is a sequence of coordinates, e.g., ((10,10), (15,5),
- (20,8)). SHADOW is either None or a tuple (XDELTA, YDELTA,
- fillstyle). If non-null, a shadow of FILLSTYLE is drawn beneath
- the polygon at the offset of (XDELTA, YDELTA)."""
-
- if pat:
- self.comment("POLYGON points=[%s] pat=[%s]"
- % (str(points), str(pat)))
- (xmin, ymin, xmax, ymax) = _compute_bounding_box(points)
-
- if shadow:
- xoff, yoff, shadow_pat = shadow
- self.gsave()
- self._path_polygon(map(lambda p, xoff=xoff, yoff=yoff: (p[0]+xoff, p[1]+yoff), points))
- self.clip_sub()
- self.fill_with_pattern(shadow_pat, xmin+xoff, ymin+yoff,
- xmax+xoff, ymax+yoff)
- self.grestore()
-
- self.gsave()
- self._path_polygon(points)
- self.clip_sub()
- self.fill_with_pattern(pat, xmin, ymin, xmax, ymax)
- self.grestore()
- if edge_style:
- self.comment("POLYGON points=[%s] edge=[%s]"
- % (str(points), str(edge_style)))
- self.set_line_style(edge_style)
- self._path_polygon(points)
- self.stroke()
-
- def set_background(self, pat, x1, y1, x2, y2):
- xmax, xmin, ymax, ymin = self.__xmax, self.__xmin, self.__ymax, self.__ymin
- self.rectangle(None, pat, x1, y1, x2, y2)
- self.__xmax, self.__xmin, self.__ymax, self.__ymin = xmax, xmin, ymax, ymin
-
- def rectangle(self, edge_style, pat, x1, y1, x2, y2, shadow = None):
- """Draw a rectangle with EDGE_STYLE, fill with PAT, and the
- bounding box (X1, Y1, X2, Y2). SHADOW is either None or a
- tuple (XDELTA, YDELTA, fillstyle). If non-null, a shadow of
- FILLSTYLE is drawn beneath the polygon at the offset of
- (XDELTA, YDELTA)."""
-
- self.polygon(edge_style, pat, [(x1,y1), (x1,y2), (x2,y2), (x2, y1)],
- shadow)
-
- def _path_ellipsis(self, x, y, radius, ratio, start_angle, end_angle):
- self.setbb(x - radius, y - radius*ratio)
- self.setbb(x + radius, y + radius*ratio)
- oradius = nscale(radius)
- centerx, centery = xscale(x), yscale(y)
- startx, starty = centerx+oradius * math.cos(to_radian(start_angle)), \
- centery+oradius * math.sin(to_radian(start_angle))
- self.moveto(centerx, centery)
- if start_angle % 360 != end_angle % 360:
- self.moveto(centerx, centery)
- self.lineto(startx, starty)
- else:
- self.moveto(startx, starty)
- self.path_arc(xscale(x), yscale(y), nscale(radius),
- ratio, start_angle, end_angle)
- self.closepath()
-
- def ellipsis(self, line_style, pattern, x, y, radius, ratio = 1.0,
- start_angle=0, end_angle=360, shadow=None):
- """Draw an ellipsis with line_style and fill PATTERN. The center is \
- (X, Y), X radius is RADIUS, and Y radius is RADIUS*RATIO, whose \
- default value is 1.0. SHADOW is either None or a tuple (XDELTA,
- YDELTA, fillstyle). If non-null, a shadow of FILLSTYLE is drawn
- beneath the polygon at the offset of (XDELTA, YDELTA)."""
-
- if invisible_p(x + radius, y + radius*ratio):
- return
-
- if pattern:
- if shadow:
- x_off, y_off, shadow_pat = shadow
- self.gsave()
- self.newpath()
- self._path_ellipsis(x+x_off, y+y_off, radius, ratio,
- start_angle, end_angle)
- self.clip_sub()
- self.fill_with_pattern(shadow_pat,
- x-radius*2+x_off,
- y-radius*ratio*2+y_off,
- x+radius*2+x_off,
- y+radius*ratio*2+y_off)
- self.grestore()
- self.gsave()
- self.newpath()
- self._path_ellipsis(x, y, radius, ratio, start_angle, end_angle)
- self.clip_sub()
- self.fill_with_pattern(pattern,
- (x-radius*2), (y-radius*ratio*2),
- (x+radius*2), (y+radius*ratio*2))
- self.grestore()
- if line_style:
- self.set_line_style(line_style)
- self.newpath()
- self._path_ellipsis(x, y, radius, ratio, start_angle, end_angle)
- self.stroke()
-
- def clip_ellipsis(self, x, y, radius, ratio = 1.0):
- """Create an elliptical clip region. You must call endclip() after
- you completed drawing. See also the ellipsis method."""
-
- self.gsave()
- self.newpath()
- self.moveto(xscale(x)+nscale(radius), yscale(y))
- self.path_arc(xscale(x), yscale(y), nscale(radius), ratio, 0, 360)
- self.closepath()
- self.__clip_stack.append(self.__clip_box)
- self.clip_sub()
-
- def clip_polygon(self, points):
- """Create a polygonal clip region. You must call endclip() after
- you completed drawing. See also the polygon method."""
- self.gsave()
- self._path_polygon(points)
- self.__clip_stack.append(self.__clip_box)
- self.__clip_box = _intersect_box(self.__clip_box, _compute_bounding_box(points))
- self.clip_sub()
-
- def clip(self, x1, y1, x2, y2):
- """Activate a rectangular clip region, (X1, Y1) - (X2, Y2).
- You must call endclip() after you completed drawing.
-
-canvas.clip(x,y,x2,y2)
-draw something ...
-canvas.endclip()
-"""
-
- self.__clip_stack.append(self.__clip_box)
- self.__clip_box = _intersect_box(self.__clip_box, (x1, y1, x2, y2))
- self.gsave()
- self.newpath()
- self.moveto(xscale(x1), yscale(y1))
- self.lineto(xscale(x1), yscale(y2))
- self.lineto(xscale(x2), yscale(y2))
- self.lineto(xscale(x2), yscale(y1))
- self.closepath()
- self.clip_sub()
-
- def endclip(self):
- """End the current clip region. When clip calls are nested, it
- ends the most recently created crip region."""
- self.__clip_box = self.__clip_stack[-1]
- del self.__clip_stack[-1]
- self.grestore()
-
- def curve(self, style, points):
- for p in points:
- self.setbb(p[0], p[1])
- self.newpath()
- self.set_line_style(style)
- self.moveto(xscale(points[0][0]), xscale(points[0][1]))
- i = 1
- n = 1
- while i < len(points):
- if n == 1:
- x2 = points[i]
- n += 1
- elif n == 2:
- x3 = points[i]
- n += 1
- elif n == 3:
- x4 = midpoint(x3, points[i])
- self.curveto(xscale(x2[0]), xscale(x2[1]),
- xscale(x3[0]), xscale(x3[1]),
- xscale(x4[0]), xscale(x4[1]))
- n = 1
- i += 1
- if n == 1:
- pass
- if n == 2:
- self.lineto(xscale(x2[0]), xscale(x2[1]))
- if n == 3:
- self.curveto(xscale(x2[0]), xscale(x2[1]),
- xscale(x2[0]), xscale(x2[1]),
- xscale(x3[0]), xscale(x3[1]))
- self.stroke()
-
- def line(self, style, x1, y1, x2, y2):
- if not style:
- return
- if invisible_p(x2, y2) and invisible_p(x1, y1):
- return
-
- self.setbb(x1, y1)
- self.setbb(x2, y2)
-
- self.newpath()
- self.set_line_style(style)
- self.moveto(xscale(x1), yscale(y1))
- self.lineto(xscale(x2), yscale(y2))
- self.stroke()
-
- def lines(self, style, segments):
- if not style:
- return
- (xmin, ymin, xmax, ymax) = _compute_bounding_box(segments)
- if invisible_p(xmax, ymax):
- return
-
- self.setbb(xmin, ymin)
- self.setbb(xmax, ymax)
- self.newpath()
- self.set_line_style(style)
- self.moveto(xscale(segments[0][0]), xscale(segments[0][1]))
- for i in range(1, len(segments)):
- self.lineto(xscale(segments[i][0]), yscale(segments[i][1]))
- self.stroke()
-
- def _path_round_rectangle(self, x1, y1, x2, y2, radius):
- self.moveto(xscale(x1 + radius), yscale(y1))
- self.lineto(xscale(x2 - radius), yscale(y1))
- self.path_arc(xscale(x2-radius), yscale(y1+radius), nscale(radius), 1, 270, 360)
- self.lineto(xscale(x2), yscale(y2-radius))
- self.path_arc(xscale(x2-radius), yscale(y2-radius), nscale(radius), 1, 0, 90)
- self.lineto(xscale(x1+radius), yscale(y2))
- self.path_arc(xscale(x1 + radius), yscale(y2 - radius), nscale(radius), 1, 90, 180)
- self.lineto(xscale(x1), xscale(y1+radius))
- self.path_arc(xscale(x1 + radius), yscale(y1 + radius), nscale(radius), 1, 180, 270)
-
- def round_rectangle(self, style, fill, x1, y1, x2, y2, radius, shadow=None):
- """Draw a rectangle with rounded four corners. Parameter specifies the radius of each corner."""
-
- if invisible_p(x2, y2):
- return
- self.setbb(x1, y1)
- self.setbb(x2, y2)
-
- if fill:
- if shadow:
- x_off, y_off, shadow_fill = shadow
- self.gsave();
- self.newpath()
- self._path_round_rectangle(x1+x_off, y1+y_off, x2+x_off, y2+y_off,
- radius)
- self.closepath()
- self.clip_sub()
- self.fill_with_pattern(shadow_fill, x1+x_off, y1+y_off,
- x2+x_off, y2+y_off)
- self.grestore()
-
- self.gsave();
- self.newpath()
- self._path_round_rectangle(x1, y1, x2, y2, radius)
- self.closepath()
- self.clip_sub()
- self.fill_with_pattern(fill, x1, y1, x2, y2)
- self.grestore()
- if style:
- self.set_line_style(style)
- self.newpath()
- self._path_round_rectangle(x1, y1, x2, y2, radius)
- self.closepath()
- self.stroke()
-
- def show(self, x, y, str):
- global out
- y_org = y
- org_str = str
-
- if invisible_p(x, y):
- return
-
- (xmin, xmax, ymin, ymax) = font.get_dimension(str)
-
- # rectangle(line_style.default, None, x+xmin, y+ymin, x+xmax, y+ymax)
- # ellipsis(line_style.default, None, x, y, 1)
- self.setbb(x+xmin, y+ymin)
- self.setbb(x+xmax, y+ymax)
-
- (halign, valign, angle) = font.get_align(str)
-
- base_x = x
- base_y = y
-
- # Handle vertical alignment
- if valign == "B":
- y = font.unaligned_text_height(str)
- elif valign == "T":
- y = 0
- elif valign == "M":
- y = font.unaligned_text_height(str) / 2.0
-
- (xmin, xmax, ymin, ymax) = font.get_dimension(org_str)
- # print org_str, xmin, xmax, ymin, ymax, x, y_org, y
- self.setbb(x+xmin, y_org+y+ymin)
- self.setbb(x+xmax, y_org+y+ymax)
- itr = font.text_iterator(None)
-
- max_width = 0
-
- lines = []
- for line in str.split('\n'):
- cur_width = 0
- cur_height = 0
-
- itr.reset(line)
-
- strs = []
-
- while 1:
- elem = itr.next()
- if not elem:
- break
-
- (font_name, size, line_height, color, _h, _v, _a, str) = elem
- cur_width += font.line_width(font_name, size, str)
- max_width = max(cur_width, max_width)
- cur_height = max(cur_height, line_height)
-
- # replace '(' -> '\(', ')' -> '\)' to make
- # Postscript string parser happy.
- str = str.replace("(", "\\(")
- str = str.replace(")", "\\)")
- strs.append((font_name, size, color, str))
- lines.append((cur_width, cur_height, strs))
-
- for line in lines:
- cur_width, cur_height, strs = line
- cur_y = y - cur_height
- y = y - cur_height
- self.comment("cury: %d hei %d str %s\n" % (cur_y, cur_height, strs))
- if halign == 'C':
- cur_x = -cur_width/2.0
- elif halign == 'R':
- cur_x = -cur_width
- else:
- cur_x = 0
-
- rel_x, rel_y = pychart_util.rotate(cur_x, cur_y, angle)
- self.text_begin()
- self.text_moveto(xscale(base_x + rel_x),
- yscale(base_y + rel_y), angle)
- for segment in strs:
- font_name, size, color, str = segment
- self.text_show(font_name, nscale(size), color, str)
- self.text_end()
-
-
diff --git a/bin/pychart/canvas.py b/bin/pychart/canvas.py
deleted file mode 100644
index cadceb3b5ce..00000000000
--- a/bin/pychart/canvas.py
+++ /dev/null
@@ -1,123 +0,0 @@
-#
-# Copyright (C) 2000-2005 by Yasushi Saito (yasushi.saito@gmail.com)
-#
-# Jockey is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2, or (at your option) any
-# later version.
-#
-# Jockey is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# for more details.
-#
-import sys
-import basecanvas
-import pscanvas
-import pdfcanvas
-import svgcanvas
-import pngcanvas
-import x11canvas
-import theme
-import re
-
-invalid_coord = -999999
-_oldexitfunc = None
-
-T = basecanvas.T
-
-def init(fname = None, format = None):
-
- """This is a "factory" procedure that creates a new canvas.T object.
- Both parameters, and
- , are optional. Parameter specifies either the output
- file name or a file object. Parameter , if specified, defines the
- file's format. Its value must be one of "ps", "pdf", "svg", "x11", or
- "png".
-
- When is omitted or is None, the output is sent to standard
- output. When is omitted, it is guessed from the 's
- suffix; failing that, "ps" is selected."""
-
- fname = fname or theme.output_file
- format = format or theme.output_format
-
- if format == None:
- if not isinstance(fname, str):
- format = "ps"
- elif re.search("pdf$", fname):
- format = "pdf"
- elif re.search("png$", fname):
- format = "png"
- elif re.search("svg$", fname):
- format = "svg"
- else:
- format = "ps"
-
- if format == "ps":
- can = pscanvas.T(fname)
- elif format == "png":
- can = pngcanvas.T(fname)
- elif format == "x11":
- can = x11canvas.T(fname)
- elif format == "svg":
- can = svgcanvas.T(fname)
- else:
- can = pdfcanvas.T(fname, theme.compress_output)
- return can
-
-def default_canvas():
- if len(basecanvas.active_canvases) > 0:
- return basecanvas.active_canvases[0]
- else:
- return init(None)
-
-def _exit():
- global _oldexitfunc, _active_canvases
-
- for can in basecanvas.active_canvases[:]:
- can.close()
-
- if _oldexitfunc:
- foo = _oldexitfunc
- _oldexitfunc = None
- foo()
-
-#
-# The following procedures are there just for backward compatibility.
-#
-def line(style, x1, y1, x2, y2):
- default_canvas().line(style, x1, y1, x2, y2)
-def curve(style, points):
- default_canvas().curve(style, points)
-def clip(x1, y1, x2, y2):
- default_canvas().clip(x1, y1, x2, y2)
-def endclip():
- default_canvas().endclip()
-def clip_polygon(points):
- default_canvas().clip_polygon(points)
-def clip_ellipsis(x, y, radius, ratio = 1.0):
- default_canvas().clip_ellipsis(x, y, radius, ratio)
-def ellipsis(line_style, pattern, x, y, radius, ratio = 1.0,
- start_angle=0, end_angle=360, shadow=None):
- default_canvas().ellipsis(line_style, pattern, x, y, radius, ratio,
- start_angle, end_angle, shadow)
-def rectangle(edge_style, pat, x1, y1, x2, y2, shadow = None):
- default_canvas().rectangle(edge_style, pat, x1, y1, x2, y2, shadow)
-def polygon(edge_style, pat, points, shadow = None):
- default_canvas().polygon(edge_style, pat, points, shadow = None)
-def close():
- default_canvas().close()
-def round_rectangle(style, fill, x1, y1, x2, y2, radius, shadow=None):
- default_canvas().round_rectangle(style, fill, x1, y1, x2, y2, radius, shadow)
-def show(x, y, str):
- default_canvas().show(x, y, str)
-
-
-if not vars(sys).has_key("exitfunc"):
- sys.exitfunc = _exit
-elif sys.exitfunc != _exit:
- _oldexitfunc = sys.exitfunc
- sys.exitfunc = _exit
-
-#theme.add_reinitialization_hook(lambda: init(None))
diff --git a/bin/pychart/category_coord.py b/bin/pychart/category_coord.py
deleted file mode 100644
index a84d3eb5d73..00000000000
--- a/bin/pychart/category_coord.py
+++ /dev/null
@@ -1,47 +0,0 @@
-#
-# Copyright (C) 2000-2005 by Yasushi Saito (yasushi.saito@gmail.com)
-#
-# Jockey is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2, or (at your option) any
-# later version.
-#
-# Jockey is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# for more details.
-#
-import coord
-import canvas
-
-class T(coord.T):
- def __init__(self, data, col):
-
- """This attribute is meaningful only when x_coord_system ==
- 'category'. This attribute selects the column of
- 'x_category_data' from which X values are computed.
- Meaningful only when x_coord_system == 'category'. This
- attribute specifies the data-set from which the X values are
- extracted. See also x_category_col."""
-
- self.data = data
- self.col = col
-
- def get_canvas_pos(self, size, val, min, max):
- i = 0.5
- for v in self.data:
- if v[self.col] == val:
- return size * i / float(len(self.data))
- i += 1
- # the drawing area is clipped. So negative offset will make this plot
- # invisible.
- return canvas.invalid_coord;
- def get_tics(self, min, max, interval):
- tics = []
- if interval == None: interval = 1
-
- for i in range(0, len(self.data), interval):
- tics.append(self.data[i][self.col])
- return tics
- #return map(lambda pair, self = self: pair[self.col], self.data)
-
diff --git a/bin/pychart/chart_data.py b/bin/pychart/chart_data.py
deleted file mode 100644
index 6e252c8d585..00000000000
--- a/bin/pychart/chart_data.py
+++ /dev/null
@@ -1,387 +0,0 @@
-#
-# Copyright (C) 2000-2005 by Yasushi Saito (yasushi.saito@gmail.com)
-#
-# Jockey is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2, or (at your option) any
-# later version.
-#
-# Jockey is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# for more details.
-#
-import pychart_util
-import copy
-import math
-
-def _convert_item(v, typ, line):
- if typ == "a":
- try:
- i = float(v)
- except ValueError: # non-number
- i = v
- return i
- elif typ == "d":
- try:
- return int(v)
- except ValueError:
- raise ValueError, "Can't convert %s to int; line=%s" % (v, line)
- elif typ == "f":
- try:
- return float(v)
- except ValueError:
- raise ValueError, "Can't convert %s to float; line=%s" % (v, line)
- elif typ == "s":
- return v
- else:
- raise ValueError, "Unknown conversion type, type=%s; line=%s" % (typ,line)
-
-def parse_line(line, delim):
- if delim.find("%") < 0:
- return [ _convert_item(item, "a", None) for item in line.split(delim) ]
-
- data = []
- idx = 0 # indexes delim
- ch = 'f'
- sep = ','
-
- while idx < len(delim):
- if delim[idx] != '%':
- raise ValueError, "bad delimitor: '" + delim + "'"
- ch = delim[idx+1]
- idx += 2
- sep = ""
- while idx < len(delim) and delim[idx] != '%':
- sep += delim[idx]
- idx += 1
- xx = line.split(sep, 1)
- data.append(_convert_item(xx[0], ch, line))
- if len(xx) >= 2:
- line = xx[1]
- else:
- line = ""
- break
-
- if line != "":
- for item in line.split(sep):
- data.append(_convert_item(item, ch, line))
- return data
-
-def escape_string(str):
- return str.replace("/", "//")
-
-def extract_rows(data, *rows):
- """Extract rows specified in the argument list.
-
->>> chart_data.extract_rows([[10,20], [30,40], [50,60]], 1, 2)
-[[30,40],[50,60]]
-"""
- try:
- # for python 2.2
- # return [data[r] for r in rows]
- out = []
- for r in rows:
- out.append(data[r])
- return out
- except IndexError:
- raise IndexError, "data=%s rows=%s" % (data, rows)
- return out
-
-def extract_columns(data, *cols):
- """Extract columns specified in the argument list.
-
->>> chart_data.extract_columns([[10,20], [30,40], [50,60]], 0)
-[[10],[30],[50]]
-"""
- out = []
- try:
- # for python 2.2:
- # return [ [r[c] for c in cols] for r in data]
- for r in data:
- col = []
- for c in cols:
- col.append(r[c])
- out.append(col)
- except IndexError:
- raise IndexError, "data=%s col=%s" % (data, col)
- return out
-
-
-
-
-def moving_average(data, xcol, ycol, width):
- """Compute the moving average of YCOL'th column of each sample point
-in DATA. In particular, for each element I in DATA,
-this function extracts up to WIDTH*2+1 elements, consisting of
- I itself, WIDTH elements before I, and WIDTH
-elements after I. It then computes the mean of the YCOL'th
-column of these elements, and it composes a two-element sample
-consisting of XCOL'th element and the mean.
-
->>> data = [[10,20], [20,30], [30,50], [40,70], [50,5]]
-... chart_data.moving_average(data, 0, 1, 1)
-[(10, 25.0), (20, 33.333333333333336), (30, 50.0), (40, 41.666666666666664), (50, 37.5)]
-
- The above value actually represents:
-
-[(10, (20+30)/2), (20, (20+30+50)/3), (30, (30+50+70)/3),
- (40, (50+70+5)/3), (50, (70+5)/2)]
-
-"""
-
-
- out = []
- try:
- for i in range(len(data)):
- n = 0
- total = 0
- for j in range(i-width, i+width+1):
- if j >= 0 and j < len(data):
- total += data[j][ycol]
- n += 1
- out.append((data[i][xcol], float(total) / n))
- except IndexError:
- raise IndexError, "bad data: %s,xcol=%d,ycol=%d,width=%d" % (data,xcol,ycol,width)
-
- return out
-
-def filter(func, data):
- """Parameter must be a single-argument
- function that takes a sequence (i.e.,
-a sample point) and returns a boolean. This procedure calls on
-each element in and returns a list comprising elements for
-which returns True.
-
->>> data = [[1,5], [2,10], [3,13], [4,16]]
-... chart_data.filter(lambda x: x[1] % 2 == 0, data)
-[[2,10], [4,16]].
-"""
-
- out = []
- for r in data:
- if func(r):
- out.append(r)
- return out
-
-def transform(func, data):
- """Apply on each element in and return the list
-consisting of the return values from .
-
->>> data = [[10,20], [30,40], [50,60]]
-... chart_data.transform(lambda x: [x[0], x[1]+1], data)
-[[10, 21], [30, 41], [50, 61]]
-
-"""
- out = []
- for r in data:
- out.append(func(r))
- return out
-
-def aggregate_rows(data, col):
- out = copy.deepcopy(data)
- total = 0
- for r in out:
- total += r[col]
- r[col] = total
- return out
-
-def empty_line_p(s):
- return s.strip() == ""
-
-def fread_csv(fd, delim = ','):
- """This function is similar to read_csv, except that it reads from
- an open file handle , or any object that provides method "readline".
-
-fd = open("foo", "r")
-data = chart_data.fread_csv(fd, ",") """
-
- data = []
- line = fd.readline()
- while line != "":
- if line[0] != '#' and not empty_line_p(line):
- data.append(parse_line(line, delim))
- line = fd.readline()
- return data
-
-def read_csv(path, delim = ','):
- """This function reads
- comma-separated values from file . Empty lines and lines
- beginning with "#" are ignored. Parameter specifies how
- a line is separated into values. If it does not contain the
- letter "%", then marks the end of a value.
- Otherwise, this function acts like scanf in C:
-
-chart_data.read_csv("file", "%d,%s:%d")
-
- Paramter currently supports
- only three conversion format specifiers:
- "d"(int), "f"(double), and "s"(string)."""
-
- f = open(path)
- data = fread_csv(f, delim)
- f.close()
- return data
-
-def fwrite_csv(fd, data):
- """This function writes comma-separated to . Parameter must be a file-like object
- that supports the |write()| method."""
- for v in data:
- fd.write(",".join([str(x) for x in v]))
- fd.write("\n")
-
-def write_csv(path, data):
- """This function writes comma-separated values to ."""
- fd = file(path, "w")
- fwrite_csv(fd, data)
- fd.close()
-
-def read_str(delim = ',', *lines):
- """This function is similar to read_csv, but it reads data from the
- list of .
-
-fd = open("foo", "r")
-data = chart_data.read_str(",", fd.readlines())"""
-
- data = []
- for line in lines:
- com = parse_line(line, delim)
- data.append(com)
- return data
-
-def func(f, xmin, xmax, step = None):
- """Create sample points from function , which must be a
- single-parameter function that returns a number (e.g., math.sin).
- Parameters and specify the first and last X values, and
- specifies the sampling interval.
-
->>> chart_data.func(math.sin, 0, math.pi * 4, math.pi / 2)
-[(0, 0.0), (1.5707963267948966, 1.0), (3.1415926535897931, 1.2246063538223773e-16), (4.7123889803846897, -1.0), (6.2831853071795862, -2.4492127076447545e-16), (7.8539816339744828, 1.0), (9.4247779607693793, 3.6738190614671318e-16), (10.995574287564276, -1.0)]
-
-"""
-
- data = []
- x = xmin
- if not step:
- step = (xmax - xmin) / 100.0
- while x < xmax:
- data.append((x, f(x)))
- x += step
- return data
-
-def _nr_data(data, col):
- nr_data = 0
- for d in data:
- nr_data += d[col]
- return nr_data
-
-def median(data, freq_col=1):
- """Compute the median of the 'th column of the values is .
-
->>> chart_data.median([(10,20), (20,4), (30,5)], 0)
-20
->>> chart_data.median([(10,20), (20,4), (30,5)], 1)
-5.
- """
-
- nr_data = _nr_data(data, freq_col)
- median_idx = nr_data / 2
- i = 0
- for d in data:
- i += d[freq_col]
- if i >= median_idx:
- return d
- raise Exception, "??? median ???"
-
-def cut_extremes(data, cutoff_percentage, freq_col=1):
- nr_data = _nr_data(data, freq_col)
- min_idx = nr_data * cutoff_percentage / 100.0
- max_idx = nr_data * (100 - cutoff_percentage) / 100.0
- r = []
-
- i = 0
- for d in data:
- if i < min_idx:
- if i + d[freq_col] >= min_idx:
- x = copy.deepcopy(d)
- x[freq_col] = x[freq_col] - (min_idx - i)
- r.append(x)
- i += d[freq_col]
- continue
- elif i + d[freq_col] >= max_idx:
- if i < max_idx and i + d[freq_col] >= max_idx:
- x = copy.deepcopy(d)
- x[freq_col] = x[freq_col] - (max_idx - i)
- r.append(x)
- break
- i += d[freq_col]
- r.append(d)
- return r
-
-def mean(data, val_col, freq_col):
- nr_data = 0
- sum = 0
- for d in data:
- sum += d[val_col] * d[freq_col]
- nr_data += d[freq_col]
- if nr_data == 0:
- raise IndexError, "data is empty"
-
- return sum / float(nr_data)
-
-def mean_samples(data, xcol, ycollist):
- """Create a sample list that contains
- the mean of the original list.
-
->>> chart_data.mean_samples([ [1, 10, 15], [2, 5, 10], [3, 8, 33] ], 0, (1, 2))
-[(1, 12.5), (2, 7.5), (3, 20.5)]
-"""
- out = []
- numcol = len(ycollist)
- try:
- for elem in data:
- v = 0
- for col in ycollist:
- v += elem[col]
- out.append( (elem[xcol], float(v) / numcol) )
- except IndexError:
- raise IndexError, "bad data: %s,xcol=%d,ycollist=%s" % (data,xcol,ycollist)
-
- return out
-
-def stddev_samples(data, xcol, ycollist, delta = 1.0):
- """Create a sample list that contains the mean and standard deviation of the original list. Each element in the returned list contains following values: [MEAN, STDDEV, MEAN - STDDEV*delta, MEAN + STDDEV*delta].
-
->>> chart_data.stddev_samples([ [1, 10, 15, 12, 15], [2, 5, 10, 5, 10], [3, 32, 33, 35, 36], [4,16,66, 67, 68] ], 0, range(1,5))
-[(1, 13.0, 2.1213203435596424, 10.878679656440358, 15.121320343559642), (2, 7.5, 2.5, 5.0, 10.0), (3, 34.0, 1.5811388300841898, 32.418861169915807, 35.581138830084193), (4, 54.25, 22.094965489902897, 32.155034510097103, 76.344965489902904)]
-"""
- out = []
- numcol = len(ycollist)
- try:
- for elem in data:
- total = 0
- for col in ycollist:
- total += elem[col]
- mean = float(total) / numcol
- variance = 0
- for col in ycollist:
- variance += (mean - elem[col]) ** 2
- stddev = math.sqrt(variance / numcol) * delta
- out.append( (elem[xcol], mean, stddev, mean-stddev, mean+stddev) )
-
-
-
- except IndexError:
- raise IndexError, "bad data: %s,xcol=%d,ycollist=%s" % (data,xcol,ycollist)
- return out
-
-def nearest_match(data, col, val):
- min_delta = None
- match = None
-
- for d in data:
- if min_delta == None or abs(d[col] - val) < min_delta:
- min_delta = abs(d[col] - val)
- match = d
- pychart_util.warn("XXX ", match)
- return match
diff --git a/bin/pychart/chart_object.py b/bin/pychart/chart_object.py
deleted file mode 100644
index f23fbadd0c0..00000000000
--- a/bin/pychart/chart_object.py
+++ /dev/null
@@ -1,73 +0,0 @@
-#
-# Copyright (C) 2000-2005 by Yasushi Saito (yasushi.saito@gmail.com)
-#
-# Jockey is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2, or (at your option) any
-# later version.
-#
-# Jockey is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# for more details.
-#
-import pychart_types
-import types
-
-def _check_attr_types(obj, keys):
- for attr in obj.__dict__.keys():
- if not keys.has_key(attr):
- raise Exception, "%s: unknown attribute '%s'" % (obj, attr)
-
- typeval, default_value, docstring = keys[attr][0:3]
- val = getattr(obj, attr)
- if val == None or typeval == pychart_types.AnyType:
- pass
- elif isinstance(typeval, types.FunctionType):
- # user-defined check procedure
- error = apply(typeval, (val,))
- if error != None:
- raise Exception, "%s: %s for attribute '%s', but got '%s'" % (obj, error, attr, val)
- elif 1:
- try:
- if isinstance(val, typeval):
- pass
- except:
- raise Exception, "%s: Expecting type %s, but got %s (attr=%s, %s)" % (obj, typeval, val, attr, keys[attr])
-
- else:
- raise Exception, "%s: attribute '%s' expects type %s but found %s" % (obj, attr, typeval, val)
-
-def set_defaults(cls, **dict):
- validAttrs = getattr(cls, "keys")
- for attr, val in dict.items():
- if not validAttrs.has_key(attr):
- raise Exception, "%s: unknown attribute %s." % (cls, attr)
- tuple = list(validAttrs[attr])
- # 0 : type
- # 1: defaultValue
- # 2: document
- # 3: defaultValue document (optional)
- tuple[1] = val
- validAttrs[attr] = tuple
-
-class T(object):
- def init(self, args):
- keys = self.keys
- for attr, tuple in keys.items():
- defaultVal = tuple[1]
- if isinstance(defaultVal, types.FunctionType):
- # if the value is procedure, use the result of the proc call
- # as the default value
- defaultVal = apply(defaultVal, ())
- setattr(self, attr, defaultVal)
-
- for key, val in args.items():
- setattr(self, key, val)
- _check_attr_types(self, keys)
-
- def __init__(self, **args):
- self.init(args)
-
- def type_check(self):
- _check_attr_types(self, self.keys)
diff --git a/bin/pychart/color.py b/bin/pychart/color.py
deleted file mode 100644
index 3e1066d319d..00000000000
--- a/bin/pychart/color.py
+++ /dev/null
@@ -1,611 +0,0 @@
-#
-# Copyright (C) 2000-2005 by Yasushi Saito (yasushi.saito@gmail.com)
-#
-# Jockey is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2, or (at your option) any
-# later version.
-#
-# Jockey is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# for more details.
-#
-import chart_object
-import object_set
-import types
-import theme
-import pychart_util
-import color_doc
-from pychart_types import *
-
-blackify_colors = 1
-
-class T(chart_object.T):
- __doc__ = color_doc.doc
- keys={
- "r" : (NumType, 0.0, "The intensity of red. The value is between 0 and 1."),
- "g" : (NumType, 0.0, "The intensity of green. The value is between 0 and 1."),
- "b" : (NumType, 0.0, "The intensity of blue. The value is between 0 and 1.")
- }
-##AUTOMATICALLY GENERATED
-##END AUTOMATICALLY GENERATED
- def __str__(self):
- s = name_table().lookup(self)
- if s:
- return s
- if self.r == self.g and self.r == self.b:
- return "" % self.r
- else:
- return "" % (self.r, self.g, self.b)
-
-standards = object_set.T()
-def _intern(r,g,b):
- c = T(r = r, g = g, b = b)
- standards.add(c)
- return c
-
-def gray_scale(g):
- """Generate a grayscale color.T object. G=0 produces white, G=1.0
- produces black."""
- return T(r=g,g=g,b=g)
-
-# generated automatically from rgb.txt
-
-snow = _intern(r=1.000000,g=0.980392,b=0.980392)
-ghostwhite = _intern(r=0.972549,g=0.972549,b=1.000000)
-whitesmoke = _intern(r=0.960784,g=0.960784,b=0.960784)
-gainsboro = _intern(r=0.862745,g=0.862745,b=0.862745)
-floralwhite = _intern(r=1.000000,g=0.980392,b=0.941176)
-oldlace = _intern(r=0.992157,g=0.960784,b=0.901961)
-linen = _intern(r=0.980392,g=0.941176,b=0.901961)
-antiquewhite = _intern(r=0.980392,g=0.921569,b=0.843137)
-papayawhip = _intern(r=1.000000,g=0.937255,b=0.835294)
-blanchedalmond = _intern(r=1.000000,g=0.921569,b=0.803922)
-bisque = _intern(r=1.000000,g=0.894118,b=0.768627)
-peachpuff = _intern(r=1.000000,g=0.854902,b=0.725490)
-navajowhite = _intern(r=1.000000,g=0.870588,b=0.678431)
-moccasin = _intern(r=1.000000,g=0.894118,b=0.709804)
-cornsilk = _intern(r=1.000000,g=0.972549,b=0.862745)
-ivory = _intern(r=1.000000,g=1.000000,b=0.941176)
-lemonchiffon = _intern(r=1.000000,g=0.980392,b=0.803922)
-seashell = _intern(r=1.000000,g=0.960784,b=0.933333)
-honeydew = _intern(r=0.941176,g=1.000000,b=0.941176)
-mintcream = _intern(r=0.960784,g=1.000000,b=0.980392)
-azure = _intern(r=0.941176,g=1.000000,b=1.000000)
-aliceblue = _intern(r=0.941176,g=0.972549,b=1.000000)
-lavender = _intern(r=0.901961,g=0.901961,b=0.980392)
-lavenderblush = _intern(r=1.000000,g=0.941176,b=0.960784)
-mistyrose = _intern(r=1.000000,g=0.894118,b=0.882353)
-white = _intern(r=1.000000,g=1.000000,b=1.000000)
-black = _intern(r=0.000000,g=0.000000,b=0.000000)
-darkslategray = _intern(r=0.184314,g=0.309804,b=0.309804)
-dimgray = _intern(r=0.411765,g=0.411765,b=0.411765)
-slategray = _intern(r=0.439216,g=0.501961,b=0.564706)
-lightslategray = _intern(r=0.466667,g=0.533333,b=0.600000)
-gray = _intern(r=0.745098,g=0.745098,b=0.745098)
-lightgray = _intern(r=0.827451,g=0.827451,b=0.827451)
-midnightblue = _intern(r=0.098039,g=0.098039,b=0.439216)
-navy = _intern(r=0.000000,g=0.000000,b=0.501961)
-navyblue = _intern(r=0.000000,g=0.000000,b=0.501961)
-cornflowerblue = _intern(r=0.392157,g=0.584314,b=0.929412)
-darkslateblue = _intern(r=0.282353,g=0.239216,b=0.545098)
-slateblue = _intern(r=0.415686,g=0.352941,b=0.803922)
-mediumslateblue = _intern(r=0.482353,g=0.407843,b=0.933333)
-lightslateblue = _intern(r=0.517647,g=0.439216,b=1.000000)
-mediumblue = _intern(r=0.000000,g=0.000000,b=0.803922)
-royalblue = _intern(r=0.254902,g=0.411765,b=0.882353)
-blue = _intern(r=0.000000,g=0.000000,b=1.000000)
-dodgerblue = _intern(r=0.117647,g=0.564706,b=1.000000)
-deepskyblue = _intern(r=0.000000,g=0.749020,b=1.000000)
-skyblue = _intern(r=0.529412,g=0.807843,b=0.921569)
-lightskyblue = _intern(r=0.529412,g=0.807843,b=0.980392)
-steelblue = _intern(r=0.274510,g=0.509804,b=0.705882)
-lightsteelblue = _intern(r=0.690196,g=0.768627,b=0.870588)
-lightblue = _intern(r=0.678431,g=0.847059,b=0.901961)
-powderblue = _intern(r=0.690196,g=0.878431,b=0.901961)
-paleturquoise = _intern(r=0.686275,g=0.933333,b=0.933333)
-darkturquoise = _intern(r=0.000000,g=0.807843,b=0.819608)
-mediumturquoise = _intern(r=0.282353,g=0.819608,b=0.800000)
-turquoise = _intern(r=0.250980,g=0.878431,b=0.815686)
-cyan = _intern(r=0.000000,g=1.000000,b=1.000000)
-lightcyan = _intern(r=0.878431,g=1.000000,b=1.000000)
-cadetblue = _intern(r=0.372549,g=0.619608,b=0.627451)
-mediumaquamarine = _intern(r=0.400000,g=0.803922,b=0.666667)
-aquamarine = _intern(r=0.498039,g=1.000000,b=0.831373)
-darkgreen = _intern(r=0.000000,g=0.392157,b=0.000000)
-darkolivegreen = _intern(r=0.333333,g=0.419608,b=0.184314)
-darkseagreen = _intern(r=0.560784,g=0.737255,b=0.560784)
-seagreen = _intern(r=0.180392,g=0.545098,b=0.341176)
-mediumseagreen = _intern(r=0.235294,g=0.701961,b=0.443137)
-lightseagreen = _intern(r=0.125490,g=0.698039,b=0.666667)
-palegreen = _intern(r=0.596078,g=0.984314,b=0.596078)
-springgreen = _intern(r=0.000000,g=1.000000,b=0.498039)
-lawngreen = _intern(r=0.486275,g=0.988235,b=0.000000)
-green = _intern(r=0.000000,g=1.000000,b=0.000000)
-chartreuse = _intern(r=0.498039,g=1.000000,b=0.000000)
-mediumspringgreen = _intern(r=0.000000,g=0.980392,b=0.603922)
-greenyellow = _intern(r=0.678431,g=1.000000,b=0.184314)
-limegreen = _intern(r=0.196078,g=0.803922,b=0.196078)
-yellowgreen = _intern(r=0.603922,g=0.803922,b=0.196078)
-forestgreen = _intern(r=0.133333,g=0.545098,b=0.133333)
-olivedrab = _intern(r=0.419608,g=0.556863,b=0.137255)
-darkkhaki = _intern(r=0.741176,g=0.717647,b=0.419608)
-khaki = _intern(r=0.941176,g=0.901961,b=0.549020)
-palegoldenrod = _intern(r=0.933333,g=0.909804,b=0.666667)
-lightgoldenrodyellow = _intern(r=0.980392,g=0.980392,b=0.823529)
-lightyellow = _intern(r=1.000000,g=1.000000,b=0.878431)
-yellow = _intern(r=1.000000,g=1.000000,b=0.000000)
-gold = _intern(r=1.000000,g=0.843137,b=0.000000)
-lightgoldenrod = _intern(r=0.933333,g=0.866667,b=0.509804)
-goldenrod = _intern(r=0.854902,g=0.647059,b=0.125490)
-darkgoldenrod = _intern(r=0.721569,g=0.525490,b=0.043137)
-rosybrown = _intern(r=0.737255,g=0.560784,b=0.560784)
-indianred = _intern(r=0.803922,g=0.360784,b=0.360784)
-saddlebrown = _intern(r=0.545098,g=0.270588,b=0.074510)
-sienna = _intern(r=0.627451,g=0.321569,b=0.176471)
-peru = _intern(r=0.803922,g=0.521569,b=0.247059)
-burlywood = _intern(r=0.870588,g=0.721569,b=0.529412)
-beige = _intern(r=0.960784,g=0.960784,b=0.862745)
-wheat = _intern(r=0.960784,g=0.870588,b=0.701961)
-sandybrown = _intern(r=0.956863,g=0.643137,b=0.376471)
-tan = _intern(r=0.823529,g=0.705882,b=0.549020)
-chocolate = _intern(r=0.823529,g=0.411765,b=0.117647)
-firebrick = _intern(r=0.698039,g=0.133333,b=0.133333)
-brown = _intern(r=0.647059,g=0.164706,b=0.164706)
-darksalmon = _intern(r=0.913725,g=0.588235,b=0.478431)
-salmon = _intern(r=0.980392,g=0.501961,b=0.447059)
-lightsalmon = _intern(r=1.000000,g=0.627451,b=0.478431)
-orange = _intern(r=1.000000,g=0.647059,b=0.000000)
-darkorange = _intern(r=1.000000,g=0.549020,b=0.000000)
-coral = _intern(r=1.000000,g=0.498039,b=0.313725)
-lightcoral = _intern(r=0.941176,g=0.501961,b=0.501961)
-tomato = _intern(r=1.000000,g=0.388235,b=0.278431)
-orangered = _intern(r=1.000000,g=0.270588,b=0.000000)
-red = _intern(r=1.000000,g=0.000000,b=0.000000)
-hotpink = _intern(r=1.000000,g=0.411765,b=0.705882)
-deeppink = _intern(r=1.000000,g=0.078431,b=0.576471)
-pink = _intern(r=1.000000,g=0.752941,b=0.796078)
-lightpink = _intern(r=1.000000,g=0.713725,b=0.756863)
-palevioletred = _intern(r=0.858824,g=0.439216,b=0.576471)
-maroon = _intern(r=0.690196,g=0.188235,b=0.376471)
-mediumvioletred = _intern(r=0.780392,g=0.082353,b=0.521569)
-violetred = _intern(r=0.815686,g=0.125490,b=0.564706)
-magenta = _intern(r=1.000000,g=0.000000,b=1.000000)
-violet = _intern(r=0.933333,g=0.509804,b=0.933333)
-plum = _intern(r=0.866667,g=0.627451,b=0.866667)
-orchid = _intern(r=0.854902,g=0.439216,b=0.839216)
-mediumorchid = _intern(r=0.729412,g=0.333333,b=0.827451)
-darkorchid = _intern(r=0.600000,g=0.196078,b=0.800000)
-darkviolet = _intern(r=0.580392,g=0.000000,b=0.827451)
-blueviolet = _intern(r=0.541176,g=0.168627,b=0.886275)
-purple = _intern(r=0.627451,g=0.125490,b=0.941176)
-mediumpurple = _intern(r=0.576471,g=0.439216,b=0.858824)
-thistle = _intern(r=0.847059,g=0.749020,b=0.847059)
-snow1 = _intern(r=1.000000,g=0.980392,b=0.980392)
-snow2 = _intern(r=0.933333,g=0.913725,b=0.913725)
-snow3 = _intern(r=0.803922,g=0.788235,b=0.788235)
-snow4 = _intern(r=0.545098,g=0.537255,b=0.537255)
-seashell1 = _intern(r=1.000000,g=0.960784,b=0.933333)
-seashell2 = _intern(r=0.933333,g=0.898039,b=0.870588)
-seashell3 = _intern(r=0.803922,g=0.772549,b=0.749020)
-seashell4 = _intern(r=0.545098,g=0.525490,b=0.509804)
-antiquewhite1 = _intern(r=1.000000,g=0.937255,b=0.858824)
-antiquewhite2 = _intern(r=0.933333,g=0.874510,b=0.800000)
-antiquewhite3 = _intern(r=0.803922,g=0.752941,b=0.690196)
-antiquewhite4 = _intern(r=0.545098,g=0.513725,b=0.470588)
-bisque1 = _intern(r=1.000000,g=0.894118,b=0.768627)
-bisque2 = _intern(r=0.933333,g=0.835294,b=0.717647)
-bisque3 = _intern(r=0.803922,g=0.717647,b=0.619608)
-bisque4 = _intern(r=0.545098,g=0.490196,b=0.419608)
-peachpuff1 = _intern(r=1.000000,g=0.854902,b=0.725490)
-peachpuff2 = _intern(r=0.933333,g=0.796078,b=0.678431)
-peachpuff3 = _intern(r=0.803922,g=0.686275,b=0.584314)
-peachpuff4 = _intern(r=0.545098,g=0.466667,b=0.396078)
-navajowhite1 = _intern(r=1.000000,g=0.870588,b=0.678431)
-navajowhite2 = _intern(r=0.933333,g=0.811765,b=0.631373)
-navajowhite3 = _intern(r=0.803922,g=0.701961,b=0.545098)
-navajowhite4 = _intern(r=0.545098,g=0.474510,b=0.368627)
-lemonchiffon1 = _intern(r=1.000000,g=0.980392,b=0.803922)
-lemonchiffon2 = _intern(r=0.933333,g=0.913725,b=0.749020)
-lemonchiffon3 = _intern(r=0.803922,g=0.788235,b=0.647059)
-lemonchiffon4 = _intern(r=0.545098,g=0.537255,b=0.439216)
-cornsilk1 = _intern(r=1.000000,g=0.972549,b=0.862745)
-cornsilk2 = _intern(r=0.933333,g=0.909804,b=0.803922)
-cornsilk3 = _intern(r=0.803922,g=0.784314,b=0.694118)
-cornsilk4 = _intern(r=0.545098,g=0.533333,b=0.470588)
-ivory1 = _intern(r=1.000000,g=1.000000,b=0.941176)
-ivory2 = _intern(r=0.933333,g=0.933333,b=0.878431)
-ivory3 = _intern(r=0.803922,g=0.803922,b=0.756863)
-ivory4 = _intern(r=0.545098,g=0.545098,b=0.513725)
-honeydew1 = _intern(r=0.941176,g=1.000000,b=0.941176)
-honeydew2 = _intern(r=0.878431,g=0.933333,b=0.878431)
-honeydew3 = _intern(r=0.756863,g=0.803922,b=0.756863)
-honeydew4 = _intern(r=0.513725,g=0.545098,b=0.513725)
-lavenderblush1 = _intern(r=1.000000,g=0.941176,b=0.960784)
-lavenderblush2 = _intern(r=0.933333,g=0.878431,b=0.898039)
-lavenderblush3 = _intern(r=0.803922,g=0.756863,b=0.772549)
-lavenderblush4 = _intern(r=0.545098,g=0.513725,b=0.525490)
-mistyrose1 = _intern(r=1.000000,g=0.894118,b=0.882353)
-mistyrose2 = _intern(r=0.933333,g=0.835294,b=0.823529)
-mistyrose3 = _intern(r=0.803922,g=0.717647,b=0.709804)
-mistyrose4 = _intern(r=0.545098,g=0.490196,b=0.482353)
-azure1 = _intern(r=0.941176,g=1.000000,b=1.000000)
-azure2 = _intern(r=0.878431,g=0.933333,b=0.933333)
-azure3 = _intern(r=0.756863,g=0.803922,b=0.803922)
-azure4 = _intern(r=0.513725,g=0.545098,b=0.545098)
-slateblue1 = _intern(r=0.513725,g=0.435294,b=1.000000)
-slateblue2 = _intern(r=0.478431,g=0.403922,b=0.933333)
-slateblue3 = _intern(r=0.411765,g=0.349020,b=0.803922)
-slateblue4 = _intern(r=0.278431,g=0.235294,b=0.545098)
-royalblue1 = _intern(r=0.282353,g=0.462745,b=1.000000)
-royalblue2 = _intern(r=0.262745,g=0.431373,b=0.933333)
-royalblue3 = _intern(r=0.227451,g=0.372549,b=0.803922)
-royalblue4 = _intern(r=0.152941,g=0.250980,b=0.545098)
-blue1 = _intern(r=0.000000,g=0.000000,b=1.000000)
-blue2 = _intern(r=0.000000,g=0.000000,b=0.933333)
-blue3 = _intern(r=0.000000,g=0.000000,b=0.803922)
-blue4 = _intern(r=0.000000,g=0.000000,b=0.545098)
-dodgerblue1 = _intern(r=0.117647,g=0.564706,b=1.000000)
-dodgerblue2 = _intern(r=0.109804,g=0.525490,b=0.933333)
-dodgerblue3 = _intern(r=0.094118,g=0.454902,b=0.803922)
-dodgerblue4 = _intern(r=0.062745,g=0.305882,b=0.545098)
-steelblue1 = _intern(r=0.388235,g=0.721569,b=1.000000)
-steelblue2 = _intern(r=0.360784,g=0.674510,b=0.933333)
-steelblue3 = _intern(r=0.309804,g=0.580392,b=0.803922)
-steelblue4 = _intern(r=0.211765,g=0.392157,b=0.545098)
-deepskyblue1 = _intern(r=0.000000,g=0.749020,b=1.000000)
-deepskyblue2 = _intern(r=0.000000,g=0.698039,b=0.933333)
-deepskyblue3 = _intern(r=0.000000,g=0.603922,b=0.803922)
-deepskyblue4 = _intern(r=0.000000,g=0.407843,b=0.545098)
-skyblue1 = _intern(r=0.529412,g=0.807843,b=1.000000)
-skyblue2 = _intern(r=0.494118,g=0.752941,b=0.933333)
-skyblue3 = _intern(r=0.423529,g=0.650980,b=0.803922)
-skyblue4 = _intern(r=0.290196,g=0.439216,b=0.545098)
-lightskyblue1 = _intern(r=0.690196,g=0.886275,b=1.000000)
-lightskyblue2 = _intern(r=0.643137,g=0.827451,b=0.933333)
-lightskyblue3 = _intern(r=0.552941,g=0.713725,b=0.803922)
-lightskyblue4 = _intern(r=0.376471,g=0.482353,b=0.545098)
-slategray1 = _intern(r=0.776471,g=0.886275,b=1.000000)
-slategray2 = _intern(r=0.725490,g=0.827451,b=0.933333)
-slategray3 = _intern(r=0.623529,g=0.713725,b=0.803922)
-slategray4 = _intern(r=0.423529,g=0.482353,b=0.545098)
-lightsteelblue1 = _intern(r=0.792157,g=0.882353,b=1.000000)
-lightsteelblue2 = _intern(r=0.737255,g=0.823529,b=0.933333)
-lightsteelblue3 = _intern(r=0.635294,g=0.709804,b=0.803922)
-lightsteelblue4 = _intern(r=0.431373,g=0.482353,b=0.545098)
-lightblue1 = _intern(r=0.749020,g=0.937255,b=1.000000)
-lightblue2 = _intern(r=0.698039,g=0.874510,b=0.933333)
-lightblue3 = _intern(r=0.603922,g=0.752941,b=0.803922)
-lightblue4 = _intern(r=0.407843,g=0.513725,b=0.545098)
-lightcyan1 = _intern(r=0.878431,g=1.000000,b=1.000000)
-lightcyan2 = _intern(r=0.819608,g=0.933333,b=0.933333)
-lightcyan3 = _intern(r=0.705882,g=0.803922,b=0.803922)
-lightcyan4 = _intern(r=0.478431,g=0.545098,b=0.545098)
-paleturquoise1 = _intern(r=0.733333,g=1.000000,b=1.000000)
-paleturquoise2 = _intern(r=0.682353,g=0.933333,b=0.933333)
-paleturquoise3 = _intern(r=0.588235,g=0.803922,b=0.803922)
-paleturquoise4 = _intern(r=0.400000,g=0.545098,b=0.545098)
-cadetblue1 = _intern(r=0.596078,g=0.960784,b=1.000000)
-cadetblue2 = _intern(r=0.556863,g=0.898039,b=0.933333)
-cadetblue3 = _intern(r=0.478431,g=0.772549,b=0.803922)
-cadetblue4 = _intern(r=0.325490,g=0.525490,b=0.545098)
-turquoise1 = _intern(r=0.000000,g=0.960784,b=1.000000)
-turquoise2 = _intern(r=0.000000,g=0.898039,b=0.933333)
-turquoise3 = _intern(r=0.000000,g=0.772549,b=0.803922)
-turquoise4 = _intern(r=0.000000,g=0.525490,b=0.545098)
-cyan1 = _intern(r=0.000000,g=1.000000,b=1.000000)
-cyan2 = _intern(r=0.000000,g=0.933333,b=0.933333)
-cyan3 = _intern(r=0.000000,g=0.803922,b=0.803922)
-cyan4 = _intern(r=0.000000,g=0.545098,b=0.545098)
-darkslategray1 = _intern(r=0.592157,g=1.000000,b=1.000000)
-darkslategray2 = _intern(r=0.552941,g=0.933333,b=0.933333)
-darkslategray3 = _intern(r=0.474510,g=0.803922,b=0.803922)
-darkslategray4 = _intern(r=0.321569,g=0.545098,b=0.545098)
-aquamarine1 = _intern(r=0.498039,g=1.000000,b=0.831373)
-aquamarine2 = _intern(r=0.462745,g=0.933333,b=0.776471)
-aquamarine3 = _intern(r=0.400000,g=0.803922,b=0.666667)
-aquamarine4 = _intern(r=0.270588,g=0.545098,b=0.454902)
-darkseagreen1 = _intern(r=0.756863,g=1.000000,b=0.756863)
-darkseagreen2 = _intern(r=0.705882,g=0.933333,b=0.705882)
-darkseagreen3 = _intern(r=0.607843,g=0.803922,b=0.607843)
-darkseagreen4 = _intern(r=0.411765,g=0.545098,b=0.411765)
-seagreen1 = _intern(r=0.329412,g=1.000000,b=0.623529)
-seagreen2 = _intern(r=0.305882,g=0.933333,b=0.580392)
-seagreen3 = _intern(r=0.262745,g=0.803922,b=0.501961)
-seagreen4 = _intern(r=0.180392,g=0.545098,b=0.341176)
-palegreen1 = _intern(r=0.603922,g=1.000000,b=0.603922)
-palegreen2 = _intern(r=0.564706,g=0.933333,b=0.564706)
-palegreen3 = _intern(r=0.486275,g=0.803922,b=0.486275)
-palegreen4 = _intern(r=0.329412,g=0.545098,b=0.329412)
-springgreen1 = _intern(r=0.000000,g=1.000000,b=0.498039)
-springgreen2 = _intern(r=0.000000,g=0.933333,b=0.462745)
-springgreen3 = _intern(r=0.000000,g=0.803922,b=0.400000)
-springgreen4 = _intern(r=0.000000,g=0.545098,b=0.270588)
-green1 = _intern(r=0.000000,g=1.000000,b=0.000000)
-green2 = _intern(r=0.000000,g=0.933333,b=0.000000)
-green3 = _intern(r=0.000000,g=0.803922,b=0.000000)
-green4 = _intern(r=0.000000,g=0.545098,b=0.000000)
-chartreuse1 = _intern(r=0.498039,g=1.000000,b=0.000000)
-chartreuse2 = _intern(r=0.462745,g=0.933333,b=0.000000)
-chartreuse3 = _intern(r=0.400000,g=0.803922,b=0.000000)
-chartreuse4 = _intern(r=0.270588,g=0.545098,b=0.000000)
-olivedrab1 = _intern(r=0.752941,g=1.000000,b=0.243137)
-olivedrab2 = _intern(r=0.701961,g=0.933333,b=0.227451)
-olivedrab3 = _intern(r=0.603922,g=0.803922,b=0.196078)
-olivedrab4 = _intern(r=0.411765,g=0.545098,b=0.133333)
-darkolivegreen1 = _intern(r=0.792157,g=1.000000,b=0.439216)
-darkolivegreen2 = _intern(r=0.737255,g=0.933333,b=0.407843)
-darkolivegreen3 = _intern(r=0.635294,g=0.803922,b=0.352941)
-darkolivegreen4 = _intern(r=0.431373,g=0.545098,b=0.239216)
-khaki1 = _intern(r=1.000000,g=0.964706,b=0.560784)
-khaki2 = _intern(r=0.933333,g=0.901961,b=0.521569)
-khaki3 = _intern(r=0.803922,g=0.776471,b=0.450980)
-khaki4 = _intern(r=0.545098,g=0.525490,b=0.305882)
-lightgoldenrod1 = _intern(r=1.000000,g=0.925490,b=0.545098)
-lightgoldenrod2 = _intern(r=0.933333,g=0.862745,b=0.509804)
-lightgoldenrod3 = _intern(r=0.803922,g=0.745098,b=0.439216)
-lightgoldenrod4 = _intern(r=0.545098,g=0.505882,b=0.298039)
-lightyellow1 = _intern(r=1.000000,g=1.000000,b=0.878431)
-lightyellow2 = _intern(r=0.933333,g=0.933333,b=0.819608)
-lightyellow3 = _intern(r=0.803922,g=0.803922,b=0.705882)
-lightyellow4 = _intern(r=0.545098,g=0.545098,b=0.478431)
-yellow1 = _intern(r=1.000000,g=1.000000,b=0.000000)
-yellow2 = _intern(r=0.933333,g=0.933333,b=0.000000)
-yellow3 = _intern(r=0.803922,g=0.803922,b=0.000000)
-yellow4 = _intern(r=0.545098,g=0.545098,b=0.000000)
-gold1 = _intern(r=1.000000,g=0.843137,b=0.000000)
-gold2 = _intern(r=0.933333,g=0.788235,b=0.000000)
-gold3 = _intern(r=0.803922,g=0.678431,b=0.000000)
-gold4 = _intern(r=0.545098,g=0.458824,b=0.000000)
-goldenrod1 = _intern(r=1.000000,g=0.756863,b=0.145098)
-goldenrod2 = _intern(r=0.933333,g=0.705882,b=0.133333)
-goldenrod3 = _intern(r=0.803922,g=0.607843,b=0.113725)
-goldenrod4 = _intern(r=0.545098,g=0.411765,b=0.078431)
-darkgoldenrod1 = _intern(r=1.000000,g=0.725490,b=0.058824)
-darkgoldenrod2 = _intern(r=0.933333,g=0.678431,b=0.054902)
-darkgoldenrod3 = _intern(r=0.803922,g=0.584314,b=0.047059)
-darkgoldenrod4 = _intern(r=0.545098,g=0.396078,b=0.031373)
-rosybrown1 = _intern(r=1.000000,g=0.756863,b=0.756863)
-rosybrown2 = _intern(r=0.933333,g=0.705882,b=0.705882)
-rosybrown3 = _intern(r=0.803922,g=0.607843,b=0.607843)
-rosybrown4 = _intern(r=0.545098,g=0.411765,b=0.411765)
-indianred1 = _intern(r=1.000000,g=0.415686,b=0.415686)
-indianred2 = _intern(r=0.933333,g=0.388235,b=0.388235)
-indianred3 = _intern(r=0.803922,g=0.333333,b=0.333333)
-indianred4 = _intern(r=0.545098,g=0.227451,b=0.227451)
-sienna1 = _intern(r=1.000000,g=0.509804,b=0.278431)
-sienna2 = _intern(r=0.933333,g=0.474510,b=0.258824)
-sienna3 = _intern(r=0.803922,g=0.407843,b=0.223529)
-sienna4 = _intern(r=0.545098,g=0.278431,b=0.149020)
-burlywood1 = _intern(r=1.000000,g=0.827451,b=0.607843)
-burlywood2 = _intern(r=0.933333,g=0.772549,b=0.568627)
-burlywood3 = _intern(r=0.803922,g=0.666667,b=0.490196)
-burlywood4 = _intern(r=0.545098,g=0.450980,b=0.333333)
-wheat1 = _intern(r=1.000000,g=0.905882,b=0.729412)
-wheat2 = _intern(r=0.933333,g=0.847059,b=0.682353)
-wheat3 = _intern(r=0.803922,g=0.729412,b=0.588235)
-wheat4 = _intern(r=0.545098,g=0.494118,b=0.400000)
-tan1 = _intern(r=1.000000,g=0.647059,b=0.309804)
-tan2 = _intern(r=0.933333,g=0.603922,b=0.286275)
-tan3 = _intern(r=0.803922,g=0.521569,b=0.247059)
-tan4 = _intern(r=0.545098,g=0.352941,b=0.168627)
-chocolate1 = _intern(r=1.000000,g=0.498039,b=0.141176)
-chocolate2 = _intern(r=0.933333,g=0.462745,b=0.129412)
-chocolate3 = _intern(r=0.803922,g=0.400000,b=0.113725)
-chocolate4 = _intern(r=0.545098,g=0.270588,b=0.074510)
-firebrick1 = _intern(r=1.000000,g=0.188235,b=0.188235)
-firebrick2 = _intern(r=0.933333,g=0.172549,b=0.172549)
-firebrick3 = _intern(r=0.803922,g=0.149020,b=0.149020)
-firebrick4 = _intern(r=0.545098,g=0.101961,b=0.101961)
-brown1 = _intern(r=1.000000,g=0.250980,b=0.250980)
-brown2 = _intern(r=0.933333,g=0.231373,b=0.231373)
-brown3 = _intern(r=0.803922,g=0.200000,b=0.200000)
-brown4 = _intern(r=0.545098,g=0.137255,b=0.137255)
-salmon1 = _intern(r=1.000000,g=0.549020,b=0.411765)
-salmon2 = _intern(r=0.933333,g=0.509804,b=0.384314)
-salmon3 = _intern(r=0.803922,g=0.439216,b=0.329412)
-salmon4 = _intern(r=0.545098,g=0.298039,b=0.223529)
-lightsalmon1 = _intern(r=1.000000,g=0.627451,b=0.478431)
-lightsalmon2 = _intern(r=0.933333,g=0.584314,b=0.447059)
-lightsalmon3 = _intern(r=0.803922,g=0.505882,b=0.384314)
-lightsalmon4 = _intern(r=0.545098,g=0.341176,b=0.258824)
-orange1 = _intern(r=1.000000,g=0.647059,b=0.000000)
-orange2 = _intern(r=0.933333,g=0.603922,b=0.000000)
-orange3 = _intern(r=0.803922,g=0.521569,b=0.000000)
-orange4 = _intern(r=0.545098,g=0.352941,b=0.000000)
-darkorange1 = _intern(r=1.000000,g=0.498039,b=0.000000)
-darkorange2 = _intern(r=0.933333,g=0.462745,b=0.000000)
-darkorange3 = _intern(r=0.803922,g=0.400000,b=0.000000)
-darkorange4 = _intern(r=0.545098,g=0.270588,b=0.000000)
-coral1 = _intern(r=1.000000,g=0.447059,b=0.337255)
-coral2 = _intern(r=0.933333,g=0.415686,b=0.313725)
-coral3 = _intern(r=0.803922,g=0.356863,b=0.270588)
-coral4 = _intern(r=0.545098,g=0.243137,b=0.184314)
-tomato1 = _intern(r=1.000000,g=0.388235,b=0.278431)
-tomato2 = _intern(r=0.933333,g=0.360784,b=0.258824)
-tomato3 = _intern(r=0.803922,g=0.309804,b=0.223529)
-tomato4 = _intern(r=0.545098,g=0.211765,b=0.149020)
-orangered1 = _intern(r=1.000000,g=0.270588,b=0.000000)
-orangered2 = _intern(r=0.933333,g=0.250980,b=0.000000)
-orangered3 = _intern(r=0.803922,g=0.215686,b=0.000000)
-orangered4 = _intern(r=0.545098,g=0.145098,b=0.000000)
-red1 = _intern(r=1.000000,g=0.000000,b=0.000000)
-red2 = _intern(r=0.933333,g=0.000000,b=0.000000)
-red3 = _intern(r=0.803922,g=0.000000,b=0.000000)
-red4 = _intern(r=0.545098,g=0.000000,b=0.000000)
-deeppink1 = _intern(r=1.000000,g=0.078431,b=0.576471)
-deeppink2 = _intern(r=0.933333,g=0.070588,b=0.537255)
-deeppink3 = _intern(r=0.803922,g=0.062745,b=0.462745)
-deeppink4 = _intern(r=0.545098,g=0.039216,b=0.313725)
-hotpink1 = _intern(r=1.000000,g=0.431373,b=0.705882)
-hotpink2 = _intern(r=0.933333,g=0.415686,b=0.654902)
-hotpink3 = _intern(r=0.803922,g=0.376471,b=0.564706)
-hotpink4 = _intern(r=0.545098,g=0.227451,b=0.384314)
-pink1 = _intern(r=1.000000,g=0.709804,b=0.772549)
-pink2 = _intern(r=0.933333,g=0.662745,b=0.721569)
-pink3 = _intern(r=0.803922,g=0.568627,b=0.619608)
-pink4 = _intern(r=0.545098,g=0.388235,b=0.423529)
-lightpink1 = _intern(r=1.000000,g=0.682353,b=0.725490)
-lightpink2 = _intern(r=0.933333,g=0.635294,b=0.678431)
-lightpink3 = _intern(r=0.803922,g=0.549020,b=0.584314)
-lightpink4 = _intern(r=0.545098,g=0.372549,b=0.396078)
-palevioletred1 = _intern(r=1.000000,g=0.509804,b=0.670588)
-palevioletred2 = _intern(r=0.933333,g=0.474510,b=0.623529)
-palevioletred3 = _intern(r=0.803922,g=0.407843,b=0.537255)
-palevioletred4 = _intern(r=0.545098,g=0.278431,b=0.364706)
-maroon1 = _intern(r=1.000000,g=0.203922,b=0.701961)
-maroon2 = _intern(r=0.933333,g=0.188235,b=0.654902)
-maroon3 = _intern(r=0.803922,g=0.160784,b=0.564706)
-maroon4 = _intern(r=0.545098,g=0.109804,b=0.384314)
-violetred1 = _intern(r=1.000000,g=0.243137,b=0.588235)
-violetred2 = _intern(r=0.933333,g=0.227451,b=0.549020)
-violetred3 = _intern(r=0.803922,g=0.196078,b=0.470588)
-violetred4 = _intern(r=0.545098,g=0.133333,b=0.321569)
-magenta1 = _intern(r=1.000000,g=0.000000,b=1.000000)
-magenta2 = _intern(r=0.933333,g=0.000000,b=0.933333)
-magenta3 = _intern(r=0.803922,g=0.000000,b=0.803922)
-magenta4 = _intern(r=0.545098,g=0.000000,b=0.545098)
-orchid1 = _intern(r=1.000000,g=0.513725,b=0.980392)
-orchid2 = _intern(r=0.933333,g=0.478431,b=0.913725)
-orchid3 = _intern(r=0.803922,g=0.411765,b=0.788235)
-orchid4 = _intern(r=0.545098,g=0.278431,b=0.537255)
-plum1 = _intern(r=1.000000,g=0.733333,b=1.000000)
-plum2 = _intern(r=0.933333,g=0.682353,b=0.933333)
-plum3 = _intern(r=0.803922,g=0.588235,b=0.803922)
-plum4 = _intern(r=0.545098,g=0.400000,b=0.545098)
-mediumorchid1 = _intern(r=0.878431,g=0.400000,b=1.000000)
-mediumorchid2 = _intern(r=0.819608,g=0.372549,b=0.933333)
-mediumorchid3 = _intern(r=0.705882,g=0.321569,b=0.803922)
-mediumorchid4 = _intern(r=0.478431,g=0.215686,b=0.545098)
-darkorchid1 = _intern(r=0.749020,g=0.243137,b=1.000000)
-darkorchid2 = _intern(r=0.698039,g=0.227451,b=0.933333)
-darkorchid3 = _intern(r=0.603922,g=0.196078,b=0.803922)
-darkorchid4 = _intern(r=0.407843,g=0.133333,b=0.545098)
-purple1 = _intern(r=0.607843,g=0.188235,b=1.000000)
-purple2 = _intern(r=0.568627,g=0.172549,b=0.933333)
-purple3 = _intern(r=0.490196,g=0.149020,b=0.803922)
-purple4 = _intern(r=0.333333,g=0.101961,b=0.545098)
-mediumpurple1 = _intern(r=0.670588,g=0.509804,b=1.000000)
-mediumpurple2 = _intern(r=0.623529,g=0.474510,b=0.933333)
-mediumpurple3 = _intern(r=0.537255,g=0.407843,b=0.803922)
-mediumpurple4 = _intern(r=0.364706,g=0.278431,b=0.545098)
-thistle1 = _intern(r=1.000000,g=0.882353,b=1.000000)
-thistle2 = _intern(r=0.933333,g=0.823529,b=0.933333)
-thistle3 = _intern(r=0.803922,g=0.709804,b=0.803922)
-thistle4 = _intern(r=0.545098,g=0.482353,b=0.545098)
-gray00 = _intern(r=0.000000,g=0.000000,b=0.000000)
-gray01 = _intern(r=0.011765,g=0.011765,b=0.011765)
-gray02 = _intern(r=0.019608,g=0.019608,b=0.019608)
-gray03 = _intern(r=0.031373,g=0.031373,b=0.031373)
-gray04 = _intern(r=0.039216,g=0.039216,b=0.039216)
-gray05 = _intern(r=0.050980,g=0.050980,b=0.050980)
-gray06 = _intern(r=0.058824,g=0.058824,b=0.058824)
-gray07 = _intern(r=0.070588,g=0.070588,b=0.070588)
-gray08 = _intern(r=0.078431,g=0.078431,b=0.078431)
-gray09 = _intern(r=0.090196,g=0.090196,b=0.090196)
-gray10 = _intern(r=0.101961,g=0.101961,b=0.101961)
-gray11 = _intern(r=0.109804,g=0.109804,b=0.109804)
-gray12 = _intern(r=0.121569,g=0.121569,b=0.121569)
-gray13 = _intern(r=0.129412,g=0.129412,b=0.129412)
-gray14 = _intern(r=0.141176,g=0.141176,b=0.141176)
-gray15 = _intern(r=0.149020,g=0.149020,b=0.149020)
-gray16 = _intern(r=0.160784,g=0.160784,b=0.160784)
-gray17 = _intern(r=0.168627,g=0.168627,b=0.168627)
-gray18 = _intern(r=0.180392,g=0.180392,b=0.180392)
-gray19 = _intern(r=0.188235,g=0.188235,b=0.188235)
-gray20 = _intern(r=0.200000,g=0.200000,b=0.200000)
-gray21 = _intern(r=0.211765,g=0.211765,b=0.211765)
-gray22 = _intern(r=0.219608,g=0.219608,b=0.219608)
-gray23 = _intern(r=0.231373,g=0.231373,b=0.231373)
-gray24 = _intern(r=0.239216,g=0.239216,b=0.239216)
-gray25 = _intern(r=0.250980,g=0.250980,b=0.250980)
-gray26 = _intern(r=0.258824,g=0.258824,b=0.258824)
-gray27 = _intern(r=0.270588,g=0.270588,b=0.270588)
-gray28 = _intern(r=0.278431,g=0.278431,b=0.278431)
-gray29 = _intern(r=0.290196,g=0.290196,b=0.290196)
-gray30 = _intern(r=0.301961,g=0.301961,b=0.301961)
-gray31 = _intern(r=0.309804,g=0.309804,b=0.309804)
-gray32 = _intern(r=0.321569,g=0.321569,b=0.321569)
-gray33 = _intern(r=0.329412,g=0.329412,b=0.329412)
-gray34 = _intern(r=0.341176,g=0.341176,b=0.341176)
-gray35 = _intern(r=0.349020,g=0.349020,b=0.349020)
-gray36 = _intern(r=0.360784,g=0.360784,b=0.360784)
-gray37 = _intern(r=0.368627,g=0.368627,b=0.368627)
-gray38 = _intern(r=0.380392,g=0.380392,b=0.380392)
-gray39 = _intern(r=0.388235,g=0.388235,b=0.388235)
-gray40 = _intern(r=0.400000,g=0.400000,b=0.400000)
-gray41 = _intern(r=0.411765,g=0.411765,b=0.411765)
-gray42 = _intern(r=0.419608,g=0.419608,b=0.419608)
-gray43 = _intern(r=0.431373,g=0.431373,b=0.431373)
-gray44 = _intern(r=0.439216,g=0.439216,b=0.439216)
-gray45 = _intern(r=0.450980,g=0.450980,b=0.450980)
-gray46 = _intern(r=0.458824,g=0.458824,b=0.458824)
-gray47 = _intern(r=0.470588,g=0.470588,b=0.470588)
-gray48 = _intern(r=0.478431,g=0.478431,b=0.478431)
-gray49 = _intern(r=0.490196,g=0.490196,b=0.490196)
-gray50 = _intern(r=0.498039,g=0.498039,b=0.498039)
-gray51 = _intern(r=0.509804,g=0.509804,b=0.509804)
-gray52 = _intern(r=0.521569,g=0.521569,b=0.521569)
-gray53 = _intern(r=0.529412,g=0.529412,b=0.529412)
-gray54 = _intern(r=0.541176,g=0.541176,b=0.541176)
-gray55 = _intern(r=0.549020,g=0.549020,b=0.549020)
-gray56 = _intern(r=0.560784,g=0.560784,b=0.560784)
-gray57 = _intern(r=0.568627,g=0.568627,b=0.568627)
-gray58 = _intern(r=0.580392,g=0.580392,b=0.580392)
-gray59 = _intern(r=0.588235,g=0.588235,b=0.588235)
-gray60 = _intern(r=0.600000,g=0.600000,b=0.600000)
-gray61 = _intern(r=0.611765,g=0.611765,b=0.611765)
-gray62 = _intern(r=0.619608,g=0.619608,b=0.619608)
-gray63 = _intern(r=0.631373,g=0.631373,b=0.631373)
-gray64 = _intern(r=0.639216,g=0.639216,b=0.639216)
-gray65 = _intern(r=0.650980,g=0.650980,b=0.650980)
-gray66 = _intern(r=0.658824,g=0.658824,b=0.658824)
-gray67 = _intern(r=0.670588,g=0.670588,b=0.670588)
-gray68 = _intern(r=0.678431,g=0.678431,b=0.678431)
-gray69 = _intern(r=0.690196,g=0.690196,b=0.690196)
-gray70 = _intern(r=0.701961,g=0.701961,b=0.701961)
-gray71 = _intern(r=0.709804,g=0.709804,b=0.709804)
-gray72 = _intern(r=0.721569,g=0.721569,b=0.721569)
-gray73 = _intern(r=0.729412,g=0.729412,b=0.729412)
-gray74 = _intern(r=0.741176,g=0.741176,b=0.741176)
-gray75 = _intern(r=0.749020,g=0.749020,b=0.749020)
-gray76 = _intern(r=0.760784,g=0.760784,b=0.760784)
-gray77 = _intern(r=0.768627,g=0.768627,b=0.768627)
-gray78 = _intern(r=0.780392,g=0.780392,b=0.780392)
-gray79 = _intern(r=0.788235,g=0.788235,b=0.788235)
-gray80 = _intern(r=0.800000,g=0.800000,b=0.800000)
-gray81 = _intern(r=0.811765,g=0.811765,b=0.811765)
-gray82 = _intern(r=0.819608,g=0.819608,b=0.819608)
-gray83 = _intern(r=0.831373,g=0.831373,b=0.831373)
-gray84 = _intern(r=0.839216,g=0.839216,b=0.839216)
-gray85 = _intern(r=0.850980,g=0.850980,b=0.850980)
-gray86 = _intern(r=0.858824,g=0.858824,b=0.858824)
-gray87 = _intern(r=0.870588,g=0.870588,b=0.870588)
-gray88 = _intern(r=0.878431,g=0.878431,b=0.878431)
-gray89 = _intern(r=0.890196,g=0.890196,b=0.890196)
-gray90 = _intern(r=0.898039,g=0.898039,b=0.898039)
-gray91 = _intern(r=0.909804,g=0.909804,b=0.909804)
-gray92 = _intern(r=0.921569,g=0.921569,b=0.921569)
-gray93 = _intern(r=0.929412,g=0.929412,b=0.929412)
-gray94 = _intern(r=0.941176,g=0.941176,b=0.941176)
-gray95 = _intern(r=0.949020,g=0.949020,b=0.949020)
-gray96 = _intern(r=0.960784,g=0.960784,b=0.960784)
-gray97 = _intern(r=0.968627,g=0.968627,b=0.968627)
-gray98 = _intern(r=0.980392,g=0.980392,b=0.980392)
-gray99 = _intern(r=0.988235,g=0.988235,b=0.988235)
-gray100 = _intern(r=1.000000,g=1.000000,b=1.000000)
-darkgray = _intern(r=0.662745,g=0.662745,b=0.662745)
-darkblue = _intern(r=0.000000,g=0.000000,b=0.545098)
-darkcyan = _intern(r=0.000000,g=0.545098,b=0.545098)
-darkmagenta = _intern(r=0.545098,g=0.000000,b=0.545098)
-darkred = _intern(r=0.545098,g=0.000000,b=0.000000)
-lightgreen = _intern(r=0.564706,g=0.933333,b=0.564706)
-default = black
-
-_name_table = None
-def name_table():
- global _name_table
- if not _name_table:
- _name_table = pychart_util.symbol_lookup_table(globals(), standards)
- return _name_table
diff --git a/bin/pychart/color_doc.py b/bin/pychart/color_doc.py
deleted file mode 100644
index 65fa6446a16..00000000000
--- a/bin/pychart/color_doc.py
+++ /dev/null
@@ -1,7 +0,0 @@
-# automatically generated by generate_docs.py.
-doc="""Attributes supported by this class are:
-r(type:number) default="The intensity of red. The value is between 0 and 1.".
-b(type:number) default="The intensity of blue. The value is between 0 and 1.".
-g(type:number) default="The intensity of green. The value is between 0 and 1.".
-"""
-
diff --git a/bin/pychart/coord.py b/bin/pychart/coord.py
deleted file mode 100644
index 3c911d2a42a..00000000000
--- a/bin/pychart/coord.py
+++ /dev/null
@@ -1,49 +0,0 @@
-#
-# Copyright (C) 2000-2005 by Yasushi Saito (yasushi.saito@gmail.com)
-#
-# Jockey is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2, or (at your option) any
-# later version.
-#
-# Jockey is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# for more details.
-#
-class T(object):
- def get_canvas_pos(self, size, val, min, max):
- """
- Compute the screen location at which a sample value would be drawn.
- ``size`` is the width or height of the chart, in points.
- ``val`` is the sample value.
- ``min`` and ``max`` are the minimum and maximum sample values that
- are to be displayed over the length of ``size``.
-
- For example, suppose the width of a chart is 200 points and the
- minimum and maximum X values in the sample data are 100 and 150
- respectively. When Pychart wants to draw a sample point at the X
- value of 120, it will call
- area.T.x_coord.get_canvas_pos(size = 200, val = 120, min = 100, max = 150).
- """
- raise Exception
-
- def get_tics(self, min, max, interval):
- """Generate the list of places for drawing tick marks."""
- raise Exception
-
- def get_min_max(self, min, max, interval):
- """Compute the min/max values to be displayed in the chart.
- Parameters ``min`` and ``max`` are the minimum and maximum values
- of the sample data passed to the plots. Parameter ``interval`` is
- the value of attribute area.T.x_grid_interval (or y_grid_interval).
- It is None if these attributes are non-specified.
-
- This method must return tuple (dmin, dmax, dinterval).
- dmin should be ``min`` rounded down to some good number.
- dmax should be ``max`` rounded up to some good number.
- dinterval should be ``interval`` if it is non-None. Otherwise, the
- method must compute some good value.
- """
-
- raise Exception
diff --git a/bin/pychart/doc_support.py b/bin/pychart/doc_support.py
deleted file mode 100644
index 32537a7437c..00000000000
--- a/bin/pychart/doc_support.py
+++ /dev/null
@@ -1,122 +0,0 @@
-#
-# Copyright (C) 2000-2005 by Yasushi Saito (yasushi.saito@gmail.com)
-#
-# Jockey is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2, or (at your option) any
-# later version.
-#
-# Jockey is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# for more details.
-#
-import string
-import sys
-import re
-import os.path
-from pychart import *
-from types import *
-from pychart.pychart_types import *
-
-oldstdout = sys.stdout
-if os.path.exists("/dev/null"):
- sys.stdout = open("/dev/null", "w")
-
-modules = {}
-values = []
-
-sys.stdout = oldstdout
-g = globals()
-for mod in g.keys():
- val = g[mod]
- if type(val) == ModuleType:
- dic = {}
- for name in val.__dict__.keys():
- v = val.__dict__[name]
- if name[0] != '_':
- values.append((v, mod + "." + name))
- if type(v) == type and issubclass(v, chart_object.T):
- dic[name] = v
- modules[mod] = dic
-
-def stringify_type(t):
- s = str(t)
- if t == AnyType:
- return "any"
- if t == ShadowType:
- return "(xoff,yoff,fill)"
- elif re.search("NumType", s):
- return "number"
- elif re.search("UnitType", s):
- return "length in points (\\\\xref{unit})"
- elif re.search("CoordType", s):
- return "(x,y)"
- elif re.search("CoordSystemType", s):
- return "['linear'|'log'|'category']"
- elif re.search("CoordOrNoneType", s):
- return "(x,y) or None"
- elif re.search("TextAlignType", s):
- return "['R'|'L'|'C'|None]"
- elif re.search("FormatType", s):
- return "printf format string"
- elif re.search("IntervalType", s):
- return "Number or function"
-
- mo = re.match("", s)
- if mo:
- return mo.group(1)
- mo = re.match("", s)
- if mo:
- return mo.group(1)
- mo = re.match("", s)
- if mo:
- return mo.group(1)
- mo = re.match("pychart\\.(.*)", s)
- if mo:
- return mo.group(1)
- return s
-
-def stringify_value(val):
- t = type(val)
- if t == StringType:
- return '"' + val + '"'
- if t == bool:
- if val: return "True"
- else: return "False"
-
- if t in (IntType, LongType, FloatType):
- return str(val)
- if val == None:
- return "None"
- if type(val) == ListType:
- return map(stringify_value, val)
- for pair in values:
- if pair[0] == val:
- return pair[1]
- return str(val)
-
-def break_string(name):
- max_len = 10
- if len(name) < max_len:
- return name
-
- name = re.sub("(\\d\\d)([^\\d])", "\\1-\n\\2", name)
- name = re.sub("black(.)", "black-\n\\1", name)
-
- elems = string.split(name, "\n")
- while 1:
- broken = 0
- for i in range(len(elems)):
- elem = elems[i]
- if len(elem) < max_len:
- continue
- broken = 1
- elem1 = elem[0:len(elem)/2]
- elem2 = elem[len(elem)/2:]
- elems[i:i+1] = [elem1, elem2]
- break
- if not broken:
- break
- name = "\n".join(elems)
- return name
diff --git a/bin/pychart/empty_docs.py b/bin/pychart/empty_docs.py
deleted file mode 100644
index 20408906da0..00000000000
--- a/bin/pychart/empty_docs.py
+++ /dev/null
@@ -1,44 +0,0 @@
-#
-# Copyright (C) 2000-2005 by Yasushi Saito (yasushi.saito@gmail.com)
-#
-# Jockey is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2, or (at your option) any
-# later version.
-#
-# Jockey is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# for more details.
-#
-
-def generate_doc(name, suffix="", append = 0):
- if append:
- fp = open(name + "_doc.py", "a+")
- else:
- fp = open(name + "_doc.py", "w")
- fp.write("# automatically generated by generate_docs.py.\n")
- fp.write("doc" + suffix + "=\" \"\n")
- fp.close()
-
-generate_doc( "area")
-generate_doc( "arrow")
-generate_doc( "axis", "_x")
-generate_doc( "axis", "_y", 1)
-generate_doc( "bar_plot")
-generate_doc( "color")
-generate_doc( "error_bar","_1")
-generate_doc( "error_bar", "_2", 1)
-generate_doc( "error_bar", "_3", 1)
-generate_doc( "error_bar", "_4", 1)
-generate_doc( "error_bar", "_5", 1)
-generate_doc( "error_bar", "_6", 1)
-generate_doc( "fill_style")
-generate_doc("line_plot")
-generate_doc("pie_plot")
-generate_doc("text_box")
-generate_doc("range_plot")
-generate_doc("legend")
-generate_doc("legend", "_entry", 1)
-generate_doc("line_style")
-generate_doc("tick_mark")
diff --git a/bin/pychart/error_bar.py b/bin/pychart/error_bar.py
deleted file mode 100644
index 6abecffdb19..00000000000
--- a/bin/pychart/error_bar.py
+++ /dev/null
@@ -1,159 +0,0 @@
-#
-# Copyright (C) 2000-2005 by Yasushi Saito (yasushi.saito@gmail.com)
-#
-# Jockey is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2, or (at your option) any
-# later version.
-#
-# Jockey is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# for more details.
-#
-import tick_mark
-import line_style
-import pychart_util
-import chart_object
-import fill_style
-import types
-import error_bar_doc
-import object_set
-from pychart_types import *
-
-__doc__ = """Pychart offers several styles of error bars. Some of them
-only displays the min/max confidence interval, while others can display
-quartiles in addition to min/max."""
-
-class T(chart_object.T):
- keys = {}
-##AUTOMATICALLY GENERATED
-
-##END AUTOMATICALLY GENERATED
- pass
-
-# Two horizontal lines at min & max locations.
-class error_bar1(T):
- __doc__ = error_bar_doc.doc_1
- keys = {"tic_len" : (UnitType, 10, "Length of the horizontal bars"),
- "line_style": (line_style.T, line_style.default, "")
- }
-##AUTOMATICALLY GENERATED
-
-##END AUTOMATICALLY GENERATED
- def draw(self, can, loc, min, max, qmin = None, qmax = None):
- x = loc[0]
- y = min
- can.line(self.line_style, x-self.tic_len/2.0, y, x+self.tic_len/2.0, y)
- y = max
- can.line(self.line_style, x-self.tic_len/2.0, y, x+self.tic_len/2.0, y)
-
-class error_bar2(T):
- __doc__ = error_bar_doc.doc_2
- keys = {"tic_len" : (UnitType, 3,
- "The length of the horizontal bars"),
- "hline_style": (line_style.T, line_style.default,
- "The style of the horizontal bars."),
- "vline_style": (line_style.T, None,
- "The style of the vertical bar.")
- }
-
-##AUTOMATICALLY GENERATED
-
-##END AUTOMATICALLY GENERATED
- def draw(self, can, loc, min, max, qmin = None, qmax = None):
- vline_style = self.vline_style
- if not vline_style:
- vline_style = self.hline_style
- x = loc[0]
- y1 = min
- can.line(self.hline_style, x-self.tic_len/2.0, y1, x+self.tic_len/2.0, y1)
- y2 = max
- can.line(self.hline_style, x-self.tic_len/2.0, y2, x+self.tic_len/2.0, y2)
- can.line(vline_style, x, y1, x, y2)
-
-class error_bar3(T):
- # Tufte style
- __doc__ = "This style is endorsed by the Tufte's books. " \
- + error_bar_doc.doc_3
- keys = { "line_style": (line_style.T, line_style.default, "")
- }
-
-##AUTOMATICALLY GENERATED
-
-##END AUTOMATICALLY GENERATED
- def draw(self, can, loc, min, max, qmin, qmax):
- x = loc[0]
- can.line(self.line_style, x, min, x, qmin)
- can.line(self.line_style, x, qmax, x, max)
-
-class error_bar4(T):
- __doc__ = error_bar_doc.doc_4
- keys = { "line_style": (line_style.T, line_style.default, ""),
- "fill_style": (fill_style.T, fill_style.gray70, ""),
- "box_width": (UnitType, 4, ""),
- "tic_len": (UnitType, 4, "")
- }
-##AUTOMATICALLY GENERATED
-
-##END AUTOMATICALLY GENERATED
- def draw(self, can, loc, min, max, qmin, qmax):
- x = loc[0]
- style = self.line_style
- y1 = min
- can.line(style, x-self.tic_len/2.0, y1, x+self.tic_len/2.0, y1)
- y2 = max
- can.line(style, x-self.tic_len/2.0, y2, x+self.tic_len/2.0, y2)
- can.line(style, x, y1, x, y2)
-
- can.rectangle(style, self.fill_style,
- x-self.box_width/2.0, qmin,
- x+self.box_width/2.0, qmax)
-
-# vertical line
-class error_bar5(T):
- __doc__ = error_bar_doc.doc_5
- keys = { "line_style": (line_style.T, line_style.default, "")
- }
-##AUTOMATICALLY GENERATED
-
-##END AUTOMATICALLY GENERATED
- def draw(self, can, loc, min, max, qmin = None, qmax = None):
- x = loc[0]
- y = loc[1]
-
- min = (min - y) *1 + y
- max = (max - y) *1+ y
- can.line(self.line_style, x, min, x, max)
-
-# a box
-class error_bar6(T):
- __doc__ = error_bar_doc.doc_6
- keys = { "line_style": (line_style.T, line_style.default, ""),
- "fill_style": (fill_style.T, fill_style.gray70, ""),
- "center_line_style": (line_style.T, line_style.T(width=0.5), ""),
- "box_width": (UnitType, 4, ""),
- }
-##AUTOMATICALLY GENERATED
-
-##END AUTOMATICALLY GENERATED
- def draw(self, can, loc, min, max, qmin = None, qmax = None):
- x = loc[0]
- y = loc[1]
-
- can.rectangle(self.line_style, self.fill_style,
- x - self.box_width / 2.0, min,
- x + self.box_width / 2.0, max)
- can.line(self.center_line_style,
- x - self.box_width/2.0, (min+max)/2.0,
- x + self.box_width/2.0, (min+max)/2.0)
-
-bar1 = error_bar1()
-bar2 = error_bar2()
-bar3 = error_bar3()
-bar4 = error_bar4()
-bar5 = error_bar5()
-bar6 = error_bar6()
-
-standards = object_set.T(bar1, bar2, bar3, bar4, bar5, bar6)
-
diff --git a/bin/pychart/error_bar_doc.py b/bin/pychart/error_bar_doc.py
deleted file mode 100644
index de2362dd50c..00000000000
--- a/bin/pychart/error_bar_doc.py
+++ /dev/null
@@ -1,34 +0,0 @@
-# automatically generated by generate_docs.py.
-doc_1="""Attributes supported by this class are:
-line_style(type:line_style.T) default="".
-tic_len(type:length in points (\\xref{unit})) default="Length of the horizontal bars".
-"""
-
-doc_2="""Attributes supported by this class are:
-vline_style(type:line_style.T) default="The style of the vertical bar.".
-hline_style(type:line_style.T) default="The style of the horizontal bars.".
-tic_len(type:length in points (\\xref{unit})) default="The length of the horizontal bars".
-"""
-
-doc_3="""Attributes supported by this class are:
-line_style(type:line_style.T) default="".
-"""
-
-doc_4="""Attributes supported by this class are:
-line_style(type:line_style.T) default="".
-box_width(type:length in points (\\xref{unit})) default="".
-tic_len(type:length in points (\\xref{unit})) default="".
-fill_style(type:fill_style.T) default="".
-"""
-
-doc_5="""Attributes supported by this class are:
-line_style(type:line_style.T) default="".
-"""
-
-doc_6="""Attributes supported by this class are:
-box_width(type:length in points (\\xref{unit})) default="".
-line_style(type:line_style.T) default="".
-center_line_style(type:line_style.T) default="".
-fill_style(type:fill_style.T) default="".
-"""
-
diff --git a/bin/pychart/fill_style.py b/bin/pychart/fill_style.py
deleted file mode 100644
index 1cddd3d9601..00000000000
--- a/bin/pychart/fill_style.py
+++ /dev/null
@@ -1,285 +0,0 @@
-#
-# Copyright (C) 2000-2005 by Yasushi Saito (yasushi.saito@gmail.com)
-#
-# Jockey is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2, or (at your option) any
-# later version.
-#
-# Jockey is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# for more details.
-#
-import pychart_util
-import color
-import line_style
-import chart_object
-import object_set
-import types
-import theme
-import fill_style_doc
-from pychart_types import *
-from scaling import *
-
-_keys = {
- "bgcolor" : (color.T, color.white, "The background color."),
- "line_style": (line_style.T, line_style.default,
- pychart_util.line_desc),
- "line_interval": (NumType, 3,
- "The interval between successive stitch lines.")
- }
-
-class T(chart_object.T):
- __doc__ = fill_style_doc.doc
- keys = _keys
-##AUTOMATICALLY GENERATED
-##END AUTOMATICALLY GENERATED
- def __str__(self):
- s = name_table().lookup(self)
- if s:
- return s
- return "" % \
- (self.bgcolor, self.line_style, self.line_interval)
-
-class Plain(T):
- """This class just fills the region with solid background color.
-Attributes line_style and line_interval are ignored."""
- def draw(self, can, x1, y1, x2, y2):
- pass
-
-class Diag(T):
- "This class fills the region with diagonal lines."
-
- def draw(self, can, x1, y1, x2, y2):
- line_width = self.line_style.width
- interval = self.line_interval * 1.414
- x1 -= line_width
- y1 -= line_width
- x2 += line_width
- y2 += line_width
- len = max(y2 - y1, x2 - x1)
- curx = x1 - len
- while curx < x2:
- can.line(self.line_style, curx, y1, curx+len, y1+len)
- curx += interval
-
-class Rdiag(T):
- """Fills the region with diagonal lines, but tilted in the opposite
-direction from fill_style.Diag."""
- def draw(self, can, x1, y1, x2, y2):
- line_width = self.line_style.width
- interval = self.line_interval * 1.414
- x1 -= line_width
- y1 -= line_width
- x2 += line_width
- y2 += line_width
- len = max(y2 - y1, x2 - x1)
- curx = x1
- while curx < x2 + len:
- can.line(self.line_style, curx, y1, curx-len, y1+len)
- curx += interval
-
-class Vert(T):
- "Fills the region with vertical lines"
- def draw(self, can, x1, y1, x2, y2):
- interval = self.line_interval
- curx = x1
- while curx < x2:
- can.line(self.line_style, curx, y1, curx, y2)
- curx += interval
-
-class Horiz(T):
- "Fills the region with horizontal lines"
- def draw(self, can, x1, y1, x2, y2):
- interval = self.line_interval
- cury = y1
- while cury < y2:
- can.line(self.line_style, x1, cury, x2, cury)
- cury += interval
-
-class Stitch(T):
- "Fills the region with horizontal and vertical lines."
- def draw(self, can, x1, y1, x2, y2):
- interval = self.line_interval
- cury = y1
- while cury < y2:
- can.line(self.line_style, x1, cury, x2, cury)
- cury += interval
- curx = x1
- while curx < x2:
- can.line(self.line_style, curx, y1, curx, y2)
- curx += interval
-
-class Wave(T):
- "Fills the region with horizontal wavy lines."
- def draw(self, can, x1, y1, x2, y2):
- x1 = xscale(x1)
- x2 = xscale(x2)
- y1 = yscale(y1)
- y2 = yscale(y2)
- line_width = nscale(self.line_style.width)
- interval = nscale(self.line_interval)
-
- can.set_line_style(self.line_style)
- x1 -= line_width
- x2 += line_width
- cury = y1
- half = interval/2.0
- while cury < y2:
- curx = x1
- can.newpath()
- can.moveto(curx, cury)
- while curx < x2:
- can.lineto(curx + half, cury + half)
- can.lineto(curx + interval, cury)
- curx += interval
- can.stroke()
- cury += interval
-
-class Vwave(T):
- """Fills the region with vertical wavy lines."""
- def draw(self, can, x1, y1, x2, y2):
- x1 = xscale(x1)
- x2 = xscale(x2)
- y1 = yscale(y1)
- y2 = yscale(y2)
- line_width = nscale(self.line_style.width)
- interval = nscale(self.line_interval)
-
- can.set_line_style(self.line_style)
- y1 -= line_width
- y2 += line_width
- curx = x1
- half = interval/2.0
- while curx < x2:
- cury = y1
- can.newpath()
- can.moveto(curx, cury)
- while cury < y2:
- can.lineto(curx + half, cury + half)
- can.lineto(curx, cury + interval)
- cury += interval
- can.stroke()
- curx += interval
-
-class Lines(T):
- """Fills the region with a series of short line segments."""
- def draw(self, can, x1, y1, x2, y2):
- interval = nscale(self.line_interval)
- cury = y1
- j = 0
- while cury < y2:
- curx = x1
- if j % 2 == 1:
- curx += interval/2.0
- while curx < x2:
- can.line(self.line_style, curx, cury, curx+interval/2.0, cury)
- curx += interval * 1.5
- j += 1
- cury += interval
-
-default = Plain()
-
-color_standards = object_set.T()
-grayscale_standards = object_set.T()
-
-def _intern_both(style):
- global color_standards, grayscale_standards
- color_standards.add(style)
- grayscale_standards.add(style)
- return style
-
-def _intern_color(style):
- global color_standards, grayscale_standards
- color_standards.add(style)
- return style
-
-def _intern_grayscale(style):
- global color_standards, grayscale_standards
- grayscale_standards.add(style)
- return style
-
-black = _intern_both(Plain(bgcolor=color.gray_scale(0.0), line_style=None))
-
-red = _intern_color(Plain(bgcolor=color.red))
-darkseagreen = _intern_color(Plain(bgcolor=color.darkseagreen))
-blue = _intern_color(Plain(bgcolor=color.blue))
-aquamarine1 = _intern_color(Plain(bgcolor=color.aquamarine1))
-gray70 = _intern_both(Plain(bgcolor=color.gray70, line_style=None))
-brown = _intern_color(Plain(bgcolor=color.brown))
-darkorchid = _intern_color(Plain(bgcolor=color.darkorchid))
-diag = _intern_both(Diag(line_style=line_style.T(cap_style=2)))
-green = _intern_color(Plain(bgcolor=color.green))
-gray50 = _intern_both(Plain(bgcolor=color.gray50, line_style=None))
-white = _intern_both(Plain(bgcolor=color.gray_scale(1.0), line_style=None))
-goldenrod = _intern_color(Plain(bgcolor=color.goldenrod))
-rdiag = _intern_both(Rdiag(line_style=line_style.T(cap_style=2)))
-vert = _intern_both(Vert(line_interval=1.8))
-
-gray30 = _intern_both(Plain(bgcolor=color.gray30, line_style=None))
-gray20 = _intern_both(Plain(bgcolor=color.gray20, line_style=None))
-gray10 = _intern_both(Plain(bgcolor=color.gray10, line_style=None))
-diag2 = _intern_both(Diag(line_style=line_style.T(width=3, cap_style=2),
- line_interval=6))
-rdiag2 = _intern_both(Rdiag(line_style=line_style.T(width=3, cap_style=2),
- line_interval=6))
-yellow = _intern_color(Plain(bgcolor=color.yellow))
-diag3 = _intern_both(Diag(line_style=line_style.T(width=3, color=color.gray50, cap_style=2),
- line_interval=6))
-horiz = _intern_both(Horiz(line_interval=1.8))
-gray90 = _intern_both(Plain(bgcolor=color.gray90, line_style=None))
-rdiag3 = _intern_both(Rdiag(line_style=line_style.T(width=3,
- color=color.gray50,
- cap_style=2),
- line_interval=6))
-
-wave = _intern_both(Wave(line_style=line_style.T(cap_style=2, join_style=1)))
-vwave = _intern_both(Vwave(line_style=line_style.T(cap_style=2, join_style=1)))
-stitch = _intern_both(Stitch(line_style=line_style.T(cap_style=2, join_style=1)))
-lines = _intern_both(Lines(line_style=line_style.T()))
-
-diag_fine = _intern_both(Diag(line_style=line_style.T(width=0.75,cap_style=2),
- line_interval = 1.5))
-diag2_fine = _intern_both(Diag(line_style=line_style.T(width=0.75, cap_style=2),
- line_interval=1.5))
-diag3_fine = _intern_both(Diag(line_style=line_style.T(width=0.75,
- color = color.gray50,
- cap_style=2),
- line_interval=1.5))
-rdiag_fine = _intern_both(Rdiag(line_style=line_style.T(width=0.75,cap_style=2),
- line_interval = 1.5))
-rdiag2_fine = _intern_both(Rdiag(line_style=line_style.T(width=0.75, cap_style=2),
- line_interval=1.5))
-rdiag3_fine = _intern_both(Rdiag(line_style=line_style.T(width=0.75,
- color = color.gray50,
- cap_style=2),
- line_interval=1.5))
-
-horiz_fine = _intern_both(Horiz(line_interval=1.5))
-vert_fine = _intern_both(Vert(line_interval=1.5))
-
-#
-# Fill styles for color charts.
-#
-
-standards = None
-_name_table = None
-
-def init():
- global standards, _name_table
- if theme.use_color:
- standards = color_standards
- else:
- standards = grayscale_standards
- _name_table = None
-
-def name_table():
- global _name_table
- if not _name_table:
- _name_table = pychart_util.symbol_lookup_table(globals(), standards)
- return _name_table
-
-init()
-theme.add_reinitialization_hook(init)
-
diff --git a/bin/pychart/fill_style_doc.py b/bin/pychart/fill_style_doc.py
deleted file mode 100644
index 6274e1b2a89..00000000000
--- a/bin/pychart/fill_style_doc.py
+++ /dev/null
@@ -1,7 +0,0 @@
-# automatically generated by generate_docs.py.
-doc="""Attributes supported by this class are:
-bgcolor(type:color.T) default="The background color.".
-line_style(type:line_style.T) default="The style of the line. ".
-line_interval(type:number) default="The interval between successive stitch lines.".
-"""
-
diff --git a/bin/pychart/font.py b/bin/pychart/font.py
deleted file mode 100644
index 593666bb015..00000000000
--- a/bin/pychart/font.py
+++ /dev/null
@@ -1,454 +0,0 @@
-#
-# Copyright (C) 2000-2005 by Yasushi Saito (yasushi.saito@gmail.com)
-#
-# Jockey is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2, or (at your option) any
-# later version.
-#
-# Jockey is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# for more details.
-#
-import color
-import string
-import pychart_util
-import re
-import theme
-import afm.dir
-
-
-__doc__ = """The module for manipulating texts and their attributes.
-
-Pychart supports extensive sets of attributes in texts. All attributes
-are specified via "escape sequences", starting from letter "/". For
-example, the below examples draws string "Hello" using a 12-point font
-at 60-degree angle:
-
-/12/a60{}Hello
-
-List of attributes:
-
-/hA
- Specifies horizontal alignment of the text. A is one of L (left
- alignment), R (right alignment), or C (center alignment).
-/vA
- Specifies vertical alignment of the text. A is one of "B"
- (bottom), "T" (top), " M" (middle).
-
-/F{FONT}
- Switch to FONT font family.
-/T
- Shorthand of /F{Times-Roman}.
-/H
- Shorthand of /F{Helvetica}.
-/C
- Shorthand of /F{Courier}.
-/B
- Shorthand of /F{Bookman-Demi}.
-/A
- Shorthand of /F{AvantGarde-Book}.
-/P
- Shorthand of /F{Palatino}.
-/S
- Shorthand of /F{Symbol}.
-/b
- Switch to bold typeface.
-/i
- Switch to italic typeface.
-/o
- Switch to oblique typeface.
-/DD
- Set font size to DD points.
-
- /20{}2001 space odyssey!
-
-/cDD
- Set gray-scale to 0.DD. Gray-scale of 00 means black, 99 means white.
-
-//, /{, /}
- Display `/', `@', or `@{'.
-
-{ ... }
- Limit the effect of escape sequences. For example, the below
- example draws "Foo" at 12pt, "Bar" at 8pt, and "Baz" at 12pt.
-
- /12Foo{/8Bar}Baz
-\n
- Break the line.
-"""
-
-# List of fonts for which their absence have been already warned.
-_undefined_font_warned = {}
-
-def _intern_afm(font, text):
- global _undefined_font_warned
- font2 = _font_aliases.has_key(font) and _font_aliases[font]
- if afm.dir.afm.has_key(font):
- return afm.dir.afm[font]
- if afm.dir.afm.has_key(font2):
- return afm.dir.afm[font2]
-
- try:
- exec("import pychart.afm.%s" % re.sub("-", "_", font))
- return afm.dir.afm[font]
- except:
- if not font2 and not _undefined_font_warned.has_key(font):
- pychart_util.warn("Warning: unknown font '%s' while parsing '%s'" % (font, text))
- _undefined_font_warned[font] = 1
-
- if font2:
- try:
- exec("import pychart.afm.%s" % re.sub("-", "_", font2))
- return afm.dir.afm[font2]
- except:
- if not _undefined_font_warned.has_key(font):
- pychart_util.warn("Warning: unknown font '%s' while parsing '%s'" % (font, text))
- _undefined_font_warned[font] = 1
- return None
-def line_width(font, size, text):
- table = _intern_afm(font, text)
- if not table:
- return 0
-
- width = 0
- for ch in text:
- code = ord(ch)
- if code < len(table):
- width += table[code]
- else:
- width += 10000
-
- width = float(width) * size / 1000.0
- return width
-
-_font_family_map = {'T': "Times",
- 'H': "Helvetica",
- 'C': "Courier",
- 'N': "Helvetica-Narrow",
- 'B': "Bookman-Demi",
- 'A': "AvantGarde-Book",
- 'P': "Palatino",
- 'S': "Symbol"}
-
-# Aliases for ghostscript font names.
-
-_font_aliases = {
- 'Bookman-Demi': "URWBookmanL-DemiBold%I",
- 'Bookman-DemiItalic': "URWBookmanL-DemiBoldItal",
- 'Bookman-Demi-Italic': "URWBookmanL-DemiBoldItal",
- 'Bookman-Light': "URWBookmanL-Ligh",
- 'Bookman-LightItalic': "URWBookmanL-LighItal",
- 'Bookman-Light-Italic': "URWBookmanL-LighItal",
- 'Courier': "NimbusMonL-Regu",
- 'Courier-Oblique': "NimbusMonL-ReguObli",
- 'Courier-Bold': "NimbusMonL-Bold",
- 'Courier-BoldOblique': "NimbusMonL-BoldObli",
- 'AvantGarde-Book': "URWGothicL-Book",
- 'AvantGarde-BookOblique': "URWGothicL-BookObli",
- 'AvantGarde-Book-Oblique': "URWGothicL-BookObli",
- 'AvantGarde-Demi': "URWGothicL-Demi",
- 'AvantGarde-DemiOblique': "URWGothicL-DemiObli",
- 'AvantGarde-Demi-Oblique': "URWGothicL-DemiObli",
- 'Helvetica': "NimbusSanL-Regu",
- 'Helvetica-Oblique': "NimbusSanL-ReguItal",
- 'Helvetica-Bold': "NimbusSanL-Bold",
- 'Helvetica-BoldOblique': "NimbusSanL-BoldItal",
- 'Helvetica-Narrow': "NimbusSanL-ReguCond",
- 'Helvetica-Narrow-Oblique': "NimbusSanL-ReguCondItal",
- 'Helvetica-Narrow-Bold': "NimbusSanL-BoldCond",
- 'Helvetica-Narrow-BoldOblique': "NimbusSanL-BoldCondItal",
- 'Palatino-Roman': "URWPalladioL-Roma",
- 'Palatino': "URWPalladioL-Roma",
- 'Palatino-Italic': "URWPalladioL-Ital",
- 'Palatino-Bold': "URWPalladioL-Bold",
- 'Palatino-BoldItalic': "URWPalladioL-BoldItal",
- 'NewCenturySchlbk-Roman': "CenturySchL-Roma",
- 'NewCenturySchlbk': "CenturySchL-Roma",
- 'NewCenturySchlbk-Italic': "CenturySchL-Ital",
- 'NewCenturySchlbk-Bold': "CenturySchL-Bold",
- 'NewCenturySchlbk-BoldItalic': "CenturySchL-BoldItal",
- 'Times-Roman': "NimbusRomNo9L-Regu",
- 'Times': "NimbusRomNo9L-Regu",
- 'Times-Italic': "NimbusRomNo9L-ReguItal",
- 'Times-Bold': "NimbusRomNo9L-Medi",
- 'Times-BoldItalic': "NimbusRomNo9L-MediItal",
- 'Symbol': "StandardSymL",
- 'ZapfChancery-MediumItalic': "URWChanceryL-MediItal",
- 'ZapfChancery-Medium-Italic': "URWChanceryL-MediItal",
- 'ZapfDingbats': "Dingbats"
-}
-
-
-class text_state:
- def copy(self):
- ts = text_state()
- ts.family = self.family
- ts.modifiers = list(self.modifiers)
- ts.size = self.size
- ts.line_height = self.line_height
- ts.color = self.color
- ts.halign = self.halign
- ts.valign = self.valign
- ts.angle = self.angle
- return ts
- def __init__(self):
- self.family = theme.default_font_family
- self.modifiers = [] # 'b' for bold, 'i' for italic, 'o' for oblique.
- self.size = theme.default_font_size
- self.line_height = theme.default_line_height or theme.default_font_size
- self.color = color.default
- self.halign = theme.default_font_halign
- self.valign = theme.default_font_valign
- self.angle = theme.default_font_angle
-
-class text_iterator:
- def __init__(self, s):
- self.str = str(s)
- self.i = 0
- self.ts = text_state()
- self.stack = []
- def reset(self, s):
- self.str = str(s)
- self.i = 0
-
- def __return_state(self, ts, str):
- font_name = ts.family
-
- if ts.modifiers != []:
- is_bold = 0
- if 'b' in ts.modifiers:
- is_bold = 1
- font_name += "-Bold"
- if 'o' in ts.modifiers:
- if not is_bold:
- font_name += "-"
- font_name += "Oblique"
- elif 'i' in ts.modifiers:
- if not is_bold:
- font_name += "-"
- font_name += "Italic"
- elif font_name in ("Palatino", "Times", "NewCenturySchlbk"):
- font_name += "-Roman"
-
- return (font_name, ts.size, ts.line_height, ts.color,
- ts.halign, ts.valign, ts.angle, str)
- def __parse_float(self):
- istart = self.i
- while self.i < len(self.str) and self.str[self.i] in string.digits or self.str[self.i] == '.':
- self.i += 1
- return float(self.str[istart:self.i])
-
- def __parse_int(self):
- istart = self.i
- while self.i < len(self.str) and \
- (self.str[self.i] in string.digits or
- self.str[self.i] == '-'):
- self.i += 1
- return int(self.str[istart:self.i])
- def next(self):
- "Get the next text segment. Return an 8-element array: (FONTNAME, SIZE, LINEHEIGHT, COLOR, H_ALIGN, V_ALIGN, ANGLE, STR."
- l = []
- changed = 0
- self.old_state = self.ts.copy()
-
- while self.i < len(self.str):
- if self.str[self.i] == '/':
- self.i = self.i+1
- ch = self.str[self.i]
- self.i = self.i+1
- self.old_state = self.ts.copy()
- if ch == '/' or ch == '{' or ch == '}':
- l.append(ch)
- elif _font_family_map.has_key(ch):
- self.ts.family = _font_family_map[ch]
- changed = 1
- elif ch == 'F':
- # /F{font-family}
- if self.str[self.i] != '{':
- raise Exception, "'{' must follow /F in \"%s\"" % self.str
- self.i += 1
- istart = self.i
- while self.str[self.i] != '}':
- self.i += 1
- if self.i >= len(self.str):
- raise Exception, "Expecting /F{...}. in \"%s\"" % self.str
- self.ts.family = self.str[istart:self.i]
- self.i += 1
- changed = 1
-
- elif ch in string.digits:
- self.i -= 1
- self.ts.size = self.__parse_int()
- self.ts.line_height = self.ts.size
- changed = 1
- elif ch == 'l':
- self.ts.line_height = self.__parse_int()
- changed = 1
- elif ch == 'b':
- self.ts.modifiers.append('b')
- changed = 1
- elif ch == 'i':
- self.ts.modifiers.append('i')
- changed = 1
- elif ch == 'o':
- self.ts.modifiers.append('q')
- changed = 1
- elif ch == 'c':
- self.ts.color = color.gray_scale(self.__parse_float())
- elif ch == 'v':
- if self.str[self.i] not in "BTM":
- raise Exception, "Undefined escape sequence: /v%c (%s)" % (self.str[self.i], self.str)
- self.ts.valign = self.str[self.i]
- self.i += 1
- changed = 1
- elif ch == 'h':
- if self.str[self.i] not in "LRC":
- raise Exception, "Undefined escape sequence: /h%c (%s)" % (self.str[self.i], self.str)
- self.ts.halign = self.str[self.i]
- self.i += 1
- changed = 1
- elif ch == 'a':
- self.ts.angle = self.__parse_int()
- changed = 1
- else:
- raise Exception, "Undefined escape sequence: /%c (%s)" % (ch, self.str)
- elif self.str[self.i] == '{':
- self.stack.append(self.ts.copy())
- self.i += 1
- elif self.str[self.i] == '}':
- if len(self.stack) == 0:
- raise ValueError, "unmatched '}' in \"%s\"" % (self.str)
- self.ts = self.stack[-1]
- del self.stack[-1]
- self.i += 1
- changed = 1
- else:
- l.append(self.str[self.i])
- self.i += 1
-
- if changed and len(l) > 0:
- return self.__return_state(self.old_state, ''.join(l))
- else:
- # font change in the beginning of the sequence doesn't count.
- self.old_state = self.ts.copy()
- changed = 0
- if len(l) > 0:
- return self.__return_state(self.old_state, ''.join(l))
- else:
- return None
-
-#
-#
-
-def unaligned_get_dimension(text):
- """Return the bounding box of the text, assuming that the left-bottom corner
- of the first letter of the text is at (0, 0). This procedure ignores
- /h, /v, and /a directives when calculating the BB; it just returns the
- alignment specifiers as a part of the return value. The return value is a
- tuple (width, height, halign, valign, angle)."""
-
- xmax = 0
- ymax = 0
- ymax = 0
- angle = None
- halign = None
- valign = None
-
- itr = text_iterator(None)
- for line in str(text).split("\n"):
- cur_height = 0
- cur_width = 0
- itr.reset(line)
- while 1:
- elem = itr.next()
- if not elem:
- break
- (font, size, line_height, color, new_h, new_v, new_a, chunk) = elem
- if halign != None and new_h != halign:
- raise Exception, "Only one /h can appear in string '%s'." % str(text)
- if valign != None and new_v != valign:
- raise Exception, "Only one /v can appear in string '%s'." % str(text)
- if angle != None and new_a != angle:
- raise Exception, "Only one /a can appear in string '%s'." % str(text)
- halign = new_h
- valign = new_v
- angle = new_a
- cur_width += line_width(font, size, chunk)
- cur_height = max(cur_height, line_height)
- xmax = max(cur_width, xmax)
- ymax += cur_height
- return (xmax, ymax,
- halign or theme.default_font_halign,
- valign or theme.default_font_valign,
- angle or theme.default_font_angle)
-
-def get_dimension(text):
- """Return the bounding box of the ,
- assuming that the left-bottom corner
- of the first letter of the text is at (0, 0). This procedure ignores
- /h, /v, and /a directives when calculating the boundingbox; it just returns the
- alignment specifiers as a part of the return value. The return value is a
- tuple (width, height, halign, valign, angle)."""
- (xmax, ymax, halign, valign, angle) = unaligned_get_dimension(text)
- xmin = ymin = 0
- if halign == "C":
- xmin = -xmax / 2.0
- xmax = xmax / 2.0
- elif halign == "R":
- xmin = -xmax
- xmax = 0
- if valign == "M":
- ymin = -ymax / 2.0
- ymax = ymax / 2.0
- elif valign == "T":
- ymin = -ymax
- ymax = 0
- if angle != 0:
- (x0, y0) = pychart_util.rotate(xmin, ymin, angle)
- (x1, y1) = pychart_util.rotate(xmax, ymin, angle)
- (x2, y2) = pychart_util.rotate(xmin, ymax, angle)
- (x3, y3) = pychart_util.rotate(xmax, ymax, angle)
- xmax = max(x0, x1, x2, x3)
- xmin = min(x0, x1, x2, x3)
- ymax = max(y0, y1, y2, y3)
- ymin = min(y0, y1, y2, y3)
- return (xmin, xmax, ymin, ymax)
- return (xmin, xmax, ymin, ymax)
-
-def unaligned_text_width(text):
- x = unaligned_get_dimension(text)
- return x[0]
-
-def text_width(text):
- """Return the width of the in points."""
- (xmin, xmax, d1, d2) = get_dimension(text)
- return xmax-xmin
-
-def unaligned_text_height(text):
- x = unaligned_get_dimension(text)
- return x[1]
-
-def text_height(text):
- """Return the total height of the and the length from the
- base point to the top of the text box."""
- (d1, d2, ymin, ymax) = get_dimension(text)
- return (ymax-ymin, ymax)
-
-def get_align(text):
- "Return (halign, valign, angle) of the ."
- (x1, x2, h, v, a) = unaligned_get_dimension(text)
- return (h, v, a)
-
-def quotemeta(text):
- """Quote letters with special meanings in pychart so that will display
- as-is when passed to canvas.show().
-
->>> font.quotemeta("foo/bar")
-"foo//bar"
-"""
- text = re.sub("/", "//", text)
- text = re.sub("\\{", "/{", text)
- text = re.sub("\\}", "/}", text)
- return text
diff --git a/bin/pychart/generate_docs.py b/bin/pychart/generate_docs.py
deleted file mode 100644
index 9e0461249a2..00000000000
--- a/bin/pychart/generate_docs.py
+++ /dev/null
@@ -1,125 +0,0 @@
-#
-# Copyright (C) 2000-2005 by Yasushi Saito (yasushi.saito@gmail.com)
-#
-# Jockey is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2, or (at your option) any
-# later version.
-#
-# Jockey is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# for more details.
-#
-import string
-import doc_support
-import sys
-import re
-import os
-
-import area
-import arrow
-import axis
-import bar_plot
-import line_plot
-import pie_plot
-import color
-import error_bar
-import fill_style
-import font
-import text_box
-import line_style
-import legend
-import range_plot
-import tick_mark
-
-indent = 4
-max_line_len = 64
-
-def format_paragraph(fp, str):
- line_len = indent
- fp.write(" " * indent)
- for word in str.split():
- if line_len >= max_line_len:
- fp.write("\n")
- fp.write(" " * indent)
- line_len = indent
- fp.write(word + " ")
- line_len += len(word) + 1
-
-def format_string(fp, str):
- str = re.sub("<<([^>]+)>>", "See also pychart.\\1", str)
-
- str2 = ""
- in_example = 0
- for l in str.split("\n"):
- if re.match("@example", l):
- in_example = 1
- if re.match("@end example", l):
- in_example = 0
- if in_example:
- str2 += l
- else:
- l = re.sub("^[ \t]*", "", l)
- str2 += l
- str2 += "\n"
- fname = os.tempnam()
- out_fp = open(fname, "w")
- out_fp.write(str2)
- out_fp.close()
-
- in_fp = os.popen("makeinfo --fill-column=64 --no-headers " + fname, "r")
- for l in in_fp.readlines():
- fp.write(" " * indent)
- fp.write(l)
- in_fp.close()
- os.remove(fname)
-
-def generate_doc(c, name, suffix="", append = 0):
- if append:
- fp = open(name + "_doc.py", "a+")
- else:
- fp = open(name + "_doc.py", "w")
- fp.write("# automatically generated by generate_docs.py.\n")
-
- fp.write("doc" + suffix + "=\"\"\"Attributes supported by this class are:\n")
- for key in c.keys.keys():
- val=c.keys[key]
- desc = ""
- defaultValDesc = None
- if len(val) > 3:
- desc = val[3]
- if len(val) > 4:
- defaultValDesc = val[4]
-
- fp.write(key + "(type:" + doc_support.stringify_type(val[0]))
- if defaultValDesc:
- fp.write(") default:" + defaultValDesc)
- else:
- fp.write(") default=" + str(doc_support.stringify_value(val[2])) + ".\n")
- format_string(fp, desc)
- fp.write("\"\"\"\n\n")
- fp.close()
-
-
-generate_doc(arrow.T, "arrow")
-generate_doc(area.T, "area")
-generate_doc(axis.X, "axis", "_x")
-generate_doc(axis.Y, "axis", "_y", 1)
-generate_doc(bar_plot.T, "bar_plot")
-generate_doc(line_plot.T, "line_plot")
-generate_doc(pie_plot.T, "pie_plot")
-generate_doc(color.T, "color")
-generate_doc(error_bar.error_bar1, "error_bar","_1")
-generate_doc(error_bar.error_bar2, "error_bar", "_2", 1)
-generate_doc(error_bar.error_bar3, "error_bar", "_3", 1)
-generate_doc(error_bar.error_bar4, "error_bar", "_4", 1)
-generate_doc(error_bar.error_bar5, "error_bar", "_5", 1)
-generate_doc(error_bar.error_bar6, "error_bar", "_6", 1)
-generate_doc(fill_style.T, "fill_style")
-generate_doc(text_box.T, "text_box")
-generate_doc(range_plot.T, "range_plot")
-generate_doc(legend.T, "legend")
-generate_doc(legend.Entry, "legend", "_entry", 1)
-generate_doc(line_style.T, "line_style")
-generate_doc(tick_mark.T, "tick_mark")
diff --git a/bin/pychart/gs_frontend.py b/bin/pychart/gs_frontend.py
deleted file mode 100644
index 144f19de109..00000000000
--- a/bin/pychart/gs_frontend.py
+++ /dev/null
@@ -1,87 +0,0 @@
-#
-# Copyright (C) 2000-2005 by Yasushi Saito (yasushi.saito@gmail.com)
-#
-# Jockey is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2, or (at your option) any
-# later version.
-#
-# Jockey is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# for more details.
-#
-import pychart_util
-import theme
-import sys
-import os
-import os.path
-import pscanvas
-import tempfile
-import string
-import basecanvas
-from scaling import *
-
-def get_gs_path():
- """Guess where the Ghostscript executable is
- and return its absolute path name."""
- path = os.defpath
- if os.environ.has_key("PATH"):
- path = os.environ["PATH"]
- for dir in path.split(os.pathsep):
- for name in ("gs", "gs.exe", "gswin32c.exe"):
- g = os.path.join(dir, name)
- if os.path.exists(g):
- return g
- raise Exception, "Ghostscript not found."
-
-class T(pscanvas.T):
- def __write_contents(self, fp):
- fp.write(pscanvas.preamble_text)
- for name, id in self.__font_ids.items():
- fp.write("/%s {/%s findfont SF} def\n" % (id, name))
- fp.write("%d %d translate\n" % (-self.bbox[0], -self.bbox[1]))
- fp.writelines(self.__output_lines)
- fp.write("showpage end\n")
- fp.flush()
-
- def close(self):
- # Don't call pscanvas.T.close, as it creates a
- # ps file.
- basecanvas.T.close(self)
-
- def start_gs(self, arg):
- self.bbox = theme.adjust_bounding_box([xscale(self.__xmin),
- yscale(self.__ymin),
- xscale(self.__xmax),
- yscale(self.__ymax)])
-
- gs_path = get_gs_path()
- self.pipe_fp = None
- if self.__output_lines == []:
- return
-
- if sys.platform != "win32" and hasattr(os, "popen"):
- # UNIX-like systems
- cmdline = "\"%s\" -q %s -g%dx%d -q >/dev/null 2>&1" % \
- (gs_path, arg,
- self.bbox[2] - self.bbox[0],
- self.bbox[3] - self.bbox[1])
- self.pipe_fp = os.popen(cmdline, "w")
- self.__write_contents(self.pipe_fp)
- else:
- # XXX should use mktemp, but need to support python<=2.2 as well.
- fname = tempfile.mktemp("xxx")
- fp = open(fname, "wb")
- self.__write_contents(fp)
- fp.close()
- cmdline = "\"%s\" -q %s -g%dx%d -q <%s >NUL" % \
- (gs_path, arg,
- self.bbox[2] - self.bbox[0],
- self.bbox[3] - self.bbox[1], fname)
- os.system(cmdline)
- os.unlink(fname)
- def close_gs(self):
- if self.pipe_fp:
- self.pipe_fp.close()
- self.pipe_fp = None
diff --git a/bin/pychart/interval_bar_plot.py b/bin/pychart/interval_bar_plot.py
deleted file mode 100644
index 084ad296f60..00000000000
--- a/bin/pychart/interval_bar_plot.py
+++ /dev/null
@@ -1,228 +0,0 @@
-#
-# Copyright (C) 2000-2005 by Yasushi Saito (yasushi.saito@gmail.com)
-#
-# Jockey is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2, or (at your option) any
-# later version.
-#
-# Jockey is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# for more details.
-#
-import line_style
-import fill_style
-import pychart_util
-import chart_object
-import legend
-import bar_plot_doc
-import theme
-from types import *
-from pychart_types import *
-
-fill_styles = None
-
-_keys = {
- "direction" : (StringType, "vertical",
- """The direction the growth of the bars. The value is either 'horizontal'
- or 'vertical'."""),
- "data" : (AnyType, None, """Specifes data points. Unlike other types
- of charts, the "hcol"th column of the data must be a sequence of
- numbers, not just a single number. See also the description of
- "hcol"."""
- ),
- "data_label_offset": (CoordType, (0, 5),
- "The location of data labels relative to the sample point. See also attribute data_label_format."),
-
- "data_label_format": (FormatType, None, """The
- format string for the label displayed besides each
- bar. It can be a `printf' style format
- string, or a two-parameter function that
- takes (x,y) values and returns a string. """
- + pychart_util.string_desc),
-
- "label": (StringType, "???", pychart_util.label_desc),
- "bcol" : (IntType, 0,
- """Specifies the column from which base values (i.e., X values when attribute "direction" is "vertical", Y values otherwise) are extracted.
-The
- combination of "data", "bcol", and "hcol" attributes defines
- the set of boxes drawn by this chart.
- See also the descriptions of the 'bcol' and 'data' attributes.
- """),
- "hcol": (IntType, 1,
- """The column from which the base and height of
- bars are extracted. See the below example:
-
-@example
- d = [[5,[10,15,22]], [7,[22,23,5,10]], [8,[25,3]]]
- p = interval_bar_plot.T(data = d, bcol = 0, hcol = 1)
-@end example
-
- Here, three sequence of bars will be drawn.
- The X locations of the bars
- will be 5, 7, and 8. For example, at location X=7,
- three bars are drawn,
- one corresponding to Y values of 22 to 45 (=22+23),
- and the second one for values 45 to 50, and the third one
- for values 50 to 60. The line and fill styles of the bars
- are picked in a round-robin fashion
- from attributes "line_styles" and
- "fill_styles".
- """),
- "line_styles": (ListType, [line_style.default, None],
- """The list of line styles for bars.
- The style of each bar is chosen in a round-robin fashion, if the
- number of elements in "line_styles" is smaller than
- actual number of boxes."""),
- "fill_styles": (ListType, [lambda: fill_styles.next(), None],
- """List of fill styles for bars.
- The style of each bar is chosen in a round-robin fashion, if the
- number of elements in "line_styles" is smaller than
- actual number of boxes.
- If this attribute is omitted,
- a style is picked from standard styles round-robin. <>."""),
- "cluster": (TupleType, (0, 1), """This attribute is used to
- cluster multiple bar plots side by side in a single chart.
- The value should be a tuple of two integers. The second value should be equal to the total number of bar plots in the chart. The first value should be the relative position of this chart; 0 places this chart the leftmost, and N-1
- (where N is the 2nd value of this attribute) places this chart the rightmost. Consider the below example:
-
-@example
- a = area.T(...)
- p1 = interval_bar_plot.T(data = [[1, [20,10]][2,[30,5]]], cluster=(0,2))
- p2 = interval_bar_plot.T(data = [[1,[25,11,2]],[2,[10,5,3]]], cluster=(1,2))
- a.add_plot(p1, p2)
- a.draw()
-@end example
-
- In this example, one group of bars will be drawn side-by-side at
- position x=1.
- Other two bars will be drawn side by side at position x=2.
- See also the description of attribute "cluster" for bar_plot.T.
- """),
- "width": (UnitType, 5, """Width of each box. The unit is in points.
-@cindex width, bar chart
-@cindex size, bar chart
-"""),
- "cluster_sep": (UnitType, 0, """The separation between
- clustered boxes. The unit is points."""),
- "stack_on": (AnyType, None,
- "The value must be either None or bar_plot.T. If not None, bars of this plot are stacked on top of another bar plot."),
- }
-
-class T(chart_object.T):
- __doc__ = bar_plot_doc.doc
- keys = _keys
- def check_integrity(self):
- self.type_check()
- def get_value(self, bval):
- for pair in self.data:
- if pair[self.bcol] == bval:
- return pair[self.hcol]
- raise ValueError, str(bval) + ": can't find the xval"
-
- def __get_data_range(self, col):
- gmin = 99999999
- gmax = -99999999
- for item in self.data:
- seq = item[col]
- if seq[0] < gmin: gmin = seq[0]
- max = 0
- for v in seq:
- max += v
- if max > gmax: gmax = max
- return (gmin, gmax)
-
- def get_data_range(self, which):
- if self.direction == 'vertical':
- if which == 'X':
- return pychart_util.get_data_range(self.data, self.bcol)
- else:
- return self.__get_data_range(self.hcol)
- else:
- assert self.direction == 'horizontal'
- if which == 'Y':
- return pychart_util.get_data_range(self.data, self.bcol)
- else:
- return self.__get_data_range(self.hcol)
-
- def get_style(self, nth):
- line_style = self.line_styles[nth % len(self.line_styles)]
- fill_style = self.fill_styles[nth % len(self.fill_styles)]
- return (line_style, fill_style)
-
- def draw_vertical(self, ar, can):
- for pair in self.data:
- xval = pair[self.bcol]
- yvals = pychart_util.get_sample_val(pair, self.hcol)
-
- if None in (xval, yvals): continue
-
- ybot = 0
-
- totalWidth = (self.width+self.cluster_sep) * self.cluster[1] - self.cluster_sep
- firstX = ar.x_pos(xval) - totalWidth/2.0
- thisX = firstX + (self.width+self.cluster_sep) * self.cluster[0] - self.cluster_sep
-
- cury = yvals[0]
- n = 0
-
- for yval in yvals[1:]:
- (line_style, fill_style) = self.get_style(n)
- can.rectangle(line_style, fill_style,
- thisX, ar.y_pos(cury), thisX+self.width,
- ar.y_pos(cury + yval))
- cury += yval
- n += 1
-
- if self.data_label_format:
- can.show(thisX + self.width/2.0 + self.data_label_offset[0],
- ar.y_pos(cury) + self.data_label_offset[1],
- "/hC" + pychart_util.apply_format(self.data_label_format, (pair[self.bcol], pair[self.hcol]), 1))
-
- def draw_horizontal(self, ar, can):
- for pair in self.data:
- yval = pair[self.bcol]
- xvals = pychart_util.get_sample_val(pair, self.hcol)
-
- if None in (xvals, yval): continue
-
- totalWidth = (self.width+self.cluster_sep) * self.cluster[1] - self.cluster_sep
- firstY = ar.y_pos(yval) - totalWidth/2.0
- thisY = firstY + (self.width+self.cluster_sep) * self.cluster[0] - self.cluster_sep
-
- curx = xvals[0]
- n = 0
- for xval in xvals[1:]:
- line_style, fill_style = self.get_style(n)
- can.rectangle(line_style, fill_style,
- ar.x_pos(curx), thisY,
- ar.x_pos(xval), thisY+self.width)
- curx = xval
- n += 1
-
- def get_legend_entry(self):
- if self.label:
- return legend.Entry(line_style=self.line_styles[0],
- fill_style=self.fill_styles[0],
- label=self.label)
- return None
-
- def draw(self, ar, can):
- self.type_check()
- can.clip(ar.loc[0], ar.loc[1],
- ar.loc[0] + ar.size[0], ar.loc[1] + ar.size[1])
-
- if self.direction == "vertical":
- self.draw_vertical(ar, can)
- else:
- self.draw_horizontal(ar, can)
-
- can.endclip()
-
-def init():
- global fill_styles
- fill_styles = fill_style.standards.iterate()
-
-theme.add_reinitialization_hook(init)
-
diff --git a/bin/pychart/legend.py b/bin/pychart/legend.py
deleted file mode 100644
index c45f6ff5729..00000000000
--- a/bin/pychart/legend.py
+++ /dev/null
@@ -1,181 +0,0 @@
-#
-# Copyright (C) 2000-2005 by Yasushi Saito (yasushi.saito@gmail.com)
-#
-# Jockey is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2, or (at your option) any
-# later version.
-#
-# Jockey is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# for more details.
-#
-import tick_mark
-import font
-import line_style
-import color
-import fill_style
-import chart_object
-import pychart_util
-import types
-import legend_doc
-import theme
-
-from pychart_types import *
-from types import *
-
-class Entry(chart_object.T):
- keys = {"line_len" : (UnitType, None,
- "Length of the sample line for line plots. If omitted, it is set to be theme.default_font_size"),
- "rect_size" : (UnitType, None,
- "Size of the sample 'blob' for bar range charts. If omitted, it is set to be 70% of theme.default_size"),
- "tick_mark": (tick_mark.T, None, ""),
- "line_style": (line_style.T, None, ""),
- "fill_style": (fill_style.T, None, ""),
- "label": (StringType, "???", ""),
- }
- __doc__ = legend_doc.doc_entry
-##AUTOMATICALLY GENERATED
-
-##END AUTOMATICALLY GENERATED
-
- def label_width(self):
- return font.text_width(" " + self.label)
- def get_line_len(self):
- return self.line_len or theme.default_font_size
- def get_rect_size(self):
- return self.rect_size or theme.default_font_size * 7 / 10.0
-
- def sample_width(self):
- w = 0
- if self.fill_style != None:
- w += self.get_line_len()
- elif self.line_style != None:
- w += self.get_line_len()
- elif self.tick_mark != None:
- w += self.tick_mark.size
- return w
- def height(self):
- h = font.text_height(self.label)[0]
- return h
-
- def draw(self, ar, can, x_tick, x_label, y):
- """Draw a legend entry. X_TICK and X_LABEL are the X location \
- (in points) of where the sample and label are drawn."""
-
- rect_size = self.get_rect_size()
- line_len = self.get_line_len()
-
- nr_lines = len(self.label.split("\n"))
- text_height = font.text_height(self.label)[0]
- line_height = text_height / float(nr_lines)
- y_center = y + text_height - line_height/1.5
-
- if self.fill_style != None:
- can.rectangle(self.line_style, self.fill_style,
- x_tick, y_center - rect_size/2.0,
- x_tick + rect_size,
- y_center + rect_size/2.0)
- elif self.line_style != None:
- can.line(self.line_style, x_tick, y_center,
- x_tick + line_len, y_center)
- if self.tick_mark != None:
- self.tick_mark.draw(can, x_tick + line_len/2.0, y_center)
- elif self.tick_mark != None:
- self.tick_mark.draw(can, x_tick, y_center)
-
- can.show(x_label, y, self.label)
-
-__doc__ = """Legend is a rectangular box drawn in a chart to describe
-the meanings of plots. The contents of a legend box is extracted from
-plots' "label", "line-style", and "tick-mark" attributes.
-
-This module exports a single class, legend.T. Legend.T is a part of
-an area.T object, and is drawn automatically when area.draw() method
-is called. """
-
-class T(chart_object.T):
- __doc__ = legend_doc.doc
- keys = {
- "inter_row_sep": (UnitType, 0,
- "Space between each row in the legend."),
- "inter_col_sep": (UnitType, 0,
- "Space between each column in the legend."),
- "frame_line_style": (line_style.T, line_style.default, ""),
- "frame_fill_style": (fill_style.T, fill_style.white, ""),
- "top_fudge": (UnitType, 0,
- "Amount of space above the first line."),
- "bottom_fudge": (UnitType, 3,
- "Amount of space below the last line."),
- "left_fudge": (UnitType, 5,
- "Amount of space left of the legend."),
- "right_fudge": (UnitType, 5,
- "Amount of space right of the legend."),
- "loc": (CoordType, None,
- """Bottom-left corner of the legend.
- The default location of a legend is the bottom-right end of the chart."""),
- "shadow": (ShadowType, None, pychart_util.shadow_desc),
- "nr_rows": (IntType, 9999, "Number of rows in the legend. If the number of plots in a chart is larger than nr_rows, multiple columns are created in the legend."),
-
- }
-##AUTOMATICALLY GENERATED
-
-##END AUTOMATICALLY GENERATED
- def draw(self, ar, entries, can):
- if not self.loc:
- x = ar.loc[0] + ar.size[0] * 1.1
- y = ar.loc[1]
- else:
- x = self.loc[0]
- y = self.loc[1]
-
- nr_rows = min(self.nr_rows, len(entries))
- nr_cols = (len(entries)-1) / nr_rows + 1
-
- ymin = y
- max_label_width = [0] * nr_cols
- max_sample_width = [0] * nr_cols
- heights = [0] * nr_rows
-
- for i in range(len(entries)):
- l = entries[i]
- (col, row) = divmod(i, nr_rows)
- max_label_width[col] = max(l.label_width(), max_label_width[col])
- max_sample_width[col] = max(l.sample_width(), max_sample_width[col])
- heights[row] = max(l.height(), heights[row])
-
- for h in heights:
- y += h
- y += self.inter_row_sep * (nr_rows - 1)
- ymax = y
-
- tot_width = self.inter_col_sep * (nr_cols -1)
- for w in max_label_width:
- tot_width += w
- for w in max_sample_width:
- tot_width += w
-
- can.rectangle(self.frame_line_style, self.frame_fill_style,
- x - self.left_fudge,
- ymin - self.bottom_fudge,
- x + tot_width + self.right_fudge,
- ymax + self.top_fudge,
- self.shadow)
-
- for col in range(nr_cols):
- this_y = y
- this_x = x
- for row in range(nr_rows):
- idx = col * nr_rows + row
- if idx >= len(entries):
- continue
- this_y -= heights[row]
- l = entries[idx]
- if row != 0:
- this_y -= self.inter_row_sep
-
- l.draw(ar, can, this_x, this_x + max_sample_width[col], this_y)
- x += max_label_width[col] + max_sample_width[col] + self.inter_col_sep
-
-
diff --git a/bin/pychart/legend_doc.py b/bin/pychart/legend_doc.py
deleted file mode 100644
index 2e642fc3b13..00000000000
--- a/bin/pychart/legend_doc.py
+++ /dev/null
@@ -1,28 +0,0 @@
-# automatically generated by generate_docs.py.
-doc="""Attributes supported by this class are:
-inter_col_sep(type:length in points (\\xref{unit})) default="Space between each column in the legend.".
-loc(type:(x,y)) default="Bottom-left corner of the legend.
- The default location of a legend is the bottom-right end of the chart.".
-bottom_fudge(type:length in points (\\xref{unit})) default="Amount of space below the last line.".
-frame_line_style(type:line_style.T) default="".
-nr_rows(type:int) default="Number of rows in the legend. If the number of plots in a chart is larger than nr_rows, multiple columns are created in the legend.".
-right_fudge(type:length in points (\\xref{unit})) default="Amount of space right of the legend.".
-inter_row_sep(type:length in points (\\xref{unit})) default="Space between each row in the legend.".
-top_fudge(type:length in points (\\xref{unit})) default="Amount of space above the first line.".
-left_fudge(type:length in points (\\xref{unit})) default="Amount of space left of the legend.".
-shadow(type:) default="The value is either None or a tuple. When non-None,
-a drop-shadow is drawn beneath the object. X-off, and y-off specifies the
-offset of the shadow relative to the object, and fill specifies the
-style of the shadow (@pxref{module-fill-style}).".
-frame_fill_style(type:fill_style.T) default="".
-"""
-
-doc_entry="""Attributes supported by this class are:
-line_len(type:length in points (\\xref{unit})) default="Length of the sample line for line plots. If omitted, it is set to be theme.default_font_size".
-label(type:str) default="".
-rect_size(type:length in points (\\xref{unit})) default="Size of the sample 'blob' for bar range charts. If omitted, it is set to be 70% of theme.default_size".
-tick_mark(type:tick_mark.T) default="".
-line_style(type:line_style.T) default="".
-fill_style(type:fill_style.T) default="".
-"""
-
diff --git a/bin/pychart/line_plot.py b/bin/pychart/line_plot.py
deleted file mode 100644
index 81b995c86e8..00000000000
--- a/bin/pychart/line_plot.py
+++ /dev/null
@@ -1,150 +0,0 @@
-#
-# Copyright (C) 2000-2005 by Yasushi Saito (yasushi.saito@gmail.com)
-#
-# Jockey is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2, or (at your option) any
-# later version.
-#
-# Jockey is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# for more details.
-#
-import tick_mark
-import line_style
-import pychart_util
-import error_bar
-import chart_object
-import legend
-import object_set
-import line_plot_doc
-import theme
-from pychart_types import *
-from types import *
-
-default_width = 1.2
-line_style_itr = None
-
-
-_keys = {
- "data" : (AnyType, None, pychart_util.data_desc),
- "label": (StringType, "???", pychart_util.label_desc),
- "data_label_offset": (CoordType, (0, 5),
- """The location of data labels relative to the sample point. Meaningful only when data_label_format != None."""),
- "data_label_format": (FormatType, None,
- """The format string for the label printed
- beside a sample point.
- It can be a `printf' style format string, or
- a two-parameter function that takes the (x, y)
- values and returns a string. """
- + pychart_util.string_desc),
- "xcol" : (IntType, 0, pychart_util.xcol_desc),
- "ycol": (IntType, 1, pychart_util.ycol_desc),
- "y_error_minus_col": (IntType, 2,
- """The column (within "data") from which the depth of the errorbar is extracted. Meaningful only when error_bar != None. <>"""),
- "y_error_plus_col": (IntType, -1,
- """The column (within "data") from which the height of the errorbar is extracted. Meaningful only when error_bar != None. <>"""),
- "y_qerror_minus_col": (IntType, -1, "<>"),
- "y_qerror_plus_col": (IntType, -1, "<>"),
-
- "line_style": (line_style.T, lambda: line_style_itr.next(), pychart_util.line_desc,
- "By default, a style is picked from standard styles round-robin. <>"),
-
- "tick_mark": (tick_mark.T, None, pychart_util.tick_mark_desc),
- "error_bar": (error_bar.T, None,
- "The style of the error bar. <>"),
- }
-
-class T(chart_object.T):
- __doc__ = line_plot_doc.doc
- keys = _keys
- def check_integrity(self):
- self.type_check()
-
-##AUTOMATICALLY GENERATED
-
-##END AUTOMATICALLY GENERATED
- def get_data_range(self, which):
- if which == 'X':
- return pychart_util.get_data_range(self.data, self.xcol)
- else:
- return pychart_util.get_data_range(self.data, self.ycol)
- def get_legend_entry(self):
- if self.label:
- return legend.Entry(line_style=self.line_style,
- tick_mark=self.tick_mark,
- fill_style=None,
- label=self.label)
- return None
-
- def draw(self, ar, can):
-
- # Draw the line
-
- clipbox = theme.adjust_bounding_box([ar.loc[0], ar.loc[1],
- ar.loc[0] + ar.size[0],
- ar.loc[1] + ar.size[1]]);
-
- can.clip(clipbox[0],clipbox[1],clipbox[2],clipbox[3])
- if self.line_style:
- points = []
- for pair in self.data:
- yval = pychart_util.get_sample_val(pair, self.ycol)
- xval = pair[self.xcol]
- if None not in (xval, yval):
- points.append((ar.x_pos(xval), ar.y_pos(yval)))
- can.lines(self.line_style, points)
- can.endclip()
-
- # Draw tick marks and error bars
- can.clip(ar.loc[0] - 10, ar.loc[1] - 10,
- ar.loc[0] + ar.size[0] + 10,
- ar.loc[1] + ar.size[1] + 10)
- for pair in self.data:
- x = pair[self.xcol]
- y = pychart_util.get_sample_val(pair, self.ycol)
- if None in (x, y): continue
-
- x_pos = ar.x_pos(x)
- y_pos = ar.y_pos(y)
-
- if self.error_bar:
- plus = pair[self.y_error_plus_col or self.y_error_minus_col]
- minus = pair[self.y_error_minus_col or self.y_error_plus_col]
- if self.y_qerror_minus_col or self.y_qerror_plus_col:
- q_plus = pair[self.y_qerror_plus_col or self.y_qerror_minus_col]
- q_minus = pair[self.y_qerror_minus_col or self.y_qerror_plus_col]
- if None not in (minus,plus,q_minus,q_plus):
- self.error_bar.draw(can, (x_pos, y_pos),
- ar.y_pos(y - minus),
- ar.y_pos(y + plus),
- ar.y_pos(y - q_minus),
- ar.y_pos(y + q_plus))
- else:
- if None not in (minus,plus): #PDS
- self.error_bar.draw(can, (x_pos, y_pos),
- ar.y_pos(y - minus),
- ar.y_pos(y + plus))
-
- if self.tick_mark:
- self.tick_mark.draw(can, x_pos, y_pos)
- if self.data_label_format:
- can.show(x_pos + self.data_label_offset[0],
- y_pos + self.data_label_offset[1],
- "/hC" + pychart_util.apply_format(self.data_label_format, (x, y), 1))
-
- can.endclip()
-
-def init():
- global line_style_itr
- line_styles = object_set.T()
- for org_style in line_style.standards.list():
- style = line_style.T(width = default_width, color = org_style.color,
- dash = org_style.dash)
- line_styles.add(style)
-
- line_style_itr = line_styles.iterate()
-
-theme.add_reinitialization_hook(init)
-
diff --git a/bin/pychart/line_plot_doc.py b/bin/pychart/line_plot_doc.py
deleted file mode 100644
index a1dfe17749c..00000000000
--- a/bin/pychart/line_plot_doc.py
+++ /dev/null
@@ -1,25 +0,0 @@
-# automatically generated by generate_docs.py.
-doc="""Attributes supported by this class are:
-y_qerror_minus_col(type:int) default="<>".
-xcol(type:int) default="The column, within attribute "data", from which the X values of sample points are extracted. <>".
-error_bar(type:error_bar.T) default="The style of the error bar. <>".
-data_label_format(type:printf format string) default="The format string for the label printed
- beside a sample point.
- It can be a `printf' style format string, or
- a two-parameter function that takes the (x, y)
- values and returns a string. The appearance of the string produced here can be
-controlled using escape sequences. <>".
-ycol(type:int) default="The column, within attribute "data", from which the Y values of sample points are extracted. <>".
-label(type:str) default="The label to be displayed in the legend. <>, <>".
-line_style(type:line_style.T) default="The style of the line. ".
- By default, a style is picked from standard styles round-robin.
- See also pychart.line_style
-
-y_error_plus_col(type:int) default="The column (within "data") from which the height of the errorbar is extracted. Meaningful only when error_bar != None. <>".
-tick_mark(type:tick_mark.T) default="Tick marks to be displayed at each sample point. <>".
-y_error_minus_col(type:int) default="The column (within "data") from which the depth of the errorbar is extracted. Meaningful only when error_bar != None. <>".
-data_label_offset(type:(x,y)) default="The location of data labels relative to the sample point. Meaningful only when data_label_format != None.".
-data(type:any) default="Specifies the data points. <>".
-y_qerror_plus_col(type:int) default="<>".
-"""
-
diff --git a/bin/pychart/line_style.py b/bin/pychart/line_style.py
deleted file mode 100644
index c47e09cf669..00000000000
--- a/bin/pychart/line_style.py
+++ /dev/null
@@ -1,158 +0,0 @@
-#
-# Copyright (C) 2000-2005 by Yasushi Saito (yasushi.saito@gmail.com)
-#
-# Jockey is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2, or (at your option) any
-# later version.
-#
-# Jockey is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# for more details.
-#
-import color
-import pychart_util
-import chart_object
-import object_set
-import theme
-import line_style_doc
-from pychart_types import *
-from types import *
-
-_keys = {
- "width" : (UnitType, theme.default_line_width, "Width of the line, in points."),
- "color": (color.T, color.default, "The color of the line."),
- "dash" : (TupleType, None,
- """The value
- of None will draw a solid line. Otherwise, this
- attribute specifies the style of dashed lines.
- The 2N'th value specifies the length of the line (in points),
- and 2N+1'th value specifies the length of the blank.
-
- For example, the dash style of (3,2,4,1) draws a dashed line that
- looks like @samp{---__----_---__----_...}.
- """),
- "cap_style": (IntType, 0,
- """Defines the style of the tip of the line segment.
- 0: butt cap (square cutoff, with no projection beyond),
- 1: round cap (arc), 2: projecting square cap
- (square cutoff, but the line extends half the line width).
- See also Postscript/PDF reference manual."""),
- "join_style": (IntType, 0,
- """Join style. 0: Miter join (sharp, pointed corners),
- 1: round join (rounded corners),
- 2: bevel join (flattened corners).
- See also Postscript/PDF reference manual.""")
- }
-
-class T(chart_object.T):
- __doc__ = line_style_doc.doc
- keys = _keys
-##AUTOMATICALLY GENERATED
-
-##END AUTOMATICALLY GENERATED
- def __str__(self):
- s = name_table().lookup(self)
- if s:
- return s
- return "" \
- % (self.width, self.color, self.dash, self.cap_style, self.join_style)
-
-default = T(color=color.default)
-
-dash1 = 1.5,1.5 # - - - -
-dash2 = 5,2,5,2 # -- -- -- --
-dash3 = 1,1
-
-black = T(color=color.black)
-black_dash1 = T(color=color.black, dash=dash1)
-black_dash2 = T(color=color.black, dash=dash2)
-black_dash3 = T(color=color.black, dash=dash3)
-
-gray70 = T(color=color.gray70)
-gray70_dash1 = T(color=color.gray70, dash=dash1)
-gray70_dash2 = T(color=color.gray70, dash=dash2)
-gray70_dash3 = T(color=color.gray70, dash=dash3)
-
-gray10 = T(color=color.gray10)
-gray10_dash1 = T(color=color.gray10, dash=dash1)
-gray10_dash2 = T(color=color.gray10, dash=dash2)
-gray10_dash3 = T(color=color.gray10, dash=dash3)
-
-gray50 = T(color=color.gray50)
-gray50_dash1 = T(color=color.gray50, dash=dash1)
-gray50_dash2 = T(color=color.gray50, dash=dash2)
-gray50_dash3 = T(color=color.gray50, dash=dash3)
-
-gray60 = T(color=color.gray60)
-gray60_dash1 = T(color=color.gray60, dash=dash1)
-gray60_dash2 = T(color=color.gray60, dash=dash2)
-gray60_dash3 = T(color=color.gray60, dash=dash3)
-
-gray90 = T(color=color.gray90)
-gray90_dash1 = T(color=color.gray90, dash=dash1)
-gray90_dash2 = T(color=color.gray90, dash=dash2)
-gray90_dash3 = T(color=color.gray90, dash=dash3)
-
-gray30 = T(color=color.gray30)
-gray30_dash1 = T(color=color.gray30, dash=dash1)
-gray30_dash2 = T(color=color.gray30, dash=dash2)
-gray30_dash3 = T(color=color.gray30, dash=dash3)
-
-white = T(color=color.white)
-default = black
-
-red = T(color=color.red)
-darkblue = T(color=color.darkblue)
-darkseagreen = T(color=color.darkseagreen)
-darkkhaki = T(color = color.darkkhaki)
-
-blue = T(color=color.blue)
-green = T(color=color.green)
-
-red_dash1 = T(color=color.red, dash=dash1)
-darkblue_dash1 = T(color=color.darkblue, dash=dash1)
-darkseagreen_dash1 = T(color=color.darkseagreen, dash=dash1)
-darkkhaki_dash1 = T(color=color.darkkhaki, dash=dash1)
-
-red_dash2 = T(color=color.red, dash=dash2)
-darkblue_dash2 = T(color=color.darkblue, dash=dash2)
-darkseagreen_dash2 = T(color=color.darkseagreen, dash=dash2)
-darkkhaki_dash2 = T(color=color.darkkhaki, dash=dash2)
-
-standards = None
-_name_table = None
-
-def init():
- global standards, _name_table
- standards = object_set.T()
-
- if theme.use_color:
- standards.add(black, red, darkblue, gray70, darkseagreen,
- darkkhaki, gray30,
- black_dash1, red_dash1, darkblue_dash1, gray70_dash1,
- darkseagreen_dash1, darkkhaki_dash1, gray30_dash1,
- black_dash2, red_dash2, darkblue_dash2, gray70_dash2,
- darkseagreen_dash2, darkkhaki_dash2, gray30_dash2)
- else:
- standards.add(black, black_dash1, black_dash2,
- gray70, gray70_dash1, gray70_dash2,
- gray10, gray10_dash1, gray10_dash2,
- gray50, gray50_dash1, gray50_dash2,
- gray90, gray90_dash1, gray90_dash2,
- gray30, gray30_dash1, gray30_dash2,
- black_dash3,
- gray70_dash3, gray10_dash3, gray50_dash3, gray90_dash3)
- for style in standards.list():
- style.width = theme.default_line_width
- _name_table = None
-
-def name_table():
- global _name_table
- if not _name_table:
- _name_table = pychart_util.symbol_lookup_table(globals(), standards)
- return _name_table
-
-init()
-theme.add_reinitialization_hook(init)
diff --git a/bin/pychart/line_style_doc.py b/bin/pychart/line_style_doc.py
deleted file mode 100644
index b936e805122..00000000000
--- a/bin/pychart/line_style_doc.py
+++ /dev/null
@@ -1,24 +0,0 @@
-# automatically generated by generate_docs.py.
-doc="""Attributes supported by this class are:
-color(type:color.T) default="The color of the line.".
-width(type:length in points (\\xref{unit})) default="Width of the line, in points.".
-dash(type:tuple) default="The value
- of None will draw a solid line. Otherwise, this
- attribute specifies the style of dashed lines.
- The 2N'th value specifies the length of the line (in points),
- and 2N+1'th value specifies the length of the blank.
-
- For example, the dash style of (3,2,4,1) draws a dashed line that
- looks like @samp{---__----_---__----_...}.
- ".
-cap_style(type:int) default="Defines the style of the tip of the line segment.
- 0: butt cap (square cutoff, with no projection beyond),
- 1: round cap (arc), 2: projecting square cap
- (square cutoff, but the line extends half the line width).
- See also Postscript/PDF reference manual.".
-join_style(type:int) default="Join style. 0: Miter join (sharp, pointed corners),
- 1: round join (rounded corners),
- 2: bevel join (flattened corners).
- See also Postscript/PDF reference manual.".
-"""
-
diff --git a/bin/pychart/linear_coord.py b/bin/pychart/linear_coord.py
deleted file mode 100644
index e54d1789f24..00000000000
--- a/bin/pychart/linear_coord.py
+++ /dev/null
@@ -1,37 +0,0 @@
-#
-# Copyright (C) 2000-2005 by Yasushi Saito (yasushi.saito@gmail.com)
-#
-# Jockey is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2, or (at your option) any
-# later version.
-#
-# Jockey is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# for more details.
-#
-import coord
-import math
-import pychart_util
-
-class T(coord.T):
- def get_canvas_pos(self, size, val, min, max2):
- return size * (val - min) / max(float(max2 - min),0.01)
-
- def get_tics(self, min, max, interval):
- v = []
- x = min
- while x <= max:
- v.append(x)
- x += interval
- return v
- def get_min_max(self, dmin, dmax, interval):
- if not interval:
- if dmax == dmin:
- interval = 10
- else:
- interval = 10 ** (float(int(math.log(dmax-dmin)/math.log(10))))
- dmin = min(dmin, pychart_util.round_down(dmin, interval))
- dmax = max(dmax, pychart_util.round_up(dmax, interval) + interval/2.0)
- return dmin, dmax, interval
diff --git a/bin/pychart/log_coord.py b/bin/pychart/log_coord.py
deleted file mode 100644
index e40308c9cf8..00000000000
--- a/bin/pychart/log_coord.py
+++ /dev/null
@@ -1,48 +0,0 @@
-#
-# Copyright (C) 2000-2005 by Yasushi Saito (yasushi.saito@gmail.com)
-#
-# Jockey is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2, or (at your option) any
-# later version.
-#
-# Jockey is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# for more details.
-#
-import coord
-import math
-
-class T(coord.T):
- def get_canvas_pos(self, size, val, min, max):
- if val <= 0:
- return 0
- xminl = math.log(min)
- xmaxl = math.log(max)
- vl = math.log(val)
- return size * (vl-xminl) / float(xmaxl-xminl)
- def get_tics(self, min, max, interval):
- "Generate the list of places for drawing tick marks."
- v = []
- if min <= 0:
- raise Exception, "Min value (%s) < 0 in a log coordinate." % min
- x = min
- while x <= max:
- v.append(x)
- x = x * interval
- return v
- def get_min_max(self, dmin, dmax, interval):
- interval = interval or 10
- dmin = max(0, dmin) # we can't have a negative value with a log scale.
- v = 1.0
- while v > dmin:
- v = v / interval
- dmin = v
- v = 1.0
- while v < dmax:
- v = v * interval
- dmax = v
-
- return dmin, dmax, interval
-
diff --git a/bin/pychart/object_set.py b/bin/pychart/object_set.py
deleted file mode 100644
index 7d3c9ab70d7..00000000000
--- a/bin/pychart/object_set.py
+++ /dev/null
@@ -1,43 +0,0 @@
-#
-# Copyright (C) 2000-2005 by Yasushi Saito (yasushi.saito@gmail.com)
-#
-# Jockey is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2, or (at your option) any
-# later version.
-#
-# Jockey is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# for more details.
-#
-class T(object):
- def __init__(self, *objs):
- self.__objs = list(objs)
- def add(self, *objs):
- self.__objs.extend(objs)
- def add_objects(self, objs):
- self.__objs.extend(objs)
- def iterate(self):
- return Iterator(self)
- def list(self):
- return self.__objs
- def __getitem__(self, idx):
- return self.__objs[idx]
- def nth(self, idx):
- return self.__objs[idx]
-
-class Iterator(object):
- def __init__(self, set_):
- self.__set = set_
- self.__idx = 0
- def reset(self):
- self.__idx = 0
- def next(self):
- val = self.__set.nth(self.__idx)
- self.__idx += 1
- if self.__idx >= len(self.__set.list()):
- self.__idx = 0
- return val
-
-
diff --git a/bin/pychart/pdfcanvas.py b/bin/pychart/pdfcanvas.py
deleted file mode 100644
index 0413e551946..00000000000
--- a/bin/pychart/pdfcanvas.py
+++ /dev/null
@@ -1,297 +0,0 @@
-#
-# Copyright (C) 2000-2005 by Yasushi Saito (yasushi.saito@gmail.com)
-#
-# Jockey is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2, or (at your option) any
-# later version.
-#
-# Jockey is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# for more details.
-#
-import sys
-import pychart_util
-import string
-import re
-import math
-import theme
-import os
-import basecanvas
-from scaling import *
-
-try:
- import zlib
- _zlib_available_p = 1
-except:
- _zlib_available_p = 0
-
-class pdf_stream(object):
- def __init__(self, fp):
- self.fp = fp
- self.off = 0
- def write(self, str):
- self.fp.write(str)
- self.off += len(str)
- def tell(self):
- return self.off
-
-def to_radian(deg):
- return deg*2*math.pi / 360.0
-
-class T(basecanvas.T):
- def __init__(self, fname, compress_p_):
- basecanvas.T.__init__(self)
- self.__out_fname = fname
- self.__reset_context()
- self.__next_obj_id = 1
- self.__next_font_id = 1
- self.__obj_offsets = {}
- self.__registered_fonts = {}
- self.__lines = []
- self.__nr_gsave = 0
-
- if compress_p_ and not _zlib_available_p:
- pychart_util.warn("Zlib not available. Compression request ignored.\n")
- compress_p_ = 0
- self.__compress_p = compress_p_
-
- def __intern_font(self, name):
- "Assign an ID to the font NAME. Return its ID."
- if not self.__registered_fonts.has_key(name):
- self.__registered_fonts[name] = self.__next_font_id
- self.__next_font_id += 1
- return self.__registered_fonts[name]
-
- def __define_obj(self, fp, str):
- obj_id = self.__next_obj_id
- self.__next_obj_id += 1
- self.__obj_offsets[obj_id] = fp.tell()
- fp.write("%d 0 obj\n%s\nendobj\n" % (obj_id, str))
- return obj_id
-
- def __define_stream_obj(self, fp, s):
- if self.__compress_p:
- p = zlib.compress(s)
- return self.__define_obj(fp, "<>\nstream\n%sendstream"
- % (len(p), p))
- else:
- return self.__define_obj(fp, "<>\nstream\n%s\nendstream"
- % (len(s), s))
-
- def __define_font_obj(self, fp, name, font_id):
- obj_id = self.__define_obj(fp, """< >""" % (font_id, name))
- return obj_id
-
- def __reset_context(self):
- self.__font_name = None
- self.__font_size = -1
- self.__line_style = None
- self.__fill_color = None
- self.__stroke_color = None
- self.__mtx_pushed = 0
-
- def newpath(self):
- pass
- def set_fill_color(self, color):
- if self.__fill_color == color:
- return
- if color.r == color.g and color.r == color.b:
- self.__write("%f g\n" % (color.r))
- self.__write("%f G\n" % (color.r))
- else:
- self.__write("%f %f %f rg\n" % (color.r, color.g, color.b))
- self.__write("%f %f %f RG\n" % (color.r, color.g, color.b))
- self.__fill_color = color
- def set_stroke_color(self, color):
- self.set_fill_color(color)
- return
-
- def __arcsub(self, x, y, radius, start, theta):
- xcos = math.cos(to_radian(theta))
- xsin = math.sin(to_radian(theta))
- x0 = radius * xcos
- y0 = radius * xsin
- x1 = radius * (4-xcos)/3.0
- y1 = radius * (1-xcos)*(xcos-3)/(3*xsin)
-
- xx0, xy0 = pychart_util.rotate(x0, y0, start+theta)
- xx1, xy1 = pychart_util.rotate(x1, -y1, start+theta)
- xx2, xy2 = pychart_util.rotate(x1, y1, start+theta)
- self.__write("%f %f %f %f %f %f c\n" %
- (x+xx1, y+xy1, x+xx2, y+xy2, x+xx0, y+xy0))
- def path_arc(self, x, y, radius, ratio, start, end):
- self.comment("PATHARC %f %f %f %f %f %f\n"
- % (x, y, radius, ratio, start, end))
- step = 10
- if radius < 10:
- step = 20
- if radius < 5:
- step = 30
- if ratio != 1.0:
- self.push_transformation((x, y), (1, ratio), None)
- deg = start
- while deg < end:
- theta = min(step, end-deg)
- self.__arcsub(x, y, radius, deg, theta/2)
- deg += theta
- self.pop_transformation()
- else:
- deg = start
- while deg < end:
- theta = min(step, end-deg)
- self.__arcsub(x, y, radius, deg, theta/2)
- deg += theta
- self.comment("end PATHARC\n")
-
- def text_begin(self):
- self.__write("BT ")
- self.__font_name = None
- self.__font_size = None
-
- def text_end(self):
- self.__write("ET\n")
- def text_moveto(self, x, y, angle):
- if angle != None:
- xcos = math.cos(to_radian(angle))
- xsin = math.sin(to_radian(angle))
- self.__write("%f %f %f %f %f %f Tm " % (xcos, xsin, -xsin, xcos, x, y))
- else:
- self.__write("1 0 0 1 %f %f Tm " % (x, y))
-
- def text_show(self, font_name, font_size, color, str):
- if self.__font_name != font_name or self.__font_size != font_size:
- font_id = self.__intern_font(font_name)
- self.__write("/F%d %d Tf " % (font_id, font_size))
- self.__font_name = font_name
- self.__font_size = font_size
- self.set_fill_color(color)
- self.__write("(%s) Tj " % (str))
-
- def push_transformation(self, baseloc, scale, angle, in_text = 0):
- if in_text:
- op = "Tm"
- else:
- op = "cm"
- self.gsave()
-
- if baseloc == None:
- baseloc = (0,0)
-
- if angle != None:
- radian = to_radian(angle)
- self.__write("%f %f %f %f %f %f %s\n" %
- (math.cos(radian), math.sin(radian),
- -math.sin(radian), math.cos(radian),
- baseloc[0], baseloc[1], op))
- if scale != None:
- self.__write("%f 0 0 %f %f %f %s\n" % (scale[0], scale[1],
- baseloc[0],
- baseloc[1], op))
-
- def pop_transformation(self, in_text = 0):
- if not in_text:
- self.grestore()
- def closepath(self):
- self.__write("h\n")
- def clip_sub(self):
- self.__write("W n\n")
- def fill(self):
- self.__write("f n\n")
- def gsave(self):
- self.__write("q\n")
- def grestore(self):
- self.__write("Q\n")
- self.__reset_context()
-
- def moveto(self, x, y):
- self.__write('%f %f m ' % (x, y))
- def lineto(self, x, y):
- self.__write("%f %f l\n" % (x, y))
- def stroke(self):
- self.__write("S\n")
-
- def set_line_style(self, style):
- if (self.__line_style == style):
- pass
- else:
- self.set_stroke_color(style.color)
- self.__write("%f w " % nscale(style.width))
- if style.dash != None:
- self.__write("[%s] 0 d\n" %
- " ".join(map(str, nscale_seq(style.dash))))
- else:
- self.__write("[] 0 d\n")
- self.__write("%d j %d J\n" % (style.cap_style, style.join_style))
- self.__line_style = style
-
- def comment(self, str):
- if not self.__compress_p:
- self.__write("%%" + str + "\n")
-
- def verbatim(self, str):
- self.__write(str)
-
- def __write(self, str):
- self.__lines.append(str)
-
-# def setbb(self, xmin, ymin, xmax, ymax):
-# self.__xmin = xmin
-# self.__ymin = ymin
-# self.__xmax = xmax
-# self.__ymax = ymax
-
- def close(self):
- basecanvas.T.close(self)
- if self.__lines == []:
- return
-
- _fp, need_close = self.open_output(self.__out_fname)
- fp = pdf_stream(_fp)
-
- fp.write("%PDF-1.2\n")
-
- stream_obj_id = self.__define_stream_obj(fp, " ".join(self.__lines))
-
- fontstr = ""
- for font_name, font_id in self.__registered_fonts.items():
- obj_id = self.__define_font_obj(fp, font_name, font_id)
- fontstr += "/F%d %d 0 R " % (font_id, obj_id)
-
- pages_obj_id = self.__define_obj(fp, " <>" % (self.__next_obj_id + 1))
-
- bbox = theme.adjust_bounding_box([xscale(self.__xmin), yscale(self.__ymin),
- xscale(self.__xmax), yscale(self.__ymax)])
-
- page_obj_id = self.__define_obj(fp, """ <>
->> >>""" % (pages_obj_id, stream_obj_id,
- bbox[0], bbox[1], bbox[2], bbox[3], fontstr))
-
- info_str = "/Producer (%s)\n/CreationDate (%s)" % (self.creator, self.creation_date)
-
- if self.title:
- info_str += "\n/Title (%s)" % (self.title, )
- if self.author:
- info_str += "\n/Author (%s)" % (self.author, )
-
- info_obj_id = self.__define_obj(fp, """<<%s>>""" % info_str)
- catalog_obj_id = self.__define_obj(fp, """ <>""" % (pages_obj_id))
-
- xref_offset = fp.tell()
- fp.write("xref\n0 %d\n" % (len(self.__obj_offsets)+1))
- fp.write("0000000000 65535 f \n")
- id = 1
- while id <= len(self.__obj_offsets):
- fp.write("%010d 00000 n \n" % (self.__obj_offsets[id]))
- id += 1
- fp.write("trailer << /Size %d /Root %d 0 R /Info %d 0 R\n>>\n" % (len(self.__obj_offsets)+1, catalog_obj_id, info_obj_id))
- fp.write("startxref\n%d\n%%%%EOF\n" % xref_offset)
-
- if need_close:
- _fp.close()
diff --git a/bin/pychart/pie_plot.py b/bin/pychart/pie_plot.py
deleted file mode 100644
index c6f405a7ae9..00000000000
--- a/bin/pychart/pie_plot.py
+++ /dev/null
@@ -1,148 +0,0 @@
-#
-# Copyright (C) 2000-2005 by Yasushi Saito (yasushi.saito@gmail.com)
-#
-# Jockey is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2, or (at your option) any
-# later version.
-#
-# Jockey is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# for more details.
-#
-import text_box
-import fill_style
-import line_style
-import pychart_util
-import chart_object
-import arrow
-import legend
-import font
-import pie_plot_doc
-import theme
-
-from pychart_types import *
-from types import *
-
-class T(chart_object.T):
- __doc__ = pie_plot_doc.doc
- keys = {
- "start_angle" : (NumType, 90,
- """The angle at which the first item is drawn."""),
- "center" : (CoordType, None, "The location of the center of the pie."),
- "radius" : (UnitType, None, "The radius of the pie."),
- "line_style" : (line_style.T, line_style.default, "The style of the outer edge of each pie slice."),
-
- "fill_styles" : (ListType, fill_style.standards.list(),
- """The fill style of each item. The length of the
- list should be equal to the length of the data.
- """),
- "arc_offsets" : (ListType, None,
- """You can draw each pie "slice" shifted off-center.
- This attribute, if non-None,
- must be a number sequence whose length is equal to
- the number of pie slices. The Nth value in arc_offsets
- specify the amount of offset
- (from the center of the circle)
- for the Nth slice.
- The value of None will draw all the slices
- anchored at the center.
- """
- ),
- "data" : (AnyType, None, pychart_util.data_desc),
- "label_format" : (FormatType, "%s",
- "Format string of the label"),
- "label_col" : (IntType, 0,
- """The column, within "data", from which the labels of items are retrieved."""),
- "data_col": (IntType, 1,
- """ The column, within "data", from which the data values are retrieved."""),
- "label_offset": (UnitType, None, "The distance from the center of each label."),
- "arrow_style": (arrow.T, None,
- """The style of arrow that connects a label
- to the corresponding "pie"."""),
- "label_line_style": (line_style.T, None, "The style of the frame surrounding each label."),
- "label_fill_style": (fill_style.T, fill_style.default, "The fill style of the frame surrounding each label."),
- "shadow": (ShadowType, None, pychart_util.shadow_desc)
- }
-##AUTOMATICALLY GENERATED
-
-##END AUTOMATICALLY GENERATED
- def _total(self):
- v = 0
- for val in self.data:
- v += val[self.data_col]
- return v
-
- def check_integrity(self):
- self.type_check()
- def get_data_range(self, which):
- return (0, 1)
- def get_legend_entry(self):
- legends = []
- i = 0
- for val in self.data:
- fill = self.fill_styles[i]
- i = (i + 1) % len(self.fill_styles)
- legends.append(legend.Entry(line_style=self.line_style,
- fill_style=fill,
- label=val[self.label_col]))
- return legends
-
- def draw(self, ar, can):
- center = self.center
- if not center:
- center = (ar.loc[0] + ar.size[0]/2.0,
- ar.loc[1] + ar.size[1]/2.0)
- radius = self.radius
- if not radius:
- radius = min(ar.size[0]/2.0, ar.size[1]/2.0) * 0.5
-
- label_offset = radius + (self.label_offset or radius * 0.1)
-
- total = self._total()
- i = 0
- cur_angle = self.start_angle
- for val in self.data:
- fill = self.fill_styles[i]
- degree = 360 * float(val[self.data_col]) / float(total)
-
- off = (0, 0)
- if len(self.arc_offsets) > i:
- off = pychart_util.rotate(self.arc_offsets[i], 0, cur_angle - degree/2.0)
- x_center = center[0]+ off[0]
- y_center = center[1]+ off[1]
-
- can.ellipsis(self.line_style, fill,
- x_center, y_center, radius, 1,
- cur_angle - degree, cur_angle,
- self.shadow)
-
- label = pychart_util.apply_format(self.label_format, val,
- self.label_col)
- if label != None:
- (x_label, y_label) = pychart_util.rotate(label_offset, 0, cur_angle - degree/2.0)
- (x_arrowtip, y_arrowtip) = pychart_util.rotate(radius, 0, cur_angle - degree/2.0)
- # Labels on left side of pie need
- # their text to avoid obscuring the pie
- if x_label < 0:
- x_label = x_label - font.text_width(label)
-
- t = text_box.T(loc = (x_label + x_center, y_label + y_center),
- text = label,
- line_style = self.label_line_style,
- fill_style = self.label_fill_style)
- if self.arrow_style:
- t.add_arrow((x_arrowtip + x_center, y_arrowtip + y_center),
- None, self.arrow_style)
-
- t.draw(can)
- cur_angle = (cur_angle - degree) % 360
- i = (i + 1) % len(self.fill_styles)
-
-
-def init():
- old_val = T.keys["fill_styles"]
- T.keys["fill_styles"] = (old_val[0], fill_style.standards.list(),
- old_val[2])
-theme.add_reinitialization_hook(init)
diff --git a/bin/pychart/pie_plot_doc.py b/bin/pychart/pie_plot_doc.py
deleted file mode 100644
index ae80d0a6b88..00000000000
--- a/bin/pychart/pie_plot_doc.py
+++ /dev/null
@@ -1,34 +0,0 @@
-# automatically generated by generate_docs.py.
-doc="""Attributes supported by this class are:
-label_fill_style(type:fill_style.T) default="The fill style of the frame surrounding each label.".
-center(type:(x,y)) default="The location of the center of the pie.".
-arrow_style(type:arrow.T) default="The style of arrow that connects a label
- to the corresponding "pie".".
-start_angle(type:number) default="The angle at which the first item is drawn.".
-label_format(type:printf format string) default="Format string of the label".
-arc_offsets(type:list) default="You can draw each pie "slice" shifted off-center.
- This attribute, if non-None,
- must be a number sequence whose length is equal to
- the number of pie slices. The Nth value in arc_offsets
- specify the amount of offset
- (from the center of the circle)
- for the Nth slice.
- The value of None will draw all the slices
- anchored at the center.
- ".
-label_offset(type:length in points (\\xref{unit})) default="The distance from the center of each label.".
-label_line_style(type:line_style.T) default="The style of the frame surrounding each label.".
-label_col(type:int) default="The column, within "data", from which the labels of items are retrieved.".
-data_col(type:int) default=" The column, within "data", from which the data values are retrieved.".
-radius(type:length in points (\\xref{unit})) default="The radius of the pie.".
-fill_styles(type:list) default="The fill style of each item. The length of the
- list should be equal to the length of the data.
- ".
-line_style(type:line_style.T) default="The style of the outer edge of each pie slice.".
-data(type:any) default="Specifies the data points. <>".
-shadow(type:) default="The value is either None or a tuple. When non-None,
-a drop-shadow is drawn beneath the object. X-off, and y-off specifies the
-offset of the shadow relative to the object, and fill specifies the
-style of the shadow (@pxref{module-fill-style}).".
-"""
-
diff --git a/bin/pychart/pngcanvas.py b/bin/pychart/pngcanvas.py
deleted file mode 100644
index b0e95960a06..00000000000
--- a/bin/pychart/pngcanvas.py
+++ /dev/null
@@ -1,55 +0,0 @@
-#
-# Copyright (C) 2000-2005 by Yasushi Saito (yasushi.saito@gmail.com)
-#
-# Jockey is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2, or (at your option) any
-# later version.
-#
-# Jockey is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# for more details.
-#
-import sys
-import os
-import gs_frontend
-import theme
-
-class T(gs_frontend.T):
- def close(self):
- gs_frontend.T.close(self)
- if self.__output_lines == []:
- return
-
- if theme.use_color:
- gs_args = "-sDEVICE=png256 -dTextAlphaBits=4 -q -dNOPAUSE" #PDS
- else:
- gs_args = "-sDEVICE=pnggray -dTextAlphaBits=4 -q -dNOPAUSE" #PDS
-
-
- temp_fname = None # the temporary file desc.
- out_fd = None # the final destination.
-
- if self.__out_fname and isinstance(self.__out_fname, str):
- gs_args += " -sOutputFile=%s" % self.__out_fname
- else:
- if not self.__out_fname:
- out_fd = sys.stdout
- else:
- if not hasattr(self.__out_fname, "write"):
- raise Exception, "Expecting either a filename or a file-like object, but got %s" % self.__out_fname
- out_fd = self.__out_fname
- import tempfile
- temp_fname = tempfile.mktemp()
- gs_args += " -sOutputFile=%s" % temp_fname
- self.start_gs(gs_args)
- self.close_gs()
-
- if temp_fname:
- temp_fd = file(temp_fname, 'rb')
- out_fd.write(temp_fd.read())
- temp_fd.close()
-
-
-
diff --git a/bin/pychart/pscanvas.py b/bin/pychart/pscanvas.py
deleted file mode 100644
index 7b92b6d6ce2..00000000000
--- a/bin/pychart/pscanvas.py
+++ /dev/null
@@ -1,257 +0,0 @@
-#
-# Copyright (C) 2000-2005 by Yasushi Saito (yasushi.saito@gmail.com)
-#
-# Jockey is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2, or (at your option) any
-# later version.
-#
-# Jockey is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# for more details.
-#
-import sys
-import re
-import theme
-import version
-import basecanvas
-from scaling import *
-
-comment_p = 0
-
-class T(basecanvas.T):
- def __init__(self, fname):
- basecanvas.T.__init__(self)
- self.__out_fname = fname
- self.__reset_context()
- self.__output_lines = []
- self.__nr_gsave = 0
- self.__font_ids = {}
- self.__nr_fonts = 0
-
- def __reset_context(self):
- self.__font_name = None
- self.__font_size = -1
- self.__line_style = None
- self.__color = None
- self.__mtx_pushed = 0
- self.__txtmtx_pushed = 0
-
- def __intern_font(self, name):
- if self.__font_ids.has_key(name):
- return self.__font_ids[name]
- id = "F%d" % self.__nr_fonts
- self.__nr_fonts += 1
- self.__font_ids[name] = id
- return id
-
- def newpath(self):
- self.__write("N\n")
- def stroke(self):
- self.__write("ST\n")
- def closepath(self):
- self.__write("CP\n")
- def moveto(self, x, y):
- self.__write('%g %g M\n' % (x, y))
-
- def set_fill_color(self, color):
- if self.__color == color:
- pass
- else:
- if color.r == color.g and color.r == color.b:
- self.__write("%g SG\n" % color.r)
- else:
- self.__write("%g %g %g SC\n" % (color.r, color.g, color.b))
- self.__color = color
- def set_stroke_color(self, color):
- self.set_fill_color(color)
-
- def set_line_style(self, style):
- self.set_stroke_color(style.color)
- if (self.__line_style == style):
- pass
- else:
- self.__write("%g %d %d " % (nscale(style.width),
- style.cap_style, style.join_style))
- if style.dash != None:
- self.__write("[%s] 0 SLD " %
- " ".join(map(str, nscale_seq(style.dash))))
- else:
- self.__write("SL ")
- self.__line_style = style
-
- def gsave(self):
- self.__nr_gsave += 1
- self.__write("GS\n")
- def grestore(self):
- self.__write("GR\n")
- self.__nr_gsave -= 1
- self.__reset_context()
-
- def clip_sub(self):
- self.__write("clip\n")
-
- def path_arc(self, x, y, radius, ratio, start_angle, end_angle):
- self.push_transformation((x, y), (1, ratio), None)
- self.__write("0 0 %g %g %g arc\n" % (radius, start_angle, end_angle))
- self.pop_transformation()
-
- def curveto(self, a,b,c,d,e,f):
- self.__write("%g %g %g %g %g %g curveto\n" % (a,b,c,d,e,f))
-
- def push_transformation(self, baseloc, scale, angle, in_text=0):
- self.__mtx_pushed += 1
- self.__write("GB\n")
- if baseloc != None:
- self.__write("%g %g T\n" % (baseloc[0], baseloc[1]))
- if angle != None and angle != 0:
- self.__write("%g R\n" % (angle))
- if scale != None:
- self.__write("%g %g scale\n" % (scale[0], scale[1]))
- def pop_transformation(self, in_text=0):
- if self.__mtx_pushed == 0:
- raise ValueError, "mtx not pushed"
- self.__mtx_pushed -= 1
- self.__write("GE\n")
- def text_begin(self):
- self.__txtmtx_pushed += 1
- self.__write("TB\n")
- def text_end(self):
- self.__txtmtx_pushed -= 1
- self.__write("TE\n")
- def text_moveto(self, x, y, angle):
- self.__write("%g %g T " % (x,y))
- if angle != None and angle != 0:
- self.__write("%g R " % angle)
- self.moveto(0, 0)
-
- def text_show(self, font_name, size, color, str):
- self.set_fill_color(color)
- if (self.__font_name == font_name and self.__font_size == size):
- pass
- else:
- id = self.__intern_font(font_name)
- self.__write("%g %s\n" % (size, id))
- self.__font_name = font_name
- self.__font_size = size
- self.__write("(%s) show\n" % (str))
-
- def _path_polygon(self, points):
- if (len(points) == 4
- and points[0][0] == points[1][0]
- and points[2][0] == points[3][0]
- and points[0][1] == points[3][1]
- and points[1][1] == points[2][1]):
- # a rectangle.
- (xmin, ymin, xmax, ymax) = basecanvas._compute_bounding_box(points)
- if basecanvas.invisible_p(xmax, ymax):
- return
- self.setbb(xmin, ymin)
- self.setbb(xmax, ymax)
- self.__write("%g %g %g %g RECT\n" % \
- (xscale(points[0][0]), yscale(points[0][1]),
- xscale(points[2][0]), yscale(points[2][1])))
- else:
- basecanvas.T._path_polygon(self, points)
-
- def lineto(self, x, y):
- self.__write("%g %g L\n" % (x, y))
- def fill(self):
- self.__write("fill\n")
- def comment(self, str):
- if comment_p:
- self.verbatim("%" + str)
- def verbatim(self, str):
- self.__write(str)
-
- def close(self):
- basecanvas.T.close(self)
- if self.__output_lines == []:
- return
-
- fp, need_close = self.open_output(self.__out_fname)
-
- if self.__nr_gsave != 0:
- raise Exception, "gsave misnest (%d)" % (self.__nr_gsave)
- self.write_preamble(fp)
-
- fp.writelines(self.__output_lines)
- fp.writelines(["showpage end\n",
- "%%Trailer\n",
- "%%EOF\n"])
- if need_close:
- fp.close()
-
- def __write(self, str):
- self.__output_lines.append(str)
-
- def writelines(self, l):
- self.__output_lines.extend(l)
-
- def write_preamble(self, fp):
- bbox = [self.__xmin-1, self.__ymin-1, self.__xmax+1, self.__ymax+1]
- fp.write("%!PS-Adobe-2.0 EPSF-1.2\n")
- fp.write("%%Title: " + self.title + "\n")
- fp.write("%%Creator: " + self.creator + "\n")
- if self.author:
- fp.write("%%Author: " + self.author + "\n")
- fp.write("%%CreationDate: " + self.creation_date + "\n")
- fp.write("%%DocumentFonts: " + " ".join(self.__font_ids.keys()) + "\n")
- fp.write("%%Pages: 1\n")
-
- bbox = theme.adjust_bounding_box(bbox)
-
- fp.write("%%%%BoundingBox: %d %d %d %d\n" % \
- (round(xscale(bbox[0])),
- round(yscale(bbox[1])),
- round(xscale(bbox[2])),
- round(yscale(bbox[3]))))
- fp.write("%%EndComments\n")
- if self.aux_comments != "":
- for line in self.aux_comments.split("\n"):
- fp.write("% " + line + "\n")
-
- fp.write(preamble_text)
- for name, id in self.__font_ids.items():
- fp.write("/%s {/%s findfont SF} def\n" % (id, name))
- fp.write("%%EndProlog\n%%Page: 1 1\n")
-
-
-preamble_text="""
-40 dict begin
-/RECT {4 dict begin
- /y2 exch def
- /x2 exch def
- /y1 exch def
- /x1 exch def
- newpath x1 y1 moveto x2 y1 lineto x2 y2 lineto x1 y2 lineto closepath
- end
-} def
-
-/SF {exch scalefont setfont} def
-/TB {matrix currentmatrix} def
-/TE {setmatrix} def
-/GB {matrix currentmatrix} def
-/GE {setmatrix} def
-/SG {1 1 1 setrgbcolor setgray} def
-/SC {1 setgray setrgbcolor} def
-/SL {[] 0 setdash setlinejoin setlinecap setlinewidth} def
-/SLD {setdash setlinejoin setlinecap setlinewidth} def
-/M {moveto} def
-/L {lineto} def
-/T {translate} def
-/R {rotate} def
-/N {newpath} def
-/ST {stroke} def
-/CP {closepath} def
-/GR {grestore} def
-/GS {gsave} def
-"""
-
-# SL: set line style.
-# width [dash] x linecap linejoin SL ->
-
-# SF: set font.
-# name size SF ->
-
diff --git a/bin/pychart/pychart_types.py b/bin/pychart/pychart_types.py
deleted file mode 100644
index 269b83ef31d..00000000000
--- a/bin/pychart/pychart_types.py
+++ /dev/null
@@ -1,70 +0,0 @@
-#
-# Copyright (C) 2000-2005 by Yasushi Saito (yasushi.saito@gmail.com)
-#
-# Jockey is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2, or (at your option) any
-# later version.
-#
-# Jockey is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# for more details.
-#
-import pychart_util
-import types
-AnyType = 9998
-
-def CoordType(val):
- if type(val) != types.TupleType and type(val) != types.ListType:
- return (" not a valid coordinate.")
- if len(val) != 2:
- return "Coordinate must be a pair of numbers.\n"
- if val[0] != None:
- error = NumType(val[0])
- if error: return error
- if val[1] != None:
- error = NumType(val[1])
- if error: return error
- return None
-
-def IntervalType(val):
- if type(val) in (types.IntType, types.LongType,
- types.FloatType, types.FunctionType):
- return None
- return "Expecting a number or a function"
-
-def CoordOrNoneType(val):
- if type(val) not in (types.TupleType, types.ListType):
- return "Expecting a tuple or a list."
- if len(val) != 2:
- return "Coordinate must be a pair of numbers.\n"
- for v in val:
- if v != None and NumType(val[0]) != None:
- return "Expecting a pair of numbers"
- return None
-
-def NumType(val):
- if type(val) in (types.IntType, types.LongType, types.FloatType):
- return None
- else:
- return "Expecting a number, found \"" + str(val) + "\""
-
-def UnitType(val):
- if type(val) in (types.IntType, types.LongType, types.FloatType):
- return None
- else:
- return "Expecting a unit, found \"" + str(val) + "\""
-
-def ShadowType(val):
- if type(val) not in (types.TupleType, types.ListType):
- return "Expecting tuple or list."
- if len(val) != 3:
- return "Expecting (xoff, yoff, fill)."
- return None
-
-def FormatType(val):
- if type(val) in (types.StringType, types.FunctionType):
- return None
- return "Format must be a string or a function"
-
diff --git a/bin/pychart/pychart_util.py b/bin/pychart/pychart_util.py
deleted file mode 100644
index a7c0eace35d..00000000000
--- a/bin/pychart/pychart_util.py
+++ /dev/null
@@ -1,142 +0,0 @@
-#
-# Copyright (C) 2000-2005 by Yasushi Saito (yasushi.saito@gmail.com)
-#
-# Jockey is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2, or (at your option) any
-# later version.
-#
-# Jockey is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# for more details.
-#
-import sys
-import math
-import types
-import traceback
-from types import *
-
-def inch_to_point(inch):
- return inch * 72.0
-def point_to_inch(pt):
- return float(pt) / 72.0
-
-def rotate(x, y, degree):
- """Rotate a coordinate around point (0,0).
- - x and y specify the coordinate.
- - degree is a number from 0 to 360.
- Returns a new coordinate.
- """
- radian = float(degree) * 2 * math.pi / 360.0
- newx = math.cos(radian) * x - math.sin(radian) * y
- newy = math.sin(radian) * x + math.cos(radian) * y
- return (newx, newy)
-
-debug_level = 1
-
-def warn(*strs):
- for s in strs:
- sys.stderr.write(str(s))
- sys.stderr.write(" ")
- sys.stderr.write("\n")
-
-def info(*strs):
- if debug_level < 100:
- return
- for s in strs:
- sys.stderr.write(str(s))
- sys.stderr.write("\n")
-
-def get_sample_val(l, col):
- if len(l) <= col:
- return None
- return l[col]
-
-def get_data_list(data, col):
- # data = [ elem[col] for elem in data if elem[col] != None ]
- r = []
- for item in data:
- val = get_sample_val(item, col)
- if val != None:
- r.append(val)
- return r
-
-def get_data_range(data, col):
- data = get_data_list(data, col)
- for item in data:
- if type(item) not in (types.IntType, types.LongType, types.FloatType):
- raise TypeError, "Non-number passed to data: %s" % (data)
- return (min(data), max(data))
-
-def round_down(val, bound):
- return int(val/float(bound)) * bound
-
-def round_up(val, bound):
- return (int((val-1)/float(bound))+1) * bound
-
-
-#
-# Attribute type checking stuff
-#
-
-def new_list():
- return []
-
-def union_dict(dict1, dict2):
- dict = dict1.copy()
- dict.update(dict2)
- return dict
-
-def TextVAlignType(val):
- if val in ('T', 'B', 'M', None):
- return None
- return "Text vertical alignment must be one of T(op), B(ottom), or M(iddle).\n"
-
-def TextAlignType(val):
- if val in ('C', 'R', 'L', None):
- return None
- return "Text horizontal alignment must be one of C(enter), R(ight), or L(eft)."
-
-def apply_format(format, val, defaultidx):
- if format == None:
- return None
- elif type(format) == StringType:
- return format % val[defaultidx]
- else:
- return apply(format, val)
-
-
-data_desc = "Specifies the data points. <>"
-label_desc = "The label to be displayed in the legend. <>, <>"
-xcol_desc = """The column, within attribute "data", from which the X values of sample points are extracted. <>"""
-ycol_desc = """The column, within attribute "data", from which the Y values of sample points are extracted. <>"""
-tick_mark_desc = "Tick marks to be displayed at each sample point. <>"
-line_desc="The style of the line. "
-
-def interval_desc(w):
- return "When the value is a number, it specifies the interval at which %s are drawn. Otherwise, the value must be a function that takes no argument and returns the list of numbers. The return value specifies the X or Y points at which %s are drawn." % (w,w)
-
-shadow_desc = """The value is either None or a tuple. When non-None,
-a drop-shadow is drawn beneath the object. X-off, and y-off specifies the
-offset of the shadow relative to the object, and fill specifies the
-style of the shadow (@pxref{module-fill-style})."""
-
-string_desc = """The appearance of the string produced here can be
-controlled using escape sequences. <>"""
-
-#
-#
-
-class symbol_lookup_table:
- def __init__(self, dict, objs):
- self.names = {}
- for name, val in dict.items():
- for obj in objs.list():
- if val == obj:
- self.names[val] = name
- break
- def lookup(self, obj):
- if self.names.has_key(obj):
- return self.names[obj]
- return None
diff --git a/bin/pychart/range_plot.py b/bin/pychart/range_plot.py
deleted file mode 100644
index 1fe64338244..00000000000
--- a/bin/pychart/range_plot.py
+++ /dev/null
@@ -1,144 +0,0 @@
-#
-# Copyright (C) 2000-2005 by Yasushi Saito (yasushi.saito@gmail.com)
-#
-# Jockey is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2, or (at your option) any
-# later version.
-#
-# Jockey is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# for more details.
-#
-import line_style
-import pychart_util
-import chart_object
-import fill_style
-import legend
-import range_plot_doc
-from pychart_types import *
-from types import *
-from scaling import *
-
-
-class T(chart_object.T):
- __doc__ = range_plot_doc.doc
- keys = {
- "data" : (AnyType, None, pychart_util.data_desc),
- "label": (StringType, "???", pychart_util.label_desc),
- "xcol" : (IntType, 0, pychart_util.xcol_desc),
- "min_col": (IntType, 1,
- "The lower bound of the sweep is extracted from "
- + "this column of data."),
- "max_col": (IntType, 2,
- "The upper bound of the sweep is extracted from "
- + "this column of data."),
- "line_style": (line_style.T, line_style.default,
- "The style of the boundary line."),
- "fill_style": (fill_style.T, fill_style.default,
- ""),
- }
-
-##AUTOMATICALLY GENERATED
-
-##END AUTOMATICALLY GENERATED
-
- def check_integrity(self):
- self.type_check()
- def get_data_range(self, which):
- if which == 'X':
- return pychart_util.get_data_range(self.data, self.xcol)
- else:
- ymax = (pychart_util.get_data_range(self.data, self.max_col))[1]
- ymin = (pychart_util.get_data_range(self.data, self.min_col))[0]
- return (ymin, ymax)
- def get_legend_entry(self):
- if self.label:
- return legend.Entry(line_style=self.line_style,
- fill_style=self.fill_style,
- label=self.label)
- return None
-
- def draw(self, ar, can):
-
- prevPair = None
-
- xmin=999999
- xmax=-999999
- ymin=999999
- ymax=-999999
-
- # Draw the boundary in a single stroke.
- can.gsave()
- can.newpath()
- for pair in self.data:
- x = pair[self.xcol]
- y = pychart_util.get_sample_val(pair, self.max_col)
- if y == None:
- continue
-
- xmin = min(xmin, ar.x_pos(x))
- xmax = max(xmax, ar.x_pos(x))
- ymin = min(ymin, ar.y_pos(y))
- ymax = max(ymax, ar.y_pos(y))
- if prevPair != None:
- can.lineto(xscale(ar.x_pos(x)), yscale(ar.y_pos(y)))
- else:
- can.moveto(xscale(ar.x_pos(x)), yscale(ar.y_pos(y)))
- prevPair = pair
-
- for i in range(len(self.data)-1, -1, -1):
- pair = self.data[i]
- x = pair[self.xcol]
- y = pychart_util.get_sample_val(pair, self.min_col)
- if None in (x, y):
- continue
-
- xmin = min(xmin, ar.x_pos(x))
- xmax = max(xmax, ar.x_pos(x))
- ymin = min(ymin, ar.y_pos(y))
- ymax = max(ymax, ar.y_pos(y))
- can.lineto(xscale(ar.x_pos(x)), yscale(ar.y_pos(y)))
- can.closepath()
-
- # create a clip region, and fill it.
- can.clip_sub()
- can.fill_with_pattern(self.fill_style, xmin, ymin, xmax, ymax)
- can.grestore()
-
- if self.line_style:
- # draw the boundary.
- prevPair = None
- can.newpath()
- can.set_line_style(self.line_style)
- for pair in self.data:
- x = pair[self.xcol]
- y = pychart_util.get_sample_val(pair, self.min_col)
- if None in (x, y):
- continue
-
- if prevPair != None:
- can.lineto(xscale(ar.x_pos(x)), yscale(ar.y_pos(y)))
- else:
- can.moveto(xscale(ar.x_pos(x)), yscale(ar.y_pos(y)))
- prevPair = pair
- can.stroke()
-
- prevPair = None
- can.newpath()
- can.set_line_style(self.line_style)
- for pair in self.data:
- x = pair[self.xcol]
- y = pychart_util.get_sample_val(pair, self.max_col)
- if y == None:
- continue
-
- if prevPair != None:
- can.lineto(xscale(ar.x_pos(x)), yscale(ar.y_pos(y)))
- else:
- can.moveto(xscale(ar.x_pos(x)), yscale(ar.y_pos(y)))
- prevPair = pair
- can.stroke()
-
-
diff --git a/bin/pychart/range_plot_doc.py b/bin/pychart/range_plot_doc.py
deleted file mode 100644
index 6dcf4250f0b..00000000000
--- a/bin/pychart/range_plot_doc.py
+++ /dev/null
@@ -1,11 +0,0 @@
-# automatically generated by generate_docs.py.
-doc="""Attributes supported by this class are:
-xcol(type:int) default="The column, within attribute "data", from which the X values of sample points are extracted. <>".
-max_col(type:int) default="The upper bound of the sweep is extracted from this column of data.".
-min_col(type:int) default="The lower bound of the sweep is extracted from this column of data.".
-label(type:str) default="The label to be displayed in the legend. <>, <>".
-line_style(type:line_style.T) default="The style of the boundary line.".
-fill_style(type:fill_style.T) default="".
-data(type:any) default="Specifies the data points. <>".
-"""
-
diff --git a/bin/pychart/rose_plot.py b/bin/pychart/rose_plot.py
deleted file mode 100644
index dcfd06074d4..00000000000
--- a/bin/pychart/rose_plot.py
+++ /dev/null
@@ -1,143 +0,0 @@
-#
-# Copyright (C) 2000-2005 by Yasushi Saito (yasushi.saito@gmail.com)
-#
-# Jockey is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2, or (at your option) any
-# later version.
-#
-# Jockey is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# for more details.
-#
-import canvas
-import fill_style
-import line_style
-import pychart_util
-import chart_object
-import legend
-import font
-import color
-from pychart_types import *
-
-class T(chart_object.T):
- """Plots sector diagram which can be superimposed on one another.
- Sector diagrams are also known as wind roses"""
- keys = {
- "start_angle" : (NumType, 90, ""), # top of chart (north)
- "center" : (CoordType, None, ""),
- "base_radius" : (NumType, None, ""),
- "line_style" : (line_style.T, line_style.T(color=color.black, width=0.3), ""),
- "fill_styles" : (list, fill_style.standards.list()[:],
- """The fill style of each item. The length of the
- list should be equal to the length of the data.
- """),
- "sector_centred":(int, 1,
- """Bool indicating whether the sectors should be centred on each sector_width(e.g. on 0)"""),
- "dir_offset": (UnitType, None,
- """The distance between the directions and the outermost circle. Defaults fine for most cases"""),
- "data" : (AnyType, None, pychart_util.data_desc),
- "label_col" : (int, 0,
- """The column, within "data", from which the labels of items are retrieved."""),
- "data_col": (int, 1,
- """ The column, within "data", from which the data values are retrieved."""),
- "dir_line_style": (line_style.T, None, ""),
- "dir_fill_style": (fill_style.T, fill_style.default, ""),
- "shadow": (ShadowType, None, pychart_util.shadow_desc),
- "sector_width": (int, None, ""), # automatically generated
- }
-
- def __init__(self, colour=True, **args):
- chart_object.T.init(self, args)
- if colour:
- # the theme.color flag does not seem to affect the fill_style.standards,
- #besides, I want the first two colors to resemble those of gnuplot's postscript terminal
- self.fill_styles = [fill_style.Plain(bgcolor=color.red),
- fill_style.Plain(bgcolor=color.green),
- fill_style.Plain(bgcolor=color.blue),
- fill_style.Plain(bgcolor=color.magenta)]
-
- def check_integrity(self):
- nSectors = len(self.data[0][self.data_col])
- if (360%nSectors != 0):
- raise Exception('Length of dataset ' + str(nSectors) + ' not a divisor of 360 degrees!')
- for dataset in self.data:
- length = len(dataset[self.data_col])
- if length != nSectors:
- raise Exception('Lengths of datasets given is different!')
- for val in dataset[self.data_col]:
- if (val < 0) | (val > 1):
- raise Exception('Data value ' + str(val) + ' not between 0 and 1!')
- self.sector_width = 360/nSectors
- self.type_check()
-
- def get_data_range(self, which):
- return (0, 1)
-
- def get_legend_entry(self):
- legends = []
- i = 0
- for dataset in self.data:
- fill = self.fill_styles[i]
- i = (i + 1) % len(self.fill_styles)
- legends.append(legend.Entry(line_style=self.line_style,
- fill_style=fill,
- label=dataset[self.label_col]))
- return legends
-
- def draw(self, ar, can):
- center = self.center
- if not center:
- center = (ar.loc[0] + ar.size[0]/2.0,
- ar.loc[1] + ar.size[1]/2.0)
- base_radius = self.base_radius # the maximum radius of a wedge
- if not base_radius:
- base_radius = min(ar.size[0]/2.0, ar.size[1]/2.0) #* 0.8
-
- sector_decrement = 1./(len(self.data)*2) * self.sector_width # each following sector diagram will have its sector width decremented by half this amount (in degrees)
- i = 0
- for dataset in self.data:
- cur_angle = self.start_angle
- if self.sector_centred:
- cur_angle -= self.sector_width/2.
- fill = self.fill_styles[i]
- x_center = center[0]
- y_center = center[1]
-
- if not i: # draw directions around sector diagram once off
- dir_offset = base_radius + (self.dir_offset or base_radius * 0.04)
- directions = ['N', 'E', 'S', 'W']
- angle = self.start_angle
-
- can.ellipsis(line_style.T(color=color.black, width=0.3, dash=line_style.dash1), None,
- x_center, y_center, base_radius, 1,
- 0, 360) #
-
- for d in directions:
- x_label, y_label = pychart_util.rotate(dir_offset, 0, angle) # coords for bottom left corner of box
- tw = font.text_width(d)
- half = 1/3. # normal arithmetic does not seem to apply to these text_box objects...
- if (angle == 0): # east
- y_label -= font.text_height(d)[0]*half # move down half
- elif (angle == -180): # west
- y_label -= font.text_height(d)[0]*half # move down half
- x_label -= font.text_width(d) # move left full
- elif (angle == 90): # north
- x_label -= font.text_height(d)[0]*half # move left half
- elif (angle == -90): # south
- y_label -= font.text_height(d)[0]*.8 # move down (couldn't figure out how to set this dynamically so I fudged...)
- x_label -= font.text_height(d)[0]*half # move left half
- canvas.show(x_label + x_center, y_label + y_center, d)
- angle -= 360/len(directions)
-
- for val in dataset[self.data_col]: # now draw the sectors
- radius = base_radius*val # scale the radius
- start = cur_angle-self.sector_width+i*sector_decrement
- stop = cur_angle-i*sector_decrement # these may seem confusing, but remember that we need to go counterclockwise
-
- can.ellipsis(self.line_style, fill,
- x_center, y_center, radius, 1, start, stop, self.shadow)
- cur_angle = (cur_angle - self.sector_width) % 360 # we want to go in anticlockwise direction (North, West, South, etc. as in meteorology)
- i = (i + 1) % len(self.fill_styles)
-
diff --git a/bin/pychart/scaling.py b/bin/pychart/scaling.py
deleted file mode 100644
index 1fe7359b9f7..00000000000
--- a/bin/pychart/scaling.py
+++ /dev/null
@@ -1,28 +0,0 @@
-#
-# Copyright (C) 2000-2005 by Yasushi Saito (yasushi.saito@gmail.com)
-#
-# Jockey is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2, or (at your option) any
-# later version.
-#
-# Jockey is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# for more details.
-#
-import theme
-
-x_base = 300
-y_base = 300
-
-def xscale(x):
- return x * theme.scale_factor + x_base
-def yscale(y):
- return y * theme.scale_factor + y_base
-
-def nscale(x):
- return x * theme.scale_factor
-def nscale_seq(x):
- return map(nscale, x)
-
diff --git a/bin/pychart/svgcanvas.py b/bin/pychart/svgcanvas.py
deleted file mode 100644
index 8fdb40a7982..00000000000
--- a/bin/pychart/svgcanvas.py
+++ /dev/null
@@ -1,428 +0,0 @@
-#
-# Copyright (C) 2000-2005 by Yasushi Saito (yasushi.saito@gmail.com)
-#
-# Jockey is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2, or (at your option) any
-# later version.
-#
-# Jockey is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# for more details.
-#
-import sys,string,re,math
-from xml.dom.minidom import Document,Comment
-import theme
-import basecanvas
-import version
-from scaling import *
-
-# Note we flip all y-coords and negate all angles because SVG's coord
-# system is inverted wrt postscript/PDF - note it's not enough to
-# scale(1,-1) since that turns text into mirror writing with wrong origin
-
-_comment_p = 0 # whether comment() writes output
-
-# Convert a PyChart color object to an SVG rgb() value
-def _svgcolor(color): # see color.py
- return 'rgb(%d,%d,%d)' % tuple(map(lambda x:int(255*x),
- [color.r,color.g,color.b]))
-
-# Take an SVG 'style' attribute string like 'stroke:none;fill:black'
-# and parse it into a dictionary like {'stroke' : 'none', 'fill' : 'black'}
-def _parseStyleStr(s):
- styledict = {}
- if s :
- # parses L -> R so later keys overwrite earlier ones
- for keyval in s.split(';'):
- l = keyval.strip().split(':')
- if l and len(l) == 2: styledict[l[0].strip()] = l[1].strip()
- return styledict
-
-# Make an SVG style string from the dictionary described above
-def _makeStyleStr(styledict):
- s = ''
- for key in styledict.keys():
- s += "%s:%s;"%(key,styledict[key])
- return s
-
-def _protectCurrentChildren(elt):
- # If elt is a group, check to see whether there are any non-comment
- # children, and if so, create a new group to hold attributes
- # to avoid affecting previous children. Return either the current
- # elt or the newly generated group.
- if (elt.nodeName == 'g') :
- for kid in elt.childNodes :
- if kid.nodeType != Comment.nodeType:
- g = elt.ownerDocument.createElement('g')
- g.setAttribute('auto','')
- if _comment_p:
- g.appendChild(g.ownerDocument.createComment
- ('auto-generated group'))
- elt.appendChild(g)
- elt = g
- break
- return elt
-
-class T(basecanvas.T):
- def __init__(self, fname):
- basecanvas.T.__init__(self)
- self.__out_fname = fname
- self.__xmin, self.__xmax, self.__ymin, self.__ymax = 0,0,0,0
- self.__doc = Document()
- self.__doc.appendChild(self.__doc.createComment
- ('Created by PyChart ' + version.version + ' ' + version.copyright))
- self.__svg = self.__doc.createElement('svg') # the svg doc
- self.__doc.appendChild(self.__svg)
- self.__defs = self.__doc.createElement('defs') # for clip paths
- self.__svg.appendChild(self.__defs)
- self.__currElt = self.__svg
- self.gsave() # create top-level group for dflt styles
- self._updateStyle(font_family = theme.default_font_family,
- font_size = theme.default_font_size,
- font_style = 'normal',
- font_weight = 'normal',
- font_stretch = 'normal',
- fill = 'none',
- stroke = 'rgb(0,0,0)', #SVG dflt none, PS dflt blk
- stroke_width = theme.default_line_width,
- stroke_linejoin = 'miter',
- stroke_linecap = 'butt',
- stroke_dasharray = 'none')
-
- def _updateStyle(self, **addstyledict):
- elt = _protectCurrentChildren(self.__currElt)
-
- # fetch the current styles for this node
- mystyledict = _parseStyleStr(elt.getAttribute('style'))
-
- # concat all parent style strings to get dflt styles for this node
- parent,s = elt.parentNode,''
- while parent.nodeType != Document.nodeType :
- # prepend parent str so later keys will override earlier ones
- s = parent.getAttribute('style') + s
- parent = parent.parentNode
- dfltstyledict = _parseStyleStr(s)
-
- # Do some pre-processing on the caller-supplied add'l styles
- # Convert '_' to '-' so caller can specify style tags as python
- # variable names, eg. stroke_width => stroke-width.
- # Also convert all RHS values to strs
- for key in addstyledict.keys():
- k = re.sub('_','-',key)
- addstyledict[k] = str(addstyledict[key]) # all vals => strs
- if (k != key) : del addstyledict[key]
-
- for k in addstyledict.keys() :
- if (mystyledict.has_key(k) or # need to overwrite it
- (not dfltstyledict.has_key(k)) or # need to set it
- dfltstyledict[k] != addstyledict[k]) : # need to override it
- mystyledict[k] = addstyledict[k]
-
- s = _makeStyleStr(mystyledict)
- if s : elt.setAttribute('style',s)
-
- self.__currElt = elt
-
- ####################################################################
- # methods below define the pychart backend device API
-
- # First are a set of methods to start, construct and finalize a path
-
- def newpath(self): # Start a new path
- if (self.__currElt.nodeName != 'g') :
- raise OverflowError, "No containing group for newpath"
- # Just insert a new 'path' element into the document
- p = self.__doc.createElement('path')
- self.__currElt.appendChild(p)
- self.__currElt = p
-
- # This set of methods add data to an existing path element,
- # simply add to the 'd' (data) attribute of the path elt
-
- def moveto(self, x, y): #
- if (self.__currElt.nodeName != 'path') :
- raise OverflowError, "No path for moveto"
- d = ' '.join([self.__currElt.getAttribute('d'),'M',`x`,`-y`]).strip()
- self.__currElt.setAttribute('d', d)
- def lineto(self, x, y):
- if (self.__currElt.nodeName != 'path') :
- raise OverflowError, "No path for lineto"
- d = ' '.join([self.__currElt.getAttribute('d'),'L',`x`,`-y`]).strip()
- self.__currElt.setAttribute('d', d)
- def path_arc(self, x, y, radius, ratio, start_angle, end_angle):
- # mimic PS 'arc' given radius, yr/xr (=eccentricity), start and
- # end angles. PS arc draws from CP (if exists) to arc start,
- # then draws arc in counterclockwise dir from start to end
- # SVG provides an arc command that draws a segment of an
- # ellipse (but not a full circle) given these args:
- # A xr yr rotate majorArcFlag counterclockwiseFlag xe ye
- # We don't use rotate(=0) and flipped axes => all arcs are clockwise
-
- if (self.__currElt.nodeName != 'path') :
- raise OverflowError, "No path for path_arc"
-
- self.comment('x=%g, y=%g, r=%g, :=%g, %g-%g'
- % (x,y,radius,ratio,start_angle,end_angle))
-
- xs = x+radius*math.cos(2*math.pi/360.*start_angle)
- ys = y+ratio*radius*math.sin(2*math.pi/360.*start_angle)
- xe = x+radius*math.cos(2*math.pi/360.*end_angle)
- ye = y+ratio*radius*math.sin(2*math.pi/360.*end_angle)
- if (end_angle < start_angle) : # make end bigger than start
- while end_angle <= start_angle: # '<=' so 360->0 becomes 360->720
- end_angle += 360
- full_circ = (end_angle - start_angle >= 360) # draw a full circle?
-
- d = self.__currElt.getAttribute('d')
- d += ' %s %g %g' % (d and 'L' or 'M',xs,-ys) # draw from CP, if exists
- if (radius > 0) : # skip, eg. 0-radius 'rounded' corners which blowup
- if (full_circ) :
- # If we're drawing a full circle, move to the end coord
- # and draw half a circle to the reflected xe,ye
- d += ' M %g %g A %g %g 0 1 0 %g %g'%(xe,-ye,
- radius,radius*ratio,
- 2*x-xe,-(2*y-ye))
- # Draw arc from the CP (either reflected xe,ye for full circle else
- # xs,ys) to the end coord - note with full_circ the
- # 'bigArcFlag' value is moot, with exactly 180deg left to draw
- d += ' A %g %g 0 %d 0 %g %g' % (radius,radius*ratio,
- end_angle-start_angle>180,
- xe,-ye)
- self.__currElt.setAttribute('d',d.strip())
- def curveto(self, x1,y1,x2,y2,x3,y3):
- # Equivalent of PostScript's x1 y1 x2 y2 x3 y3 curveto which
- # draws a cubic bezier curve from curr pt to x3,y3 with ctrl points
- # x1,y1, and x2,y2
- # In SVG this is just d='[M x0 y0] C x1 y1 x2 y2 x3 y3'
- #! I can't find an example of this being used to test it
- if (self.__currElt.nodeNode != 'path') :
- raise OverflowError, "No path for curveto"
- d = ' '.join([self.__currElt.getAttribute('d'),'C',
- `x1`,`-y1`,`x2`,`-y2`,`x3`,`-y3`,]).strip()
- self.__currElt.setAttribute('d', d)
- def closepath(self): # close back to start of path
- if (self.__currElt.nodeName != 'path') :
- raise OverflowError, "No path for closepath"
- d = ' '.join([self.__currElt.getAttribute('d'),'Z']).strip()
- self.__currElt.setAttribute('d', d)
-
- # Next we have three methods for finalizing a path element,
- # either fill it, clip to it, or draw it (stroke)
- # canvas.polygon() can generate fill/clip cmds with
- # no corresponding path so just ignore them
- def stroke(self):
- if (self.__currElt.nodeName != 'path') :
- self.comment('No path - ignoring stroke')
- return
- self._updateStyle(fill='none')
- self.__currElt = self.__currElt.parentNode
- def fill(self):
- if (self.__currElt.nodeName != 'path') :
- self.comment('No path - ignoring fill')
- return
- self._updateStyle(stroke='none')
- self.__currElt = self.__currElt.parentNode
- def clip_sub(self):
- if (self.__currElt.nodeName != 'path') :
- self.comment('No path - ignoring clip')
- return
-
- # remove the current path from the tree ...
- p = self.__currElt
- self.__currElt=p.parentNode
- self.__currElt.removeChild(p)
-
- # ... add it to a clipPath elt in the defs section
- clip = self.__doc.createElement('clipPath')
- clipid = 'clip'+`len(self.__defs.childNodes)`
- clip.setAttribute('id',clipid)
- clip.appendChild(p)
- self.__defs.appendChild(clip)
-
- # ... update the local style to point to it
- self._updateStyle(clip_path = 'url(#%s)'%clipid)
-
- # The text_xxx routines specify the start/end and contents of text
- def text_begin(self):
- if (self.__currElt.nodeName != 'g') :
- raise ValueError, "No group for text block"
- t = self.__doc.createElement('text')
- self.__currElt.appendChild(t)
- self.__currElt = t
- def text_moveto(self, x, y, angle):
- if (self.__currElt.nodeName != 'text') :
- raise ValueError, "No text for moveto"
- self.__currElt.setAttribute('x',`x`)
- self.__currElt.setAttribute('y',`-y`)
- if (angle) :
- self.__currElt.setAttribute('transform',
- 'rotate(%g,%g,%g)' % (-angle,x,-y))
- def text_show(self, font_name, size, color, str):
- if (self.__currElt.nodeName != 'text') :
- raise ValueError, "No text for show"
-
- # PyChart constructs a postscript font name, for example:
- #
- # Helvetica Helvetica-Bold Helvetica-Oblique Helvetica-BoldOblique
- # Helvetica-Narrow Times-Roman Times-Italic
- # Symbol Palatino-Roman Bookman-Demi Courier AvantGarde-Book
- #
- # We need to deconstruct this to get the font-family (the
- # piece before the '-'), and other characteristics.
- # Note that 'Courier' seems to correspond to SVGs 'CourierNew'
- # and that the SVG Symbol font is Unicode where the ascii text
- # 'Symbol' doesn't create greek characters like 'Sigma ...' -
- # should really pass a unicode string, or provide translation
- #
- # SVG defines:
- # font-style = normal (aka roman) | italic | oblique
- # font-weight = normal | bold (aka demi?)
- # font-stretch = normal | wider | narrower | ultra-condensed |
- # extra-condensed | condensed | semi-condensed |
- # semi-expanded | expanded | extra-expanded | ultra-expanded
- # ('narrow' seems to correspond to 'condensed')
-
- m = re.match(r'([^-]*)(-.*)?',font_name)
- font_name,modifiers = m.groups()
- if font_name == 'Courier' : font_name = 'CourierNew'
- font_style = font_weight = font_stretch = 'normal'
- if modifiers :
- if re.search('Italic',modifiers) : font_style = 'italic'
- elif re.search('Oblique',modifiers) : font_style = 'oblique'
- if re.search('Bold|Demi',modifiers) : font_weight = 'bold'
- if re.search('Narrow',modifiers) : font_stretch = 'condensed'
- #! translate ascii symbol font chars -> unicode (see www.unicode.org)
- #! http://www.unicode.org/Public/MAPPINGS/VENDORS/ADOBE/symbol.txt
- #! but xml Text element writes unicode chars as '?' to XML file...
- str = re.sub(r'\\([()])',r'\1',str) # unescape brackets
- self._updateStyle(fill=_svgcolor(color),
- stroke='none',
- font_family=font_name,
- font_size=size,
- font_style=font_style,
- font_weight=font_weight,
- font_stretch=font_stretch)
- self.__currElt.appendChild(self.__doc.createTextNode(str))
- def text_end(self):
- if (self.__currElt.nodeName != 'text') :
- raise ValueError, "No text for close"
- self.__currElt = self.__currElt.parentNode
-
-
- # Three methods that change the local style of elements
- # If applied to a group, they persist until the next grestore,
- # If applied within a path element, they only affect that path -
- # although this may not in general correspond to (say) PostScript
- # behavior, it appears to correspond to reflect mode of use of this API
- def set_fill_color(self, color):
- self._updateStyle(fill=_svgcolor(color))
- def set_stroke_color(self, color):
- self._updateStyle(stroke=_svgcolor(color))
- def set_line_style(self, style): # see line_style.py
- linecap = {0:'butt', 1:'round', 2:'square'}
- linejoin = {0:'miter', 1:'round', 2:'bevel'}
- if style.dash: dash = ','.join(map(str,style.dash))
- else : dash = 'none'
- self._updateStyle(stroke_width = style.width,
- stroke = _svgcolor(style.color),
- stroke_linecap = linecap[style.cap_style],
- stroke_linejoin = linejoin[style.join_style],
- stroke_dasharray = dash)
-
- # gsave & grestore respectively push & pop a new context to hold
- # new style and transform parameters. push/pop transformation are
- # similar but explicitly specify a coordinate transform at the
- # same time
- def gsave(self):
- if (self.__currElt.nodeName not in ['g','svg']) :
- raise ValueError, "No group for gsave"
- g = self.__doc.createElement('g')
- self.__currElt.appendChild(g)
- self.__currElt = g
- def grestore(self):
- if (self.__currElt.nodeName != 'g'):
- raise ValueError, "No group for grestore"
- # first pop off any auto-generated groups (see protectCurrentChildren)
- while (self.__currElt.hasAttribute('auto')) :
- self.__currElt.removeAttribute('auto')
- self.__currElt = self.__currElt.parentNode
- # then pop off the original caller-generated group
- self.__currElt = self.__currElt.parentNode
-
- def push_transformation(self, baseloc, scale, angle, in_text=0):
- #? in_text arg appears to always be ignored
-
- # In some cases this gets called after newpath, with
- # corresonding pop_transformation called after the path is
- # finalized so we check specifically for that, and generate
- # an enclosing group to hold the incomplete path element
- # We could add the transform directly to the path element
- # (like we do with line-style etc) but that makes it harder
- # to handle the closing 'pop' and might lead to inconsitency
- # with PostScript if the closing pop doesn't come right after
- # the path element
-
- elt = self.__currElt
- if elt.nodeName == 'g':
- elt = None
- elif (elt.nodeName == 'path' and not elt.hasAttribute('d')) :
- g = elt.parentNode
- g.removeChild(elt)
- self.__currElt = g
- else:
- raise ValueError, "Illegal placement of push_transformation"
-
- t = ''
- if baseloc :
- t += 'translate(%g,%g) '%(baseloc[0],-baseloc[1])
- if angle :
- t += 'rotate(%g) '%-angle
- if scale :
- t += 'scale(%g,%g) '%tuple(scale)
-
- self.gsave()
- self.__currElt.setAttribute('transform',t.strip())
- if elt: # elt has incomplete 'path' or None
- self.__currElt.appendChild(elt)
- self.__currElt = elt
-
- def pop_transformation(self, in_text=0): #? in_text unused?
- self.grestore()
-
- # If verbose, add comments to the output stream (helps debugging)
- def comment(self, str):
- if _comment_p :
- self.__currElt.appendChild(self.__doc.createComment(str))
-
- # The verbatim method is currently not supported - presumably with
- # the SVG backend the user would require access to the DOM since
- # we're not directly outputting plain text here
- def verbatim(self, str):
- self.__currElt.appendChild(self.__doc.createComment('verbatim not implemented: ' + str))
-
- # The close() method finalizes the SVG document and flattens the
- # DOM document to XML text to the specified file (or stdout)
- def close(self):
- basecanvas.T.close(self)
- self.grestore() # matching the gsave in __init__
- if (self.__currElt.nodeName != 'svg') :
- raise ValueError, "Incomplete document at close!"
-
- # Don't bother to output an empty document - this can happen
- # when we get close()d immediately by theme reinit
- if (len(self.__svg.childNodes[-1].childNodes) == 0) :
- return
-
- fp, need_close = self.open_output(self.__out_fname)
- bbox = theme.adjust_bounding_box([self.__xmin, self.__ymin,
- self.__xmax, self.__ymax])
- self.__svg.setAttribute('viewBox','%g %g %g %g'
- % (xscale(bbox[0]),
- -yscale(bbox[3]),
- xscale(bbox[2])-xscale(bbox[0]),
- yscale(bbox[3])-yscale(bbox[1])))
- self.__doc.writexml(fp,'',' ','\n')
- if need_close:
- fp.close()
diff --git a/bin/pychart/text_box.py b/bin/pychart/text_box.py
deleted file mode 100644
index a624782f48d..00000000000
--- a/bin/pychart/text_box.py
+++ /dev/null
@@ -1,152 +0,0 @@
-#
-# Copyright (C) 2000-2005 by Yasushi Saito (yasushi.saito@gmail.com)
-#
-# Jockey is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2, or (at your option) any
-# later version.
-#
-# Jockey is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# for more details.
-#
-import canvas
-import line_style
-import pychart_util
-import fill_style
-import font
-import chart_object
-import color
-import arrow
-import text_box_doc
-from pychart_types import *
-from types import *
-
-class T(chart_object.T):
- __doc__ = text_box_doc.doc
- keys = {"text": (StringType, "???", "Text body. <>"),
- "loc": (TupleType, (0,0),
- "The location of the text box."),
- "line_style": (line_style.T, line_style.default,
- """The line style of the surrounding frame."""),
- "fill_style": (fill_style.T, fill_style.white,
- "Specifies the fill style of the text box."),
- "top_fudge": (UnitType, 0,
- "The amount of space (in points) above the first line"),
- "bottom_fudge": (UnitType, 5,
- "The amount of space below the last line"),
- "left_fudge": (UnitType, 5,
- "The amount of space left of the box"),
- "right_fudge": (UnitType, 5,
- "The amount of space right of the box"),
- "_arrows": (ListType, pychart_util.new_list, "The list of arrows. Not to be touched by the user directly"),
- "radius": (UnitType, 0,
- """Radius of the four corners of the rectangle.
- If the value is zero, a sharp-cornered
- rectangle is drawn."""),
- "shadow": (ShadowType, None,
- pychart_util.shadow_desc)
- }
-##AUTOMATICALLY GENERATED
-
-##END AUTOMATICALLY GENERATED
- def get_dimension(self):
- x = self.loc[0] - self.left_fudge
- y = self.loc[1] - self.bottom_fudge
- width = font.text_width(self.text) + self.right_fudge + self.left_fudge
- height = (font.text_height(self.text))[0] + self.top_fudge + self.bottom_fudge
- return (x, y, width, height)
-
- def choose_end_point(self, tipx, tipy):
- (x, y, width, height) = self.get_dimension()
-
- minDist = -1
- minPoint = None
- vertices = [(x, y),
- (x+width, y),
- (x+width, y+height),
- (x, y+height)]
-
- if tipx >= x and tipx < x+width:
- vertices.append((tipx, y))
- vertices.append((tipx, y+height))
- if tipy >= y and tipy < y+height:
- vertices.append((x, tipy))
- vertices.append((x+width, tipy))
-
- for startPoint in vertices:
- dist = ((startPoint[0] - tipx) **2 + (startPoint[1] - tipy) **2)
- if not minPoint or dist < minDist:
- minPoint = startPoint
- minDist = dist
-
- return minPoint
-
- def add_arrow(self, tipLoc, tail=None, arrow = arrow.default):
- """This method adds a straight arrow that points to
- @var{TIPLOC}, which is a tuple of integers. @var{TAIL}
- specifies the starting point of the arrow. It is either None
- or a string consisting of the following letters: 'l', 'c',
- 'r', 't', 'm,', and 'b'. Letters 'l', 'c', or 'r' means to
- start the arrow from the left, center, or right of the text
- box, respectively. Letters 't', 'm', or 'b' means to start the
- arrow from the top, middle or bottom of the text box. For
- example, when @samp{tail = 'tc'} then arrow is drawn from
- top-center point of the text box. ARROW specifies the style of
- the arrow. <>.
- """
- self._arrows.append((tipLoc, tail, arrow))
-
- def draw(self, can = None):
- if can == None:
- can = canvas.default_canvas()
- x = self.loc[0]
- y = self.loc[1]
- text_width = font.text_width(self.text)
- text_height = font.text_height(self.text)[0]
- (halign, valign, angle) = font.get_align(self.text)
-
- if self.line_style or self.fill_style:
- width = text_width+self.left_fudge+self.right_fudge
- height = text_height+self.bottom_fudge+self.top_fudge
- can.round_rectangle(self.line_style, self.fill_style,
- x-self.left_fudge, y-self.bottom_fudge,
- x-self.left_fudge+width, y-self.bottom_fudge+height,
- self.radius, self.shadow)
-
- if halign == 'L':
- can.show(x, y, self.text)
- elif halign == 'C':
- can.show(x+text_width/2.0, y, self.text)
- elif halign == 'R':
- can.show(x+text_width, y, self.text)
- else:
- raise Exception, "Unsupported alignment (" + halign + ")"
-
- # draw arrows
- for t in self._arrows:
- (tipLoc, tail, arrow) = t
- if tail:
- (x, y, width, height) = self.get_dimension()
- origin = [x, y]
- for ch in tail:
- if ch == 'l':
- origin[0] = x
- elif ch == 'c':
- origin[0] = x+width/2.0
- elif ch == 'r':
- origin[0] = x+width
- elif ch == 'b':
- origin[1] = y
- elif ch == 'm':
- origin[1] = y+height/2.0
- elif ch == 't':
- origin[1] = y+height
- else:
- raise ValueError, tail + ": unknown tail location spec."
- else:
- origin = self.choose_end_point(tipLoc[0], tipLoc[1])
- arrow.draw((origin, tipLoc), can)
-
-
diff --git a/bin/pychart/text_box_doc.py b/bin/pychart/text_box_doc.py
deleted file mode 100644
index 6b38b841a1d..00000000000
--- a/bin/pychart/text_box_doc.py
+++ /dev/null
@@ -1,20 +0,0 @@
-# automatically generated by generate_docs.py.
-doc="""Attributes supported by this class are:
-loc(type:tuple) default="The location of the text box.".
-shadow(type:) default="The value is either None or a tuple. When non-None,
-a drop-shadow is drawn beneath the object. X-off, and y-off specifies the
-offset of the shadow relative to the object, and fill specifies the
-style of the shadow (@pxref{module-fill-style}).".
-left_fudge(type:length in points (\\xref{unit})) default="The amount of space left of the box".
-bottom_fudge(type:length in points (\\xref{unit})) default="The amount of space below the last line".
-fill_style(type:fill_style.T) default="Specifies the fill style of the text box.".
-right_fudge(type:length in points (\\xref{unit})) default="The amount of space right of the box".
-top_fudge(type:length in points (\\xref{unit})) default="The amount of space (in points) above the first line".
-text(type:str) default="Text body. <>".
-radius(type:length in points (\\xref{unit})) default="Radius of the four corners of the rectangle.
- If the value is zero, a sharp-cornered
- rectangle is drawn.".
-line_style(type:line_style.T) default="The line style of the surrounding frame.".
-_arrows(type:list) default="The list of arrows. Not to be touched by the user directly".
-"""
-
diff --git a/bin/pychart/theme.py b/bin/pychart/theme.py
deleted file mode 100644
index 20ccc709136..00000000000
--- a/bin/pychart/theme.py
+++ /dev/null
@@ -1,234 +0,0 @@
-#
-# Copyright (C) 2000-2005 by Yasushi Saito (yasushi.saito@gmail.com)
-#
-# Jockey is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2, or (at your option) any
-# later version.
-#
-# Jockey is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# for more details.
-#
-import sys
-import os
-import re
-import getopt
-import pychart_util
-
-__doc__ = """This module is defines variables for changing the looks
-of charts. All the variables can be changed either via environment
-variable PYCHART_OPTIONS or via the command-line options.
-
-The value of PYCHART_OPTIONS should be a sequence of var=val separated
-by space. Below is an example, which tells Pychart to write to file
-foo.pdf and use Times-Roman as the default font.
-
-PYCHART_OPTIONS="output=foo.pdf font-family=Times"
-
-The summary of attributes that can be set via PYCHART_OPTIONS follows:
-
-output=FILENAME (default: stdout)
-
- Set the output file name.
-
-format=[ps|pdf|pdf-uncompressed|png|x11|svg] (default: ps)
-
- Set the output file format.
-
-font-family=NAME (default: Helvetica)
-
- Set the default font to be used by texts.
-
-font-size=N (default: 9)
-
- Set the default font to be used by texts.
-line-width=X (default: 0.4)
-
- Set the default line width, in points. See also
- pychart.line_style.
-
-scale=X (default: 1.0)
-
- Set the scaling factor. The default is 1.0.
-
-color=[yes|no] (default: no)
-
- If yes, Pychart colorizes default object attributes.
-
-You can also set these variables by calling theme.get_options.
-"""
-
-use_color = 0
-scale_factor = 1
-output_format = None # "ps", "pdf", "png", "x11", or "svg"
-compress_output = 1
-output_file = ""
-
-default_font_family = "Helvetica"
-default_font_size = 9
-default_line_height = None
-default_font_halign = "L"
-default_font_valign = "B"
-default_font_angle = 0
-default_line_width = 0.4
-
-debug_level = 1
-delta_bounding_box = [-3, -3, 3, 3]
-bounding_box = {}
-
-def parse_yesno(str):
- if str in ("yes", "true", "1"):
- return 1
- else:
- return 0
-
-def parse_bounding_box(arg):
- global delta_bounding_box, bounding_box
-
- l = arg.split(",")
- if len(l) != 4:
- raise ValueError, "Need to specify margin=LEFT,BOTTOM,RIGHT,TOP"
- for i in range(0, 4):
- val = l[i].strip()
- if val[0] == '+':
- delta_bounding_box[i] = int(val[1:])
- elif val[0] == '-':
- delta_bounding_box[i] = int(val[1:])
- else:
- bounding_box[i] = int(val)
-
-def adjust_bounding_box(bbox):
- """Adjust the bounding box as specified by user.
- Returns the adjusted bounding box.
-
- - bbox: Bounding box computed from the canvas drawings.
- It must be a four-tuple of numbers.
- """
- for i in range(0, 4):
- if bounding_box.has_key(i):
- bbox[i] = bounding_box[i]
- else:
- bbox[i] += delta_bounding_box[i]
- return bbox
-
-def parse_option(opt, arg):
- global use_color, scale_factor, margin
- global output_format, output_file, compress_output
- global default_font_family, default_font_size
- global default_line_height
- global default_line_width, debug_level
- if opt == "format":
- if arg in ("ps", "eps"):
- output_format = "ps"
- elif arg == "png":
- output_format = "png"
- elif arg == "svg":
- output_format = "svg"
- elif arg == "x11":
- output_format = "x11"
- elif arg == "pdf-uncompressed":
- output_format = "pdf"
- compress_output = 0
- elif arg in ("pdf-compressed", "pdf"):
- output_format = "pdf"
- compress_output = 1
- else:
- raise ValueError, "Unknown output option: " + str(arg)
- elif opt == "output":
- output_file = arg
- elif opt == "color":
- use_color = 1
- elif opt == "scale":
- scale_factor = float(arg)
- elif opt == "bbox":
- parse_bounding_box(arg)
- elif opt == "font-family":
- default_font_family = arg
- elif opt == "font-size":
- default_font_size = float(arg)
- default_line_height = float(arg)
- elif opt == "line-width":
- default_line_width = float(arg)
- elif opt == "debug-level":
- debug_level = int(arg)
- else:
- raise getopt.GetoptError, "Unknown option: " + opt + " " + arg
-
-if os.environ.has_key("PYCHART_OPTIONS"):
- for opt in os.environ["PYCHART_OPTIONS"].split():
- opt, arg = opt.split("=")
- parse_option(opt, arg)
-
-hooks = []
-def add_reinitialization_hook(proc):
- global hooks
- hooks.append(proc)
- proc()
-
-def usage():
- print "Usage: %s [options..]" % sys.argv[0]
- print """
- --scale=X: Set the scaling factor to X (default: 1.0).
- --format=[ps|png|pdf|x11|svg]: Set the output format (default: ps).
- --font-family=NAME: Set the default font family (default: Helvetica).
- --font-size=NAME: Set the default font size (default: 9pts).
- --line-width=NAME: Set the default line width (default: 0.4).
- --debug-level=N: Set the messaging verbosity (default: 0).
- --bbox=LEFT,BOTTOM,RIGHT,TOP: Specifies the amount of space (in PS points) to be left in the edges of the picture (default: -1,-1,+1,+1).
- """
-
-def reinitialize():
- """This procedure must be called after setting variables in
- the |theme| module. This procedure propagates the new values of
- the theme variables to other modules that depend on their values."""
- for proc in hooks:
- proc()
-
-def get_options(argv = None):
- """This procedure takes a list of command line arguments in
- and parses
- options. It returns the non-parsed portion of . Parameter
- can be
- omitted, in which case its value defaults to |sys.argv[1:]|.
- The options supported are: "|--format=[ps,png,pdf,x11,svg]|",
- "|--output=|", "|--color=[yes,no]|"
- "|--scale=|", "|--font-family=|", "|--font-size=|",
- "|--line-width=|",
- "|--debug-level=|", "|bbox=|".
- The below code shows an example.
-
-#!/usr/bin/python
-from pychart import *
-args = theme.get_options()
-ar = area.T(...)
-...
- """
- if argv == None:
- argv = sys.argv[1:]
- try:
- opts, args = getopt.getopt(argv, "d:co:f:",
- ["format=", "output=", "color=",
- "scale=", "font-family=", "font-size=",
- "line-width=", "debug-level=",
- "bbox="])
- except getopt.GetoptError, foo:
- print foo
- usage()
- raise getopt.GetoptError
- for opt, arg in opts:
- if opt == "-d":
- parse_option("debug-level", arg)
- elif opt == "-c":
- parse_option("color", None)
- elif opt == "-o":
- parse_option("output", arg)
- elif opt == "-f":
- parse_option("format", arg)
- else:
- parse_option(opt[2:], arg)
- reinitialize()
- return args
-
-
diff --git a/bin/pychart/tick_mark.py b/bin/pychart/tick_mark.py
deleted file mode 100644
index 21c7777e72a..00000000000
--- a/bin/pychart/tick_mark.py
+++ /dev/null
@@ -1,188 +0,0 @@
-#
-# Copyright (C) 2000-2005 by Yasushi Saito (yasushi.saito@gmail.com)
-#
-# Jockey is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2, or (at your option) any
-# later version.
-#
-# Jockey is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# for more details.
-#
-import color
-import line_style
-import fill_style
-import chart_object
-import object_set
-import pychart_util
-import tick_mark_doc
-from pychart_types import *
-
-_keys = {
- "line_style": (line_style.T, line_style.default, "The line style of the tick mark."),
- "fill_style": (fill_style.T, fill_style.white, "The fill style."),
- "size": (UnitType, 5, "Size of the tick mark."),
- }
-
-class T(chart_object.T):
- __doc__ = tick_mark_doc.doc
- keys = _keys
-##AUTOMATICALLY GENERATED
-
-##END AUTOMATICALLY GENERATED
-
- def predraw_check(self):
- if not hasattr(self, "type_checked"):
- self.type_check()
- self.type_checked = 1
-
-class Circle(T):
- """Draws a circle. """
- def draw(self, can, x, y):
- self.predraw_check()
- can.ellipsis(self.line_style, self.fill_style, x, y,
- self.size/2.0, 1)
-
-class Square(T):
- """Draws a square."""
- def draw(self, can, x, y):
- self.predraw_check()
- # move to the bottom-left corner
- x = x - self.size/2.0
- y = y - self.size/2.0
- can.rectangle(self.line_style, self.fill_style,
- x, y, x+self.size, y+self.size)
-
-class Triangle(T):
- """Draws a triangle pointing up."""
- def draw(self, can, x, y):
- self.predraw_check()
- can.polygon(self.line_style, self.fill_style,
- ((x-self.size/1.6, y-self.size/2.0),
- (x+self.size/1.6, y-self.size/2.0),
- (x, y+self.size/2.0)))
-class DownTriangle(T):
- """Draws a triangle pointing down."""
- def draw(self, can, x, y):
- self.predraw_check()
- can.polygon(self.line_style, self.fill_style,
- ((x, y-self.size/2.0),
- (x-self.size/1.6, y+self.size/2.0),
- (x+self.size/1.6, y+self.size/2.0)))
-
-
-class X(T):
- """Draw a "X"-shaped tick mark. Attribute "fill-style" is ignored."""
- keys = pychart_util.union_dict(T.keys,
- {"line_style": (line_style.T,
- line_style.T(width=0.7),
- "The line style of the tick mark")})
- def draw(self, can, x, y):
- self.predraw_check()
- # move to the bottom-left corner
- x = x - self.size/2.0
- y = y - self.size/2.0
- can.line(self.line_style, x, y, x+self.size, y+self.size)
- can.line(self.line_style, x+self.size, y, x, y+self.size)
-
-class Plus(T):
- """Draw a "+"-shaped tick mark. Attribute "fill-style" is ignored."""
- keys = pychart_util.union_dict(T.keys,
- {"line_style": (line_style.T,
- line_style.T(width=1),
- "The line style of the tick mark.")})
- def draw(self, can, x, y):
- self.predraw_check()
- # move to the bottom-left corner
- can.line(self.line_style, x-self.size/1.4, y, x+self.size/1.4, y)
- can.line(self.line_style, x, y-self.size/1.4, x, y+self.size/1.4)
-
-class Diamond(T):
- """Draw a square rotated at 45 degrees."""
- def draw(self, can, x, y):
- self.predraw_check()
- # move to the bottom-left corner
- can.polygon(self.line_style, self.fill_style,
- ((x-self.size/1.4, y), (x, y+self.size/1.4),
- (x+self.size/1.4, y), (x, y-self.size/1.4)))
-
-class Star(T):
- """Draw a "*". Attribute "fill-style" is ignored."""
- keys = pychart_util.union_dict(T.keys,
- {"line_style": (line_style.T,
- line_style.T(width=1),
- "The line style of the tick mark.")})
- def draw(self, can, x, y):
- self.predraw_check()
- # move to the bottom-left corner
- midx = x
- midy = y
- d_len = self.size / 2.0
- r_len = self.size * 1.414 / 2.0
- can.line(self.line_style, x-d_len, y-d_len, x+d_len, y+d_len)
- can.line(self.line_style, x+d_len, y-d_len, x-d_len, y+d_len)
- can.line(self.line_style, midx, y-r_len, midx, y+r_len)
- can.line(self.line_style, x-r_len, midy, x+r_len, midy)
-
-class Null(T):
- """This tickmark doesn't draw anything. All the attributes are ignored."""
- def __init__ (self):
- self.line_style = None
- self.fill_style = None
- self.size = -1
- def draw(self, can, x, y):
- pass
-
-standards = object_set.T()
-def _intern(style):
- standards.add(style)
- return style
-
-square = _intern(Square())
-square3 = _intern(Square(size=3))
-square5 = square
-x = _intern(X())
-x3 = _intern(X(size=3))
-x5 = x
-star = _intern(Star())
-star3 = _intern(Star(size=3))
-star5 = star
-plus = _intern(Plus())
-plus3 = _intern(Plus(size=3))
-plus5 = plus
-dia = _intern(Diamond())
-dia3 = _intern(Diamond(size=3))
-dia5 = dia
-tri = _intern(Triangle())
-tri3 = _intern(Triangle(size=3))
-tri5 = tri
-dtri = _intern(DownTriangle())
-dtri3 = _intern(DownTriangle(size=3))
-dtri5 = dtri
-circle1 = _intern(Circle(size=1))
-circle2 = _intern(Circle(size=3))
-circle3 = _intern(Circle(size=5))
-blacksquare = _intern(Square(fill_style=fill_style.black))
-blacksquare3 = _intern(Square(size=3, fill_style=fill_style.black))
-blackdia = _intern(Diamond(fill_style=fill_style.black))
-blackdia3 = _intern(Diamond(size=3, fill_style=fill_style.black))
-blacktri = _intern(Triangle(fill_style=fill_style.black))
-blacktri3 = _intern(Triangle(size=3, fill_style=fill_style.black))
-blackdtri = _intern(DownTriangle(fill_style=fill_style.black))
-blackdtri3 = _intern(DownTriangle(size=3, fill_style=fill_style.black))
-blackcircle1 = _intern(Circle(size=1, fill_style=fill_style.black))
-blackcircle3 = _intern(Circle(size=3, fill_style=fill_style.black))
-gray70square = _intern(Square(fill_style=fill_style.gray70))
-gray70square3 = _intern(Square(size=3, fill_style=fill_style.gray70))
-gray70dia = _intern(Diamond(fill_style=fill_style.gray70))
-gray70dia3 = _intern(Diamond(size=3, fill_style=fill_style.gray70))
-gray70tri = _intern(Triangle(fill_style=fill_style.gray70))
-gray70tri3 = _intern(Triangle(size=3, fill_style=fill_style.gray70))
-gray70dtri = _intern(DownTriangle(fill_style=fill_style.gray70))
-gray70dtri3 = _intern(DownTriangle(size=3, fill_style=fill_style.gray70))
-gray70circle1 = _intern(Circle(size=1, fill_style=fill_style.gray70))
-gray70circle3 = _intern(Circle(size=3, fill_style=fill_style.gray70))
-default = _intern(Null())
-
diff --git a/bin/pychart/tick_mark_doc.py b/bin/pychart/tick_mark_doc.py
deleted file mode 100644
index d61e68f1310..00000000000
--- a/bin/pychart/tick_mark_doc.py
+++ /dev/null
@@ -1,7 +0,0 @@
-# automatically generated by generate_docs.py.
-doc="""Attributes supported by this class are:
-line_style(type:line_style.T) default="The line style of the tick mark.".
-size(type:length in points (\\xref{unit})) default="Size of the tick mark.".
-fill_style(type:fill_style.T) default="The fill style.".
-"""
-
diff --git a/bin/pychart/typechecker.py b/bin/pychart/typechecker.py
deleted file mode 100644
index ce88ffa97ef..00000000000
--- a/bin/pychart/typechecker.py
+++ /dev/null
@@ -1,27 +0,0 @@
-#
-# Copyright (C) 2000-2005 by Yasushi Saito (yasushi.saito@gmail.com)
-#
-# Jockey is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2, or (at your option) any
-# later version.
-#
-# Jockey is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# for more details.
-#
-import types
-class IntervalTypeClass:
- def typeCheck(self, val):
- if type(val) in (types.IntType, types.LongType, types.FloatType,
- types.FunctionType):
- return None
- return "Expecting a number or a function, but received '%s'", val
- def typeDescription(self):
- return "A number or function"
- def varDescription(self, name):
- return "A number or function"
-
-IntervalType = IntervalTypeClass()
-
diff --git a/bin/pychart/version.py b/bin/pychart/version.py
deleted file mode 100644
index 0b564a98d7a..00000000000
--- a/bin/pychart/version.py
+++ /dev/null
@@ -1,16 +0,0 @@
-#
-# Copyright (C) 2000-2005 by Yasushi Saito (yasushi.saito@gmail.com)
-#
-# Jockey is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2, or (at your option) any
-# later version.
-#
-# Jockey is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# for more details.
-#
-version = "1.37"
-copyright = "Copyright 1999-2005 Yasushi Saito"
-
diff --git a/bin/pychart/x11canvas.py b/bin/pychart/x11canvas.py
deleted file mode 100644
index fa432404830..00000000000
--- a/bin/pychart/x11canvas.py
+++ /dev/null
@@ -1,25 +0,0 @@
-#
-# Copyright (C) 2000-2005 by Yasushi Saito (yasushi.saito@gmail.com)
-#
-# Jockey is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2, or (at your option) any
-# later version.
-#
-# Jockey is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# for more details.
-#
-import os
-import gs_frontend
-import theme
-import sys
-
-class T(gs_frontend.T):
- def close(self):
- gs_frontend.T.close(self)
- self.start_gs("-sDEVICE=x11")
- sys.stdin.readline()
- self.close_gs()
-
diff --git a/bin/pychart/zap.py b/bin/pychart/zap.py
deleted file mode 100644
index 2c8672c65c6..00000000000
--- a/bin/pychart/zap.py
+++ /dev/null
@@ -1,78 +0,0 @@
-#
-# Copyright (C) 2000-2005 by Yasushi Saito (yasushi.saito@gmail.com)
-#
-# Jockey is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2, or (at your option) any
-# later version.
-#
-# Jockey is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# for more details.
-#
-import fill_style
-import line_style
-import copy
-
-def _draw_zap(can, p1, p2, style, pat):
- x = copy.deepcopy(p1)
- x.extend(p2)
- can.polygon(None, pat, x)
- can.lines(style, p1)
- can.lines(style, p2)
-
-
-def zap_horizontally(can, style, pat, x1, y1, x2, y2, xsize, ysize):
- """Draw a horizontal "zapping" symbol on the canvas that shows
- that a graph is ripped in the middle.
-
- Parameter specifies the style for the zig-zag lines.
- PAT specifies the pattern with which the area is filled.
- The symbol is drawn in the rectangle (, ) - (, ).
- Each "zigzag" has the width , height ."""
-
- assert isinstance(style, line_style.T)
- assert isinstance(pat, fill_style.T)
-
- points = []
- points2 = []
- x = x1
- y = y1
- while x < x2:
- points.append((x, y))
- points2.append((x, y + (y2-y1)))
- x += xsize
- if y == y1:
- y += ysize
- else:
- y -= ysize
-
- points2.reverse()
- _draw_zap(can, points, points2, style, pat)
-
-def zap_vertically(can, style, pat, x1, y1, x2, y2, xsize, ysize):
- """Draw a vertical "zapping" symbol on the canvas that shows
- that a graph is ripped in the middle.
-
- Parameter specifies the style for the zig-zag lines.
- PAT specifies the pattern with which the area is filled.
- The symbol is drawn in the rectangle (, ) - (, ).
- Each "zigzag" has the width , height ."""
-
- points = []
- points2 = []
- x = x1
- y = y1
- while y < y2:
- points.append((x, y))
- points2.append((x + (x2-x1), y))
- y += ysize
- if x == x1:
- x += xsize
- else:
- x -= xsize
-
- points2.reverse()
- _draw_zap(can, points, points2, style, pat)
-
diff --git a/bin/reportlab/MANIFEST.in b/bin/reportlab/MANIFEST.in
deleted file mode 100644
index 86f3442fd92..00000000000
--- a/bin/reportlab/MANIFEST.in
+++ /dev/null
@@ -1,6 +0,0 @@
-global-include *.dtd *.txt *.xml *.yml
-global-include *.c *.h *.in *.mashed
-global-include *.gif *.png *.jpg .a85
-global-include *.AFM *.PFB *.ttf
-global-include README
-include changes
diff --git a/bin/reportlab/README b/bin/reportlab/README
deleted file mode 100644
index 40b00be75f6..00000000000
--- a/bin/reportlab/README
+++ /dev/null
@@ -1,35 +0,0 @@
-#copyright ReportLab Inc. 2000-2001
-#see license.txt for license details
-#history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/README?cvsroot=reportlab
-#$Header: /tmp/reportlab/reportlab/README,v 1.9 2002/03/05 17:21:44 rgbecker Exp $
-
-This is the ReportLab PDF library.
-
-Licensing
-=========
-BSD license. See license.txt for details
-
-Installation
-============
-Either unpack reportlab.zip or reportlab.tgz to some directory say
-d:\ReportLab. If you can, ensure that the line terminator style is
-correct for your OS (man zip programs have a text mode option eg -a).
-
-Create a .pth file, say reportlab.pth in your Python
-home directory. It should have one line:
-d:/ReportLab.
-
-Alternatively unpack the archive into a directory which is already on your
-python path.
-
-Documentation
-=============
-Full documentation is included in PDF format in the docs directory.
-If you are working with a CVS version, run the script genAll.py
-in that directory to generate the documentation.
-
-Acknowledgements and Thanks
-===========================
-lib/normalDate.py originally by Jeff Bauer
-(please let us know of other acknowledgements - we just
- started this section - 13/2/2002)
diff --git a/bin/reportlab/__init__.py b/bin/reportlab/__init__.py
deleted file mode 100644
index 5a381ed9b26..00000000000
--- a/bin/reportlab/__init__.py
+++ /dev/null
@@ -1,33 +0,0 @@
-#Copyright ReportLab Europe Ltd. 2000-2004
-#see license.txt for license details
-#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/__init__.py
-__version__=''' $Id: __init__.py 2877 2006-05-18 15:11:23Z andy $ '''
-__doc__="""The Reportlab PDF generation library."""
-Version = "2.0"
-
-import sys
-
-if sys.version_info[0:2] < (2, 3):
- warning = """The trunk of reportlab requires Python 2.3 or higher.
- Any older applications should either use released versions beginning
- with 1.x (e.g. 1.21), or snapshots or checkouts from our 'version1'
- branch.
- """
- raise ImportError("reportlab needs Python 2.3 or higher", warning)
-
-def getStory(context):
- if context.target == 'UserGuide':
- # parse some local file
- import os
- myDir = os.path.split(__file__)[0]
- import yaml
- return yaml.parseFile(myDir + os.sep + 'mydocs.yaml')
- else:
- # this signals that it should revert to default processing
- return None
-
-
-def getMonitor():
- import reportlab.monitor
- mon = reportlab.monitor.ReportLabToolkitMonitor()
- return mon
diff --git a/bin/reportlab/changes b/bin/reportlab/changes
deleted file mode 100644
index f22b174ddb8..00000000000
--- a/bin/reportlab/changes
+++ /dev/null
@@ -1,7788 +0,0 @@
-#################################################################################
-#################### RELEASE 2.0 at 15:00 GMT 23/May/2006 #################
-#################################################################################
-r2905 | andy | 2006-05-23 15:49:28 +0100 (Tue, 23 May 2006) | 1 line
- M /reportlab/trunk/reportlab/pdfbase/cidfonts.py
- disable loading of CMAPS
-r2904 | andy | 2006-05-23 15:19:54 +0100 (Tue, 23 May 2006) | 1 line
- M /reportlab/trunk/reportlab/docs/userguide/ch2a_fonts.py
- removed CMap references
-r2903 | andy | 2006-05-23 15:04:08 +0100 (Tue, 23 May 2006) | 1 line
- M /reportlab/trunk/reportlab/test/test_multibyte_kor.py
- M /reportlab/trunk/reportlab/test/test_multibyte_cht.py
- M /reportlab/trunk/reportlab/test/test_multibyte_chs.py
- proper samples added for CJK languages
-r2902 | andy | 2006-05-23 14:08:04 +0100 (Tue, 23 May 2006) | 1 line
- M /reportlab/trunk/reportlab/test/test_multibyte_kor.py
- M /reportlab/trunk/reportlab/test/test_multibyte_cht.py
- M /reportlab/trunk/reportlab/test/test_multibyte_chs.py
- M /reportlab/trunk/reportlab/lib/codecharts.py
- partial silencing of cmap tests
-r2901 | andy | 2006-05-23 00:02:22 +0100 (Tue, 23 May 2006) | 1 line
- M /reportlab/trunk/reportlab/test/test_multibyte_jpn.py
- M /reportlab/trunk/reportlab/pdfbase/cidfonts.py
- M /reportlab/trunk/reportlab/pdfbase/_cidfontdata.py
- A /reportlab/trunk/reportlab/pdfbase/_can_cmap_data.py
- added canned width data for CID fonts
-r2900 | andy | 2006-05-22 22:49:00 +0100 (Mon, 22 May 2006) | 1 line
- M /reportlab/trunk/reportlab/docs/userguide/genuserguide.py
- M /reportlab/trunk/reportlab/docs/userguide/ch1_intro.py
- D /reportlab/trunk/reportlab/docs/userguide/ch0_whatsnewinrl2.py
- updated user guide
-r2899 | rgbecker | 2006-05-22 13:42:07 +0100 (Mon, 22 May 2006) | 1 line
- M /reportlab/trunk/reportlab/rl_config.py
- rl_config.py: fix missing comma in CMap exemplars list
-r2893 | rgbecker | 2006-05-21 10:12:50 +0100 (Sun, 21 May 2006) | 1 line
- M /reportlab/trunk/reportlab/test/runAll.py
- runAll.py: add support for external running
-r2892 | rgbecker | 2006-05-19 15:16:02 +0100 (Fri, 19 May 2006) | 1 line
- M /reportlab/trunk/reportlab/lib/utils.py
- A /reportlab/trunk/reportlab/lib/rltempfile.py
- reportlab.lib: break out rltempfile.py to avoid rl_accel imports
-r2883 | andy | 2006-05-19 12:34:32 +0100 (Fri, 19 May 2006) | 1 line
- M /reportlab/trunk/reportlab/tools/docco/stylesheet.py
- M /reportlab/trunk/reportlab/tools/docco/rltemplate.py
- M /reportlab/trunk/reportlab/test/runAll.py
- manual style changes
-r2882 | andy | 2006-05-18 22:54:38 +0100 (Thu, 18 May 2006) | 1 line
- M /reportlab/trunk/reportlab/docs/userguide/ch1_intro.py
- manual introduction amendments
-r2881 | andy | 2006-05-18 17:56:05 +0100 (Thu, 18 May 2006) | 1 line
- M /reportlab/trunk/reportlab/docs/userguide/ch2_graphics.py
- amended John's encoding paragraph
-r2880 | oualid | 2006-05-18 17:45:05 +0100 (Thu, 18 May 2006) | 1 line
- M /reportlab/trunk/reportlab/tools/docco/stylesheet.py
- added extra paragraphstyle
-r2879 | oualid | 2006-05-18 17:43:07 +0100 (Thu, 18 May 2006) | 1 line
- A /reportlab/trunk/reportlab/docs/userguide/ch0_whatsnewinrl2.py
- chapter What's new in RL 2 of user guide
-r2878 | andy | 2006-05-18 16:13:01 +0100 (Thu, 18 May 2006) | 1 line
- M /reportlab/trunk/reportlab/lib/codecharts.py
- M /reportlab/trunk/reportlab/docs/userguide/ch2a_fonts.py
- updated codecharts and ch3 of user guide
-r2877 | andy | 2006-05-18 16:11:23 +0100 (Thu, 18 May 2006) | 1 line
- M /reportlab/trunk/reportlab/__init__.py
- changed version and added warning for old Python users
-r2875 | andy | 2006-05-18 08:00:16 +0100 (Thu, 18 May 2006) | 1 line
- M /reportlab/trunk/reportlab/lib/validators.py
- codec validator for diagra
-r2874 | jjlee | 2006-05-17 14:07:13 +0100 (Wed, 17 May 2006) | 1 line
- M /reportlab/trunk/reportlab/docs/userguide/ch2_graphics.py
- Correct docs in introduction re encoding for V2
-r2873 | rgbecker | 2006-05-17 11:59:59 +0100 (Wed, 17 May 2006) | 1 line
- M /reportlab/trunk/reportlab/pdfbase/pdfmetrics.py
- pdfmetrics.py: fix rl_accel --> _rl_accel typo
-r2872 | rgbecker | 2006-05-17 11:58:04 +0100 (Wed, 17 May 2006) | 1 line
- M /reportlab/trunk/reportlab/pdfbase/rl_codecs.py
- rl_codecs: slight speedup
-r2871 | rgbecker | 2006-05-17 10:39:29 +0100 (Wed, 17 May 2006) | 1 line
- M /reportlab/trunk/reportlab/test/test_rl_accel.py
- test_rl_accel.py: fix ref count checks
-r2868 | jjlee | 2006-05-16 15:58:47 +0100 (Tue, 16 May 2006) | 1 line
- M /reportlab/trunk/reportlab/docs/userguide/ch1_intro.py
- Fix typos
-r2867 | rgbecker | 2006-05-16 14:19:40 +0100 (Tue, 16 May 2006) | 1 line
- M /reportlab/trunk/reportlab/test/test_rl_accel.py
- test_rl_accel: added some testsi for new functionality
-r2865 | rgbecker | 2006-05-15 17:37:44 +0100 (Mon, 15 May 2006) | 1 line
- M /reportlab/trunk/reportlab/pdfbase/ttfonts.py
- ttfonts.py: allow for _rl_accel._instanceStringWidthTTF
-r2861 | rgbecker | 2006-05-15 08:44:00 +0100 (Mon, 15 May 2006) | 1 line
- M /reportlab/trunk/reportlab/pdfbase/pdfmetrics.py
- pdfmetrics.py: _rl_accel._instanceStringWidthU
-r2860 | rgbecker | 2006-05-12 18:30:55 +0100 (Fri, 12 May 2006) | 1 line
- M /reportlab/trunk/reportlab/pdfbase/pdfmetrics.py
- pdfmetrics.py: more version2 accelerator stuff
-r2857 | rgbecker | 2006-05-11 14:06:52 +0100 (Thu, 11 May 2006) | 1 line
- M /reportlab/trunk/reportlab/platypus/paragraph.py
- paragraph: fix misuse of style before setting in cjk breaklines
-r2856 | rgbecker | 2006-05-11 10:48:13 +0100 (Thu, 11 May 2006) | 1 line
- M /reportlab/trunk/reportlab/demos/odyssey/dodyssey.py
- reportlab: add hotshot analysis to dodyssey.py
-r2854 | rgbecker | 2006-05-10 13:57:21 +0100 (Wed, 10 May 2006) | 1 line
- M /reportlab/trunk/reportlab/test/test_hello.py
- M /reportlab/trunk/reportlab/pdfgen/canvas.py
- M /reportlab/trunk/reportlab/pdfbase/pdfdoc.py
- reportlab: PDFString vs Unicode changes
-r2853 | rgbecker | 2006-05-10 13:56:39 +0100 (Wed, 10 May 2006) | 1 line
- M /reportlab/trunk/reportlab/test/test_platypus_paragraphs.py
- M /reportlab/trunk/reportlab/platypus/paraparser.py
- M /reportlab/trunk/reportlab/platypus/paragraph.py
- reportlab: fix up links in paragraphs
-r2852 | rgbecker | 2006-05-08 16:04:15 +0100 (Mon, 08 May 2006) | 1 line
- M /reportlab/trunk/reportlab/test/utils.py
- M /reportlab/trunk/reportlab/test/test_pdfgen_general.py
- M /reportlab/trunk/reportlab/test/runAll.py
- M /reportlab/trunk/reportlab/platypus/paragraph.py
- M /reportlab/trunk/reportlab/platypus/frames.py
- M /reportlab/trunk/reportlab/platypus/doctemplate.py
- reportlab: minor fixes to platypus, tests and fix jap splitting bug
-r2851 | rgbecker | 2006-05-08 15:34:45 +0100 (Mon, 08 May 2006) | 1 line
- M /reportlab/trunk/reportlab/graphics/barcode/widgets.py
- M /reportlab/trunk/reportlab/graphics/barcode/test.py
- barcode: fix to import from reportlab
-r2850 | rgbecker | 2006-05-08 14:40:06 +0100 (Mon, 08 May 2006) | 1 line
- M /reportlab/trunk/reportlab/test/pythonpowered.gif
- we shouldn't ever need to change this
-r2849 | andy | 2006-05-06 09:25:23 +0100 (Sat, 06 May 2006) | 1 line
- M /reportlab/trunk/reportlab/test/utils.py
- M /reportlab/trunk/reportlab/test/test_pdfgen_general.py
- M /reportlab/trunk/reportlab/test/pythonpowered.gif
- M /reportlab/trunk/reportlab/platypus/tables.py
- friendlified way test suite runs
-r2848 | andy | 2006-05-05 00:45:29 +0100 (Fri, 05 May 2006) | 1 line
- M /reportlab/trunk/reportlab/test/test_platypus_tables.py
- M /reportlab/trunk/reportlab/test/test_multibyte_jpn.py
- M /reportlab/trunk/reportlab/platypus/tables.py
- added japanese splitting test, and table preprocessor to convert unicode->utf8
-r2847 | andy | 2006-05-05 00:07:51 +0100 (Fri, 05 May 2006) | 1 line
- M /reportlab/trunk/reportlab/test/test_multibyte_jpn.py
- expanded Japanese para tests
-r2846 | rgbecker | 2006-05-04 11:48:36 +0100 (Thu, 04 May 2006) | 1 line
- A /reportlab/trunk/reportlab/graphics/barcode/widgets.py
- A /reportlab/trunk/reportlab/graphics/barcode/usps.py
- A /reportlab/trunk/reportlab/graphics/barcode/test.py
- A /reportlab/trunk/reportlab/graphics/barcode/fourstate.py
- A /reportlab/trunk/reportlab/graphics/barcode/eanbc.py
- A /reportlab/trunk/reportlab/graphics/barcode/common.py
- A /reportlab/trunk/reportlab/graphics/barcode/code93.py
- A /reportlab/trunk/reportlab/graphics/barcode/code39.py
- A /reportlab/trunk/reportlab/graphics/barcode/code128.py
- A /reportlab/trunk/reportlab/graphics/barcode/__init__.py
- A /reportlab/trunk/reportlab/graphics/barcode/VERSION
- A /reportlab/trunk/reportlab/graphics/barcode/TODO
- A /reportlab/trunk/reportlab/graphics/barcode/README
- A /reportlab/trunk/reportlab/graphics/barcode
- reportlab: barcode moved to reportlab/graphics
-r2845 | rgbecker | 2006-05-03 13:24:35 +0100 (Wed, 03 May 2006) | 1 line
- M /reportlab/trunk/reportlab/graphics/shapes.py
- shapes.py: merged stable 2843:2844 minor fix to outDir handling in Drawing.save
-r2843 | rgbecker | 2006-04-28 18:33:32 +0100 (Fri, 28 Apr 2006) | 1 line
- M /reportlab/trunk/reportlab/test/test_platypus_paragraphs.py
- M /reportlab/trunk/reportlab/platypus/paraparser.py
- reportlab: added pound sign
-r2842 | rgbecker | 2006-04-28 15:08:58 +0100 (Fri, 28 Apr 2006) | 1 line
- M /reportlab/trunk/reportlab/test/test_platypus_paragraphs.py
- M /reportlab/trunk/reportlab/platypus/paraparser.py
- M /reportlab/trunk/reportlab/platypus/paragraph.py
- reportlab: fixed added to paragraph
-r2841 | rgbecker | 2006-04-27 18:42:12 +0100 (Thu, 27 Apr 2006) | 1 line
- M /reportlab/trunk/reportlab/pdfbase/rl_codecs.py
- rl_codecs: eliminate decorators
-r2840 | rgbecker | 2006-04-20 15:37:13 +0100 (Thu, 20 Apr 2006) | 1 line
- M /reportlab/trunk/reportlab/test/test_multibyte_jpn.py
- M /reportlab/trunk/reportlab/platypus/tables.py
- M /reportlab/trunk/reportlab/pdfbase/ttfonts.py
- reportlab: wastefully allow TTFont to use ttc files
-r2839 | rgbecker | 2006-04-19 17:55:46 +0100 (Wed, 19 Apr 2006) | 1 line
- M /reportlab/trunk/reportlab/pdfbase/ttfonts.py
- ttfonts.py: fix up to use struct properly
-r2838 | rgbecker | 2006-04-18 18:47:54 +0100 (Tue, 18 Apr 2006) | 1 line
- M /reportlab/trunk/reportlab/graphics/charts/axes.py
- reportlab: minor fix to axes.py
-r2834 | rgbecker | 2006-04-05 18:42:59 +0100 (Wed, 05 Apr 2006) | 1 line
- M /reportlab/trunk/reportlab/test/test_pdfgen_links.py
- reportlab: fix bad test test_pdfgen_links.py
-r2833 | rgbecker | 2006-04-05 17:01:20 +0100 (Wed, 05 Apr 2006) | 1 line
- A /reportlab/trunk/reportlab/test/test_platypus_paraparser.py
- A /reportlab/trunk/reportlab/pdfbase/rl_codecs.py
- A /reportlab/trunk/reportlab/lib/textsplit.py
- reportlab: add files from utf8 branch
-r2830 | rgbecker | 2006-04-05 16:18:32 +0100 (Wed, 05 Apr 2006) | 1 line
- M /reportlab/trunk/reportlab/tools/pythonpoint/stdparser.py
- M /reportlab/trunk/reportlab/tools/pythonpoint/pythonpoint.py
- M /reportlab/trunk/reportlab/tools/docco/rl_doc_utils.py
- M /reportlab/trunk/reportlab/tools/docco/graphdocpy.py
- M /reportlab/trunk/reportlab/test/test_tools_pythonpoint.py
- M /reportlab/trunk/reportlab/test/test_platypus_tables.py
- M /reportlab/trunk/reportlab/test/test_pdfgen_links.py
- M /reportlab/trunk/reportlab/test/test_pdfgen_general.py
- M /reportlab/trunk/reportlab/test/test_pdfbase_pdfmetrics.py
- M /reportlab/trunk/reportlab/test/test_pdfbase_encodings.py
- M /reportlab/trunk/reportlab/test/test_multibyte_jpn.py
- M /reportlab/trunk/reportlab/test/test_graphics_charts.py
- M /reportlab/trunk/reportlab/rl_config.py
- M /reportlab/trunk/reportlab/platypus/tables.py
- M /reportlab/trunk/reportlab/platypus/paraparser.py
- M /reportlab/trunk/reportlab/platypus/paragraph.py
- M /reportlab/trunk/reportlab/platypus/para.py
- M /reportlab/trunk/reportlab/platypus/flowables.py
- M /reportlab/trunk/reportlab/platypus/doctemplate.py
- M /reportlab/trunk/reportlab/pdfgen/textobject.py
- M /reportlab/trunk/reportlab/pdfgen/canvas.py
- M /reportlab/trunk/reportlab/pdfbase/ttfonts.py
- M /reportlab/trunk/reportlab/pdfbase/pdfmetrics.py
- M /reportlab/trunk/reportlab/pdfbase/pdfdoc.py
- M /reportlab/trunk/reportlab/pdfbase/cidfonts.py
- M /reportlab/trunk/reportlab/pdfbase/_cidfontdata.py
- M /reportlab/trunk/reportlab/lib/validators.py
- M /reportlab/trunk/reportlab/lib/styles.py
- M /reportlab/trunk/reportlab/lib/rparsexml.py
- M /reportlab/trunk/reportlab/graphics/testshapes.py
- M /reportlab/trunk/reportlab/graphics/shapes.py
- M /reportlab/trunk/reportlab/graphics/renderPM.py
- M /reportlab/trunk/reportlab/graphics/renderPDF.py
- M /reportlab/trunk/reportlab/docs/userguide/ch5_paragraphs.py
- M /reportlab/trunk/reportlab/docs/userguide/ch2a_fonts.py
- M /reportlab/trunk/reportlab/docs/userguide/ch1_intro.py
- M /reportlab/trunk/reportlab/demos/stdfonts/stdfonts.py
- reportlab-utf8 moved to trunk
-r2808 | rgbecker | 2006-03-15 16:47:27 +0000 (Wed, 15 Mar 2006) | 1 line
- M /reportlab/trunk/reportlab/platypus/tables.py
- M /reportlab/trunk/reportlab/pdfbase/pdfmetrics.py
- M /reportlab/trunk/reportlab/graphics/renderSVG.py
- M /reportlab/trunk/reportlab/graphics/renderPS.py
- M /reportlab/trunk/reportlab/graphics/renderPM.py
- reportlab: changes to accomodate barcodes
-r2807 | andy | 2006-03-15 12:22:10 +0000 (Wed, 15 Mar 2006) | 1 line
- M /reportlab/trunk/reportlab/lib/validators.py
- new pattern matcher - partially done
-r2806 | andy | 2006-03-13 23:33:51 +0000 (Mon, 13 Mar 2006) | 1 line
- M /reportlab/trunk/reportlab/docs/userguide/ch1_intro.py
- updated _imaging import
-r2803 | rgbecker | 2006-03-09 13:29:26 +0000 (Thu, 09 Mar 2006) | 1 line
- M /reportlab/trunk/reportlab/pdfgen/canvas.py
- M /reportlab/trunk/reportlab/pdfbase/pdfdoc.py
- reportlab: added FreeTextAnnotation and minor improvements to other annotations
-r2802 | rgbecker | 2006-03-09 13:21:50 +0000 (Thu, 09 Mar 2006) | 1 line
- M /reportlab/trunk/reportlab/graphics/shapes.py
- M /reportlab/trunk/reportlab/graphics/renderbase.py
- M /reportlab/trunk/reportlab/graphics/renderPS.py
- reportlab/graphics cosmetics and adding drawImage to renderPS
-r2799 | rgbecker | 2006-03-02 13:54:39 +0000 (Thu, 02 Mar 2006) | 1 line
- M /reportlab/trunk/reportlab/platypus/flowables.py
- flowables.py: attempt to fix up keepInFrame for one more case
-r2794 | rgbecker | 2006-03-01 10:48:40 +0000 (Wed, 01 Mar 2006) | 1 line
- A /reportlab/trunk/reportlab/tools/utils/dumpttf.py
- reportlab/tools/utils: added dumpttf.py
-r2792 | rgbecker | 2006-02-28 18:37:06 +0000 (Tue, 28 Feb 2006) | 1 line
- M /reportlab/trunk/reportlab/pdfbase/ttfonts.py
- ttfonts.py: fix index bug in name table read
-r2789 | rgbecker | 2006-02-28 15:04:57 +0000 (Tue, 28 Feb 2006) | 1 line
- M /reportlab/trunk/reportlab/pdfbase/cidfonts.py
- M /reportlab/trunk/reportlab/lib/utils.py
- reportlab: remove cidfonts print, fix get_rl_tempdir
-r2786 | rgbecker | 2006-02-27 21:26:46 +0000 (Mon, 27 Feb 2006) | 1 line
- M /reportlab/trunk/reportlab/pdfgen/canvas.py
- M /reportlab/trunk/reportlab/pdfbase/pdfdoc.py
- reportlab: minor changes to annotation support
-r2775 | rgbecker | 2006-02-15 12:17:24 +0000 (Wed, 15 Feb 2006) | 1 line
- M /reportlab/trunk/reportlab/test/test_platypus_paragraphs.py
- M /reportlab/trunk/reportlab/platypus/flowables.py
- M /reportlab/trunk/reportlab/platypus/__init__.py
- platypus: ImagesAndFlowables in final form
-r2774 | rgbecker | 2006-02-14 18:07:27 +0000 (Tue, 14 Feb 2006) | 1 line
- M /reportlab/trunk/reportlab/test/test_platypus_paragraphs.py
- M /reportlab/trunk/reportlab/platypus/paragraph.py
- M /reportlab/trunk/reportlab/platypus/flowables.py
- M /reportlab/trunk/reportlab/platypus/__init__.py
- reportlab: added FlowablesAndImage
-r2765 | rgbecker | 2006-02-02 18:48:12 +0000 (Thu, 02 Feb 2006) | 1 line
- M /reportlab/trunk/reportlab/test/test_pdfgen_general.py
- M /reportlab/trunk/reportlab/pdfbase/pdfutils.py
- M /reportlab/trunk/reportlab/pdfbase/pdfdoc.py
- pdfgen: fix badly drawn jpegs which are actually gifs
-r2762 | rgbecker | 2006-01-30 16:29:07 +0000 (Mon, 30 Jan 2006) | 1 line
- M /reportlab/trunk/reportlab/test/test_platypus_paragraphs.py
- M /reportlab/trunk/reportlab/platypus/paragraph.py
- M /reportlab/trunk/reportlab/platypus/flowables.py
- added _offsets handling to paragraph for flow around on left side
-r2759 | rgbecker | 2006-01-25 11:25:29 +0000 (Wed, 25 Jan 2006) | 1 line
- M /reportlab/trunk/reportlab/lib/utils.py
- utils.py: annotate ImageReader read errors
-r2755 | rgbecker | 2006-01-25 11:21:10 +0000 (Wed, 25 Jan 2006) | 1 line
- M /reportlab/trunk/reportlab/platypus/para.py
- para.py: minor layout changes to example etc
-r2752 | rgbecker | 2006-01-09 13:29:53 +0000 (Mon, 09 Jan 2006) | 1 line
- M /reportlab/trunk/reportlab/graphics/shapes.py
- shapes.py: fix wrap for Drawings to take account of renderScale
-r2749 | rgbecker | 2006-01-09 11:22:03 +0000 (Mon, 09 Jan 2006) | 1 line
- M /reportlab/trunk/reportlab/graphics/shapes.py
- M /reportlab/trunk/reportlab/graphics/renderSVG.py
- M /reportlab/trunk/reportlab/graphics/renderPS.py
- M /reportlab/trunk/reportlab/graphics/renderPM.py
- M /reportlab/trunk/reportlab/graphics/renderPDF.py
- reprotlab/graphics: fix so renderScale is used properly
-r2746 | rgbecker | 2006-01-05 15:17:03 +0000 (Thu, 05 Jan 2006) | 1 line
- M /reportlab/trunk/reportlab/graphics/shapes.py
- shapes.py: make copy use derived class if not overridden
-r2745 | rgbecker | 2005-12-20 12:43:24 +0000 (Tue, 20 Dec 2005) | 1 line
- M /reportlab/trunk/reportlab/graphics/shapes.py
- shapes.py: allow override for CWD
-r2744 | rgbecker | 2005-12-15 12:28:18 +0000 (Thu, 15 Dec 2005) | 1 line
- M /reportlab/trunk/reportlab/test/test_graphics_charts.py
- M /reportlab/trunk/reportlab/pdfgen/pdfimages.py
- M /reportlab/trunk/reportlab/pdfgen/canvas.py
- reportlab: fix test_graphics_charts and eliminate 0 x 0 image bug in Acrobat 7.0
-r2743 | rgbecker | 2005-12-12 15:51:29 +0000 (Mon, 12 Dec 2005) | 1 line
- M /reportlab/trunk/reportlab/graphics/charts/piecharts.py
- piecharts: now have orderMode 'alternate' and proper vertical spreading
-r2742 | oualid | 2005-12-12 11:58:08 +0000 (Mon, 12 Dec 2005) | 1 line
- M /reportlab/trunk/reportlab/lib/normalDate.py
- normalDate: add initialize support for datetime
-r2741 | andy | 2005-12-07 21:52:33 +0000 (Wed, 07 Dec 2005) | 1 line
- M /reportlab/trunk/reportlab/lib/validators.py
- M /reportlab/trunk/reportlab/lib/attrmap.py
- M /reportlab/trunk/reportlab/graphics/testshapes.py
- M /reportlab/trunk/reportlab/graphics/shapes.py
- M /reportlab/trunk/reportlab/graphics/renderbase.py
- datacharts synchronised
-r2740 | rgbecker | 2005-12-07 13:30:14 +0000 (Wed, 07 Dec 2005) | 1 line
- M /reportlab/trunk/reportlab/rl_config.py
- rl_config: fix typo
-r2739 | rgbecker | 2005-12-07 13:25:25 +0000 (Wed, 07 Dec 2005) | 1 line
- M /reportlab/trunk/reportlab/rl_config.py
- M /reportlab/trunk/reportlab/graphics/shapes.py
- reportlab: add defaultGraphicsFontName, svg saving
-r2738 | rgbecker | 2005-12-07 11:39:53 +0000 (Wed, 07 Dec 2005) | 1 line
- M /reportlab/trunk/reportlab/graphics/shapes.py
- M /reportlab/trunk/reportlab/graphics/renderbase.py
- M /reportlab/trunk/reportlab/graphics/renderSVG.py
- M /reportlab/trunk/reportlab/graphics/renderPS.py
- M /reportlab/trunk/reportlab/graphics/renderPM.py
- M /reportlab/trunk/reportlab/graphics/renderPDF.py
- graphics: added Drawing.renderScale hack for renderer terminal drawing scales
-r2737 | rgbecker | 2005-12-06 18:36:58 +0000 (Tue, 06 Dec 2005) | 1 line
- M /reportlab/trunk/reportlab/test/test_graphics_charts.py
- M /reportlab/trunk/reportlab/graphics/charts/piecharts.py
- piecharts: initial version of pointer labels
-r2736 | andy | 2005-12-01 23:03:45 +0000 (Thu, 01 Dec 2005) | 1 line
- M /reportlab/trunk/reportlab/platypus/flowables.py
- removed a 2.4-ism
-r2733 | rgbecker | 2005-11-22 11:24:22 +0000 (Tue, 22 Nov 2005) | 1 line
- M /reportlab/trunk/reportlab/pdfbase/pdfdoc.py
- pdfdoc.py: more optimisations
-r2732 | rgbecker | 2005-11-21 19:39:42 +0000 (Mon, 21 Nov 2005) | 1 line
- M /reportlab/trunk/reportlab/pdfbase/pdfdoc.py
- pdfdoc.py: speed improvements
-r2727 | rgbecker | 2005-10-31 11:20:18 +0000 (Mon, 31 Oct 2005) | 1 line
- M /reportlab/trunk/reportlab/pdfgen/textobject.py
- M /reportlab/trunk/reportlab/pdfgen/canvas.py
- pdfgen: abstract color setting ops to textobject._PDFColorSetter
-r2724 | rgbecker | 2005-10-30 11:52:47 +0000 (Sun, 30 Oct 2005) | 1 line
- M /reportlab/trunk/reportlab/graphics/charts/axes.py
- axes.py: factor out _allInt
-r2723 | rgbecker | 2005-10-30 11:52:10 +0000 (Sun, 30 Oct 2005) | 1 line
- M /reportlab/trunk/reportlab/graphics/charts/piecharts.py
- piecharts.py: fix checkLabelOverlap for 3d pie
-r2719 | rgbecker | 2005-10-20 14:19:59 +0100 (Thu, 20 Oct 2005) | 1 line
- M /reportlab/trunk/reportlab/test/test_graphics_layout.py
- M /reportlab/trunk/reportlab/graphics/shapes.py
- reportlab: fix small angle addArc & Wedge.asPolygon
-r2715 | rgbecker | 2005-10-10 12:56:30 +0100 (Mon, 10 Oct 2005) | 1 line
- M /reportlab/trunk/reportlab/platypus/flowables.py
- flowables.py: fixes to PTOContainer
-r2711 | rgbecker | 2005-10-06 11:04:37 +0100 (Thu, 06 Oct 2005) | 1 line
- M /reportlab/trunk/reportlab/test/test_platypus_pto.py
- M /reportlab/trunk/reportlab/platypus/flowables.py
- platypus: fixup KeepInFrame error handling
-r2707 | rgbecker | 2005-10-04 13:59:21 +0100 (Tue, 04 Oct 2005) | 1 line
- M /reportlab/trunk/reportlab/platypus/flowables.py
- flowables.py: make KeepInFrame wrapping more robust
-r2699 | rgbecker | 2005-09-29 13:35:38 +0100 (Thu, 29 Sep 2005) | 1 line
- M /reportlab/trunk/reportlab/platypus/frames.py
- frames.py: logger only when _debug
-r2698 | rgbecker | 2005-09-29 12:49:23 +0100 (Thu, 29 Sep 2005) | 1 line
- M /reportlab/trunk/reportlab/platypus/frames.py
- M /reportlab/trunk/reportlab/platypus/flowables.py
- M /reportlab/trunk/reportlab/platypus/doctemplate.py
- platypus: changes to make identity more useful
-r2697 | rgbecker | 2005-09-28 18:22:53 +0100 (Wed, 28 Sep 2005) | 1 line
- M /reportlab/trunk/reportlab/test/test_platypus_pto.py
- test_platypus_pto.py: changed FrameFlowable to KeepInFrame
-r2696 | rgbecker | 2005-09-28 14:22:53 +0100 (Wed, 28 Sep 2005) | 1 line
- M /reportlab/trunk/reportlab/platypus/paragraph.py
- M /reportlab/trunk/reportlab/platypus/flowables.py
- M /reportlab/trunk/reportlab/platypus/doctemplate.py
- flowables.py: keepInFrame now truncates etc properly, doctemplate.py: fix handle_frameEnd
-r2695 | andy | 2005-09-27 22:12:08 +0100 (Tue, 27 Sep 2005) | 1 line
- M /reportlab/trunk/reportlab/platypus/flowables.py
- renamed FrameFlowable to KeepInFrame
-r2694 | rgbecker | 2005-09-27 18:31:51 +0100 (Tue, 27 Sep 2005) | 1 line
- M /reportlab/trunk/reportlab/platypus/flowables.py
- flowablse.py: minor fix and hack to FrameFlowable
-r2693 | rgbecker | 2005-09-27 16:29:16 +0100 (Tue, 27 Sep 2005) | 1 line
- M /reportlab/trunk/reportlab/platypus/flowables.py
- flowables.py: minor fixes revealed by rml2pdf use
-r2692 | rgbecker | 2005-09-27 14:26:12 +0100 (Tue, 27 Sep 2005) | 1 line
- M /reportlab/trunk/reportlab/test/test_platypus_pto.py
- M /reportlab/trunk/reportlab/platypus/frames.py
- M /reportlab/trunk/reportlab/platypus/flowables.py
- M /reportlab/trunk/reportlab/platypus/doctemplate.py
- platypus: initial FrameFlowable implementation
-r2689 | rgbecker | 2005-09-22 17:53:18 +0100 (Thu, 22 Sep 2005) | 1 line
- M /reportlab/trunk/reportlab/pdfbase/pdfdoc.py
- merge stable 2687:2688 pdfdoc.py: attempt to robustify escape attribute access
-r2680 | rgbecker | 2005-09-21 17:17:56 +0100 (Wed, 21 Sep 2005) | 1 line
- M /reportlab/trunk/reportlab/platypus/tables.py
- M /reportlab/trunk/reportlab/platypus/flowables.py
- platypus: fix up None defaults for table line commands, add HRFlowable dash arg
-r2679 | rgbecker | 2005-09-20 16:59:39 +0100 (Tue, 20 Sep 2005) | 1 line
- M /reportlab/trunk/reportlab/graphics/charts/axes.py
- axes.py: make YCategoryAxis accept less than n labels
-r2676 | rgbecker | 2005-09-06 11:25:00 +0100 (Tue, 06 Sep 2005) | 1 line
- M /reportlab/trunk/reportlab/graphics/samples/radar.py
- M /reportlab/trunk/reportlab/graphics/samples/filled_radar.py
- M /reportlab/trunk/reportlab/graphics/charts/spider.py
- merge stable 2674:2675 graphics: fix buglet in spider and non-conforming samples
-r2674 | rgbecker | 2005-09-05 17:20:26 +0100 (Mon, 05 Sep 2005) | 1 line
- M /reportlab/trunk/reportlab/graphics/charts/spider.py
- M /reportlab/trunk/reportlab/graphics/charts/piecharts.py
- merged utf8 2666:2671 improved spider plots
-r2668 | rgbecker | 2005-09-05 11:23:51 +0100 (Mon, 05 Sep 2005) | 1 line
- M /reportlab/trunk/reportlab/graphics/widgetbase.py
- merge utf8 2666:2667 widgetbase: make line[3] back up for line[(3,x)]
-r2663 | rgbecker | 2005-09-02 10:44:17 +0100 (Fri, 02 Sep 2005) | 1 line
- M /reportlab/trunk/reportlab/graphics/charts/utils3d.py
- M /reportlab/trunk/reportlab/graphics/charts/piecharts.py
- reportlab/graphics/charts: better piechart labels
-r2662 | rgbecker | 2005-09-01 17:18:33 +0100 (Thu, 01 Sep 2005) | 1 line
- M /reportlab/trunk/reportlab/pdfbase/pdfdoc.py
- pdfdoc: allow special escaping in Annotations and PDFString
-r2659 | rgbecker | 2005-08-18 11:28:12 +0100 (Thu, 18 Aug 2005) | 1 line
- M /reportlab/trunk/reportlab/graphics/charts/lineplots.py
- M /reportlab/trunk/reportlab/graphics/charts/axes.py
- merge stable 2657:2658 axes/lineplots.py: fix inFill behaviour
-r2655 | rgbecker | 2005-08-16 10:40:10 +0100 (Tue, 16 Aug 2005) | 1 line
- M /reportlab/trunk/reportlab/test/test_lib_utils.py
- merge stable 2653:2654 test_lib_utils.py: ensure we get an incremented count
-r2652 | rgbecker | 2005-08-15 12:21:53 +0100 (Mon, 15 Aug 2005) | 1 line
- M /reportlab/trunk/reportlab/test/test_lib_utils.py
- nerge stable 2649:2650 test_lib_utils.py: fix race in temp creation
-r2649 | andy | 2005-07-31 23:47:00 +0100 (Sun, 31 Jul 2005) | 1 line
- M /reportlab/trunk/reportlab/platypus/para.py
- Chad Miller's table fix
-r2648 | rgbecker | 2005-07-28 16:10:18 +0100 (Thu, 28 Jul 2005) | 1 line
- M /reportlab/trunk/reportlab/pdfgen/canvas.py
- canvas.py: fix probable bug in setdash
-r2647 | rgbecker | 2005-07-26 14:47:51 +0100 (Tue, 26 Jul 2005) | 1 line
- M /reportlab/trunk/reportlab/graphics/charts/textlabels.py
- M /reportlab/trunk/reportlab/graphics/charts/barcharts.py
- merge 2643:2644 from stable textlabels.py, barcharts.py: added boxTarget support
-r2630 | rgbecker | 2005-07-08 10:18:22 +0100 (Fri, 08 Jul 2005) | 1 line
- M /reportlab/trunk/reportlab/test/test_pdfbase_ttfonts.py
- M /reportlab/trunk/reportlab/pdfbase/ttfonts.py
- merge 2628:2629: ttfonts: altered subset naming
-r2623 | rgbecker | 2005-06-27 16:34:29 +0100 (Mon, 27 Jun 2005) | 1 line
- M /reportlab/trunk/reportlab/pdfbase/pdfmetrics.py
- pdfbase.pdfmetrics: fix glob to be zip friendly
-r2619 | rgbecker | 2005-06-24 15:49:15 +0100 (Fri, 24 Jun 2005) | 1 line
- M /reportlab/trunk/reportlab/test/utils.py
- M /reportlab/trunk/reportlab/test/test_widgets_grids.py
- M /reportlab/trunk/reportlab/test/test_widgetbase_tpc.py
- M /reportlab/trunk/reportlab/test/test_utils.py
- M /reportlab/trunk/reportlab/test/test_tools_pythonpoint.py
- M /reportlab/trunk/reportlab/test/test_table_layout.py
- M /reportlab/trunk/reportlab/test/test_source_chars.py
- M /reportlab/trunk/reportlab/test/test_rl_accel.py
- M /reportlab/trunk/reportlab/test/test_renderSVG.py
- M /reportlab/trunk/reportlab/test/test_pyfiles.py
- M /reportlab/trunk/reportlab/test/test_platypus_xref.py
- M /reportlab/trunk/reportlab/test/test_platypus_toc.py
- M /reportlab/trunk/reportlab/test/test_platypus_tables.py
- M /reportlab/trunk/reportlab/test/test_platypus_pto.py
- M /reportlab/trunk/reportlab/test/test_platypus_paragraphs.py
- M /reportlab/trunk/reportlab/test/test_platypus_leftright.py
- M /reportlab/trunk/reportlab/test/test_platypus_indents.py
- M /reportlab/trunk/reportlab/test/test_platypus_general.py
- M /reportlab/trunk/reportlab/test/test_platypus_breaking.py
- M /reportlab/trunk/reportlab/test/test_pdfgen_pycanvas.py
- M /reportlab/trunk/reportlab/test/test_pdfgen_pagemodes.py
- M /reportlab/trunk/reportlab/test/test_pdfgen_links.py
- M /reportlab/trunk/reportlab/test/test_pdfgen_general.py
- M /reportlab/trunk/reportlab/test/test_pdfgen_callback.py
- M /reportlab/trunk/reportlab/test/test_pdfbase_ttfonts.py
- M /reportlab/trunk/reportlab/test/test_pdfbase_postscript.py
- M /reportlab/trunk/reportlab/test/test_pdfbase_pdfutils.py
- M /reportlab/trunk/reportlab/test/test_pdfbase_pdfmetrics.py
- M /reportlab/trunk/reportlab/test/test_pdfbase_fontembed.py
- M /reportlab/trunk/reportlab/test/test_pdfbase_encodings.py
- M /reportlab/trunk/reportlab/test/test_paragraphs.py
- M /reportlab/trunk/reportlab/test/test_multibyte_kor.py
- M /reportlab/trunk/reportlab/test/test_multibyte_jpn.py
- M /reportlab/trunk/reportlab/test/test_multibyte_cht.py
- M /reportlab/trunk/reportlab/test/test_multibyte_chs.py
- M /reportlab/trunk/reportlab/test/test_lib_validators.py
- M /reportlab/trunk/reportlab/test/test_lib_utils.py
- M /reportlab/trunk/reportlab/test/test_lib_sequencer.py
- M /reportlab/trunk/reportlab/test/test_lib_colors.py
- M /reportlab/trunk/reportlab/test/test_invariant.py
- M /reportlab/trunk/reportlab/test/test_images.py
- M /reportlab/trunk/reportlab/test/test_hello.py
- M /reportlab/trunk/reportlab/test/test_graphics_speed.py
- M /reportlab/trunk/reportlab/test/test_graphics_layout.py
- M /reportlab/trunk/reportlab/test/test_graphics_images.py
- M /reportlab/trunk/reportlab/test/test_graphics_charts.py
- M /reportlab/trunk/reportlab/test/test_extra.py
- M /reportlab/trunk/reportlab/test/test_docstrings.py
- M /reportlab/trunk/reportlab/test/test_docs_build.py
- M /reportlab/trunk/reportlab/test/test_charts_textlabels.py
- M /reportlab/trunk/reportlab/test/runAll.py
- reportlab/test: fix so individual tests print output folder location
-r2617 | andy | 2005-06-15 21:23:07 +0100 (Wed, 15 Jun 2005) | 1 line
- M /reportlab/trunk/reportlab/graphics/shapes.py
- generalized a rarely-used error message handler which changed in 2.3
-r2613 | rgbecker | 2005-06-15 14:46:10 +0100 (Wed, 15 Jun 2005) | 1 line
- M /reportlab/trunk/reportlab/graphics/charts/spider.py
- spider.py: fix all zero bug (inspired by Max M)
-r2611 | rgbecker | 2005-06-13 11:13:47 +0100 (Mon, 13 Jun 2005) | 1 line
- M /reportlab/trunk/reportlab/lib/utils.py
- utils.py: fix argument reference
-r2608 | rgbecker | 2005-06-12 12:53:56 +0100 (Sun, 12 Jun 2005) | 1 line
- M /reportlab/trunk/reportlab/test/test_pdfbase_ttfonts.py
- M /reportlab/trunk/reportlab/pdfbase/ttfonts.py
- ttfonts.py: apply Albertas Agejevas' spaces patch to fix para splitting
-r2606 | andy | 2005-06-09 23:07:02 +0100 (Thu, 09 Jun 2005) | 1 line
- M /reportlab/trunk/reportlab/platypus/frames.py
- M /reportlab/trunk/reportlab/platypus/doctemplate.py
- added a platypus logger
-r2604 | rgbecker | 2005-06-08 11:12:46 +0100 (Wed, 08 Jun 2005) | 1 line
- M /reportlab/trunk/reportlab/lib/utils.py
- M /reportlab/trunk/reportlab/graphics/charts/legends.py
- legends.py: fix 2.1 compatibility problem
-r2599 | rgbecker | 2005-06-06 17:07:54 +0100 (Mon, 06 Jun 2005) | 1 line
- M /reportlab/trunk/reportlab/lib/utils.py
- utils.py: raise RuntimeError if no image handling available in ImageReader
-r2595 | rgbecker | 2005-05-27 16:40:20 +0100 (Fri, 27 May 2005) | 1 line
- M /reportlab/trunk/reportlab/graphics/charts/legends.py
- fundsdemo: added support for special legending
-r2592 | rgbecker | 2005-05-16 13:18:46 +0100 (Mon, 16 May 2005) | 1 line
- M /reportlab/trunk/reportlab/platypus/tables.py
- tables.py: allow for h/vAlign constructor agruments to be used
-r2591 | andy | 2005-05-13 20:22:10 +0100 (Fri, 13 May 2005) | 1 line
- M /reportlab/trunk/reportlab/tools/pythonpoint/pythonpoint.py
- added a check for missing files
-r2590 | rgbecker | 2005-05-10 14:09:40 +0100 (Tue, 10 May 2005) | 1 line
- M /reportlab/trunk/reportlab/graphics/renderPS.py
- renderPS.py: attempt to fix setFont error
-r2589 | rgbecker | 2005-05-04 12:33:30 +0100 (Wed, 04 May 2005) | 1 line
- M /reportlab/trunk/reportlab/platypus/doctemplate.py
- doctemplate.py: add rotation argument to BaseDocTemplate
-r2588 | rgbecker | 2005-05-03 12:56:56 +0100 (Tue, 03 May 2005) | 1 line
- M /reportlab/trunk/reportlab/platypus/doctemplate.py
- doctemplate.py: fix syntax error
-r2587 | rgbecker | 2005-05-03 12:41:54 +0100 (Tue, 03 May 2005) | 1 line
- M /reportlab/trunk/reportlab/lib/colors.py
- colors.py: add a fidred
-r2586 | rgbecker | 2005-05-03 12:41:17 +0100 (Tue, 03 May 2005) | 1 line
- M /reportlab/trunk/reportlab/lib/attrmap.py
- attrmap: fix initialization of _initial
-r2585 | rgbecker | 2005-05-03 12:40:11 +0100 (Tue, 03 May 2005) | 1 line
- M /reportlab/trunk/reportlab/platypus/doctemplate.py
- doctemplate.py: support for canvasmaker and rotation
-r2584 | rgbecker | 2005-05-03 12:39:22 +0100 (Tue, 03 May 2005) | 1 line
- M /reportlab/trunk/reportlab/pdfbase/pdfdoc.py
- M /reportlab/trunk/reportlab/lib/utils.py
- reportlab: better support for PIL image
-r2583 | rgbecker | 2005-04-30 17:31:55 +0100 (Sat, 30 Apr 2005) | 1 line
- M /reportlab/trunk/reportlab/pdfbase/pdfdoc.py
- pdfdoc.py: fix misspelling of DeviceGray
-r2581 | rgbecker | 2005-04-27 13:09:43 +0100 (Wed, 27 Apr 2005) | 1 line
- M /reportlab/trunk/reportlab/lib/utils.py
- utils.py: use normpath in _archive etc etc
-r2579 | rgbecker | 2005-04-25 11:38:14 +0100 (Mon, 25 Apr 2005) | 1 line
- M /reportlab/trunk/reportlab/pdfbase/pdfutils.py
- M /reportlab/trunk/reportlab/pdfbase/pdfdoc.py
- M /reportlab/trunk/reportlab/lib/utils.py
- CMYK image improvements
-r2576 | rgbecker | 2005-04-20 11:39:42 +0100 (Wed, 20 Apr 2005) | 1 line
- M /reportlab/trunk/reportlab/platypus/tables.py
- tables.py: fix vertical height bug
-r2570 | jjlee | 2005-04-19 13:44:21 +0100 (Tue, 19 Apr 2005) | 1 line
- M /reportlab/trunk/reportlab/test/test_utils.py
- Merge to trunk the fix to a FmtSelfDict test that I accidentally conmitted to a tag (svn merge -r 2568:2569 https://www.reportlab.co.uk/svn/public/reportlab/tags/fidreleases/fidelity-20050310T103800/reportlab)
-r2566 | jjlee | 2005-04-18 14:25:25 +0100 (Mon, 18 Apr 2005) | 1 line
- A /reportlab/trunk/reportlab/test/test_utils.py
- M /reportlab/trunk/reportlab/lib/utils.py
- Allow overriding parameters in _fmt utility method
-r2561 | rgbecker | 2005-04-15 15:04:49 +0100 (Fri, 15 Apr 2005) | 1 line
- M /reportlab/trunk/reportlab/pdfgen/canvas.py
- canvas.py: minor changes to bring into line with TBlatter's early serializer version
-r2560 | rgbecker | 2005-04-15 15:04:10 +0100 (Fri, 15 Apr 2005) | 1 line
- M /reportlab/trunk/reportlab/pdfbase/pdfdoc.py
- pdfdoc.py: minor changes to bring into line with TBlatter's early serializer version
-r2551 | rgbecker | 2005-04-14 15:53:04 +0100 (Thu, 14 Apr 2005) | 1 line
- M /reportlab/trunk/reportlab/pdfbase/pdfdoc.py
- pdfdoc.py: minor changes to simplify PDFInfoL/U in other apps
-r2550 | rgbecker | 2005-04-12 18:23:17 +0100 (Tue, 12 Apr 2005) | 1 line
- M /reportlab/trunk/reportlab/test/test_platypus_tables.py
- M /reportlab/trunk/reportlab/platypus/tables.py
- tables.py: fixes to split + spans
-r2549 | rgbecker | 2005-04-01 10:38:18 +0100 (Fri, 01 Apr 2005) | 1 line
- M /reportlab/trunk/reportlab/platypus/tables.py
- tables.py: eliminate use of enumerate
-r2548 | rgbecker | 2005-03-31 16:35:20 +0100 (Thu, 31 Mar 2005) | 1 line
- M /reportlab/trunk/reportlab/pdfbase/pdfmetrics.py
- pdfmetrics.py: fix minor buglet discovered by Ron Peleg
-r2547 | rgbecker | 2005-03-29 14:54:51 +0100 (Tue, 29 Mar 2005) | 1 line
- M /reportlab/trunk/reportlab/test/test_table_layout.py
- M /reportlab/trunk/reportlab/platypus/tables.py
- tables.py: added in Gary Poster's gary@zope.com latest patch
-r2546 | rgbecker | 2005-03-23 13:35:58 +0000 (Wed, 23 Mar 2005) | 1 line
- M /reportlab/trunk/reportlab/platypus/tables.py
- tables.py: be evn more robust about width/drawWidth etc
-r2545 | rgbecker | 2005-03-23 11:35:10 +0000 (Wed, 23 Mar 2005) | 1 line
- M /reportlab/trunk/reportlab/platypus/tables.py
- tables.py: fix for case when minWidth fails du eot attribute error
-r2544 | rgbecker | 2005-03-18 18:51:22 +0000 (Fri, 18 Mar 2005) | 1 line
- M /reportlab/trunk/reportlab/platypus/tables.py
- tables.py: improve join/cap conversion
-r2543 | rptlab | 2005-03-18 15:15:23 +0000 (Fri, 18 Mar 2005) | 1 line
- M /reportlab/trunk/reportlab/platypus/tables.py
- tables.py: 2.1 compatibility changes
-r2542 | rgbecker | 2005-03-18 14:37:49 +0000 (Fri, 18 Mar 2005) | 1 line
- M /reportlab/trunk/reportlab/platypus/tables.py
- M /reportlab/trunk/reportlab/platypus/paragraph.py
- tables.py, paragraph.py: Gary Poster's layout improvement patch
-r2541 | rgbecker | 2005-03-18 14:37:01 +0000 (Fri, 18 Mar 2005) | 1 line
- M /reportlab/trunk/reportlab/platypus/doctemplate.py
- doctemplate.py: fix cgitb recursion problem
-r2540 | rgbecker | 2005-03-17 12:01:27 +0000 (Thu, 17 Mar 2005) | 1 line
- M /reportlab/trunk/reportlab/platypus/tables.py
- tables.py: fix Gary's patch (broken by Robin)
-r2539 | rgbecker | 2005-03-16 18:46:16 +0000 (Wed, 16 Mar 2005) | 1 line
- M /reportlab/trunk/reportlab/platypus/tables.py
- tables.py: fixes to join/cap/dash from Gary Poster
-r2538 | rgbecker | 2005-03-16 09:47:07 +0000 (Wed, 16 Mar 2005) | 1 line
- M /reportlab/trunk/reportlab/platypus/tables.py
- tables.py: empty cellval patch from Jean-Francois Gosset
-r2537 | rgbecker | 2005-03-15 14:19:29 +0000 (Tue, 15 Mar 2005) | 1 line
- M /reportlab/trunk/reportlab/pdfgen/pathobject.py
- pathobject: speed improvements and initial assertion
-r2536 | andy | 2005-03-14 20:04:55 +0000 (Mon, 14 Mar 2005) | 1 line
- M /reportlab/trunk/reportlab/test/test_platypus_tables.py
- M /reportlab/trunk/reportlab/platypus/flowables.py
- M /reportlab/trunk/reportlab/pdfgen/canvas.py
- enhanced decimal alignment
-r2535 | rgbecker | 2005-03-11 10:34:29 +0000 (Fri, 11 Mar 2005) | 1 line
- M /reportlab/trunk/reportlab/platypus/doctemplate.py
- doctemplate.py: fix buglet reported by Steve Halasz
-r2530 | jjlee | 2005-03-02 14:27:57 +0000 (Wed, 02 Mar 2005) | 1 line
- M /reportlab/trunk/reportlab/lib/utils.py
- Add process environment to logged traceback
-r2528 | rgbecker | 2005-02-28 15:55:58 +0000 (Mon, 28 Feb 2005) | 1 line
- M /reportlab/trunk/reportlab/test/test_pdfgen_general.py
- M /reportlab/trunk/reportlab/pdfgen/canvas.py
- canvas.py: added in Andrew Mercer's linkURL fix
-r2526 | rgbecker | 2005-02-21 15:40:08 +0000 (Mon, 21 Feb 2005) | 1 line
- M /reportlab/trunk/reportlab/test/test_paragraphs.py
- test_paragraphs.py: added font size change test for underlining test
-r2525 | rgbecker | 2005-02-21 14:55:11 +0000 (Mon, 21 Feb 2005) | 1 line
- M /reportlab/trunk/reportlab/test/test_paragraphs.py
- M /reportlab/trunk/reportlab/platypus/paragraph.py
- paragraph.py: added proper undeerline color
-r2524 | rgbecker | 2005-02-17 08:43:01 +0000 (Thu, 17 Feb 2005) | 1 line
- M /reportlab/trunk/reportlab/lib/units.py
- units.py: fix pica conversion thanks to Paul McNett
-r2523 | rgbecker | 2005-02-07 17:59:09 +0000 (Mon, 07 Feb 2005) | 1 line
- M /reportlab/trunk/reportlab/lib/utils.py
- utils.py: added FmtSelfDict class
-r2522 | rgbecker | 2005-02-07 11:26:31 +0000 (Mon, 07 Feb 2005) | 1 line
- M /reportlab/trunk/reportlab/graphics/shapes.py
- shapes.py: added save renderer specific argument handling
-r2521 | rgbecker | 2005-02-07 10:29:15 +0000 (Mon, 07 Feb 2005) | 1 line
- M /reportlab/trunk/reportlab/pdfgen/canvas.py
- canvas.py: added setFontSize method
-r2520 | rgbecker | 2005-02-05 10:19:05 +0000 (Sat, 05 Feb 2005) | 1 line
- M /reportlab/trunk/reportlab/platypus/flowables.py
- flowables.py: fix 2.1 breakage
-r2519 | rgbecker | 2005-02-03 17:14:58 +0000 (Thu, 03 Feb 2005) | 1 line
- M /reportlab/trunk/reportlab/platypus/flowables.py
- M /reportlab/trunk/reportlab/platypus/doctemplate.py
- platypus: make LCActionFlowable the bad ones
-r2518 | rgbecker | 2005-02-03 11:30:21 +0000 (Thu, 03 Feb 2005) | 1 line
- M /reportlab/trunk/reportlab/platypus/flowables.py
- M /reportlab/trunk/reportlab/platypus/doctemplate.py
- platypus: attempt to make KeepTogether/keepWithNext more robust
-r2517 | rgbecker | 2005-02-02 14:43:28 +0000 (Wed, 02 Feb 2005) | 1 line
- M /reportlab/trunk/reportlab/lib/utils.py
- reportlab/lib/utils.py: remove bad checkin
-r2516 | rgbecker | 2005-02-02 14:40:15 +0000 (Wed, 02 Feb 2005) | 1 line
- M /reportlab/trunk/reportlab/lib/utils.py
- fix reportlab_functional.txt
-r2515 | andy | 2005-01-31 16:47:03 +0000 (Mon, 31 Jan 2005) | 1 line
- M /reportlab/trunk/reportlab/platypus/paraparser.py
- allow solid para background
-r2514 | andy | 2005-01-27 21:44:35 +0000 (Thu, 27 Jan 2005) | 1 line
- M /reportlab/trunk/reportlab/platypus/paragraph.py
- minor fix to allow getPlaintext on more paragraphs
-r2512 | rgbecker | 2005-01-14 16:06:57 +0000 (Fri, 14 Jan 2005) | 1 line
- M /reportlab/trunk/reportlab/test/test_platypus_tables.py
- M /reportlab/trunk/reportlab/platypus/tables.py
- tables.py: added span rows split handling & test contributed by Andre Reitz
-r2511 | rgbecker | 2005-01-14 15:42:12 +0000 (Fri, 14 Jan 2005) | 1 line
- M /reportlab/trunk/reportlab/setup.py
- setup.py: fix missing comma, contributed by Andre Reitz
-r2510 | rgbecker | 2005-01-13 11:50:57 +0000 (Thu, 13 Jan 2005) | 1 line
- M /reportlab/trunk/reportlab/graphics/charts/axes.py
- axes.py: finally make abf/rr work properly
-r2509 | rgbecker | 2005-01-10 18:29:17 +0000 (Mon, 10 Jan 2005) | 1 line
- M /reportlab/trunk/reportlab/graphics/renderPS.py
- renderPS.py: fix buglet in color setting
-r2507 | rgbecker | 2005-01-10 10:04:09 +0000 (Mon, 10 Jan 2005) | 1 line
- M /reportlab/trunk/reportlab/graphics/charts/legends.py
- legends.py: fix for empty legend prob
-r2506 | rgbecker | 2005-01-06 12:21:25 +0000 (Thu, 06 Jan 2005) | 1 line
- M /reportlab/trunk/reportlab/test/test_platypus_leftright.py
- M /reportlab/trunk/reportlab/test/test_pdfgen_general.py
- M /reportlab/trunk/reportlab/pdfgen/canvas.py
- added canvas.textAnnotation and tests for it
-r2504 | rgbecker | 2004-12-31 12:49:02 +0000 (Fri, 31 Dec 2004) | 1 line
- M /reportlab/trunk/reportlab/graphics/charts/legends.py
- legends.py: fix callout bug
-r2502 | rgbecker | 2004-12-31 11:20:06 +0000 (Fri, 31 Dec 2004) | 1 line
- M /reportlab/trunk/reportlab/rl_config.py
- M /reportlab/trunk/reportlab/platypus/tables.py
- added longTableOptimize config variable
-r2501 | rgbecker | 2004-12-31 11:13:44 +0000 (Fri, 31 Dec 2004) | 1 line
- M /reportlab/trunk/reportlab/test/test_graphics_charts.py
- test_graphics_charts.py: added new legend testing
-r2500 | rgbecker | 2004-12-30 09:51:30 +0000 (Thu, 30 Dec 2004) | 1 line
- M /reportlab/trunk/reportlab/graphics/charts/barcharts.py
- barcharts.py: fix missing getattr
-r2499 | rgbecker | 2004-12-29 17:12:34 +0000 (Wed, 29 Dec 2004) | 1 line
- M /reportlab/trunk/reportlab/graphics/charts/doughnut.py
- Fix up missing initialization
-r2498 | rgbecker | 2004-12-29 17:11:02 +0000 (Wed, 29 Dec 2004) | 1 line
- M /reportlab/trunk/reportlab/graphics/charts/piecharts.py
- M /reportlab/trunk/reportlab/graphics/charts/doughnut.py
- M /reportlab/trunk/reportlab/graphics/charts/barcharts.py
- barcharts.py: NoneOr was miscapitalized
-r2497 | rgbecker | 2004-12-29 14:08:38 +0000 (Wed, 29 Dec 2004) | 1 line
- M /reportlab/trunk/reportlab/graphics/charts/piecharts.py
- M /reportlab/trunk/reportlab/graphics/charts/legends.py
- M /reportlab/trunk/reportlab/graphics/charts/barcharts.py
- charts: minor adjustments to legends/swatches for pies/barcharts
-r2496 | rgbecker | 2004-12-23 15:38:16 +0000 (Thu, 23 Dec 2004) | 1 line
- M /reportlab/trunk/reportlab/graphics/charts/legends.py
- legends.py: added variColumn attribute
-r2495 | rgbecker | 2004-12-22 18:25:37 +0000 (Wed, 22 Dec 2004) | 1 line
- M /reportlab/trunk/reportlab/test/test_graphics_charts.py
- M /reportlab/trunk/reportlab/graphics/charts/legends.py
- graphics: minor legend tweaks
-r2494 | rgbecker | 2004-12-22 16:50:08 +0000 (Wed, 22 Dec 2004) | 1 line
- M /reportlab/trunk/reportlab/graphics/charts/axes.py
- axes.py: added categegorAxis tickShift
-r2493 | rgbecker | 2004-12-22 16:14:25 +0000 (Wed, 22 Dec 2004) | 1 line
- M /reportlab/trunk/reportlab/test/test_graphics_charts.py
- M /reportlab/trunk/reportlab/graphics/charts/spider.py
- M /reportlab/trunk/reportlab/graphics/charts/piecharts.py
- M /reportlab/trunk/reportlab/graphics/charts/lineplots.py
- M /reportlab/trunk/reportlab/graphics/charts/linecharts.py
- M /reportlab/trunk/reportlab/graphics/charts/legends.py
- M /reportlab/trunk/reportlab/graphics/charts/barcharts.py
- charts: autolegending in place, legend now has boxAnchor
-r2492 | rgbecker | 2004-12-21 18:02:28 +0000 (Tue, 21 Dec 2004) | 1 line
- M /reportlab/trunk/reportlab/lib/validators.py
- M /reportlab/trunk/reportlab/graphics/charts/lineplots.py
- M /reportlab/trunk/reportlab/graphics/charts/linecharts.py
- M /reportlab/trunk/reportlab/graphics/charts/legends.py
- M /reportlab/trunk/reportlab/graphics/charts/barcharts.py
- M /reportlab/trunk/reportlab/graphics/charts/axes.py
- Auto Legends
-r2491 | andy | 2004-12-21 05:29:55 +0000 (Tue, 21 Dec 2004) | 1 line
- M /reportlab/trunk/reportlab/graphics/charts/barcharts.py
- missing isString import
-r2490 | rgbecker | 2004-12-20 19:00:02 +0000 (Mon, 20 Dec 2004) | 1 line
- M /reportlab/trunk/reportlab/lib/validators.py
- validators.py: better auto support
-r2489 | rgbecker | 2004-12-20 18:59:35 +0000 (Mon, 20 Dec 2004) | 1 line
- M /reportlab/trunk/reportlab/graphics/charts/legends.py
- M /reportlab/trunk/reportlab/graphics/charts/barcharts.py
- legends.py: more smart changes
-r2488 | rgbecker | 2004-12-19 09:19:07 +0000 (Sun, 19 Dec 2004) | 1 line
- M /reportlab/trunk/reportlab/graphics/charts/legends.py
- legends.py: fix missing import
-r2487 | rgbecker | 2004-12-19 09:15:56 +0000 (Sun, 19 Dec 2004) | 1 line
- M /reportlab/trunk/reportlab/lib/validators.py
- validators.py: forgot to check in with AutoOr
-r2486 | rgbecker | 2004-12-17 16:58:32 +0000 (Fri, 17 Dec 2004) | 1 line
- M /reportlab/trunk/reportlab/graphics/widgetbase.py
- M /reportlab/trunk/reportlab/graphics/charts/spider.py
- M /reportlab/trunk/reportlab/graphics/charts/piecharts.py
- M /reportlab/trunk/reportlab/graphics/charts/legends.py
- M /reportlab/trunk/reportlab/graphics/charts/doughnut.py
- graphics: changes for SmartLegend
-r2485 | rgbecker | 2004-12-16 16:42:12 +0000 (Thu, 16 Dec 2004) | 1 line
- M /reportlab/trunk/reportlab/graphics/charts/lineplots.py
- lineplots.py: allow filled/unfilled plotting
-r2484 | andy | 2004-12-10 07:27:50 +0000 (Fri, 10 Dec 2004) | 1 line
- A /reportlab/trunk/reportlab/test/test_platypus_leftright.py
- M /reportlab/trunk/reportlab/platypus/doctemplate.py
- M /reportlab/trunk/reportlab/lib/corp.py
- left/right template support
-r2483 | rgbecker | 2004-12-06 17:00:44 +0000 (Mon, 06 Dec 2004) | 1 line
- M /reportlab/trunk/reportlab/test/runAll.py
- reportlab.test.utils.py: fix 2.4 problem
-r2480 | rgbecker | 2004-11-25 14:27:07 +0000 (Thu, 25 Nov 2004) | 1 line
- M /reportlab/trunk/reportlab/changes
- reportlab: prparing for 1.20 re-release
-r2478 | rgbecker | 2004-11-25 14:18:03 +0000 (Thu, 25 Nov 2004) | 1 line
- M /reportlab/trunk/reportlab/test/test_platypus_tables.py
- M /reportlab/trunk/reportlab/platypus/tables.py
- tables.py: extend span line blocking to multi lines
-#################################################################################
-#################### RELEASE 1.20 at 18:00 GMT 25/Nov/2004 #################
-#################################################################################
-r2478 | rgbecker | 2004-11-25 14:18:03 +0000 (Thu, 25 Nov 2004)
- tables.py: extend span line blocking to multi lines
-r2477 | rgbecker | 2004-11-24 18:29:57 +0000 (Wed, 24 Nov 2004)
- setup.py: add backin the missing sub-packages
-r2476 | rgbecker | 2004-11-24 16:42:12 +0000 (Wed, 24 Nov 2004)
- reportlab: table improvments and better documentation
-r2475 | rgbecker | 2004-11-23 17:08:33 +0000 (Tue, 23 Nov 2004)
- reportlab.setup.py: now works with and without rl_accel
-r2462 | rgbecker | 2004-11-03 20:48:51 +0000 (Wed, 03 Nov 2004)
- M /reportlab/trunk/reportlab/lib/utils.py
- reportlab lib utils.py: add find_locals
-r2461 | rgbecker | 2004-11-03 15:38:07 +0000 (Wed, 03 Nov 2004)
- M /reportlab/trunk/reportlab/graphics/renderPM.py
- M /reportlab/trunk/reportlab/graphics/renderPS.py
- reportlab graphics: changes for canvasadapter
-r2460 | rgbecker | 2004-11-02 10:18:55 +0000 (Tue, 02 Nov 2004)
- M /reportlab/trunk/reportlab/platypus/flowables.py
- flowables.py: fix no PIL jpg problem reported by Martin.Zohlhuber@tttech.com
-r2459 | rgbecker | 2004-10-23 16:46:56 +0100 (Sat, 23 Oct 2004)
- M /reportlab/trunk/reportlab/pdfgen/canvas.py
- M /reportlab/trunk/reportlab/platypus/flowables.py
- canvasadapter.py fixes
-r2458 | rgbecker | 2004-10-22 17:37:01 +0100 (Fri, 22 Oct 2004)
- M /reportlab/trunk/reportlab/graphics/renderPM.py
- M /reportlab/trunk/reportlab/lib/colors.py
- minor changes for pdf canvas compatibility and tests
-r2457 | rgbecker | 2004-10-20 20:27:07 +0100 (Wed, 20 Oct 2004)
- M /reportlab/trunk/reportlab/graphics/renderPM.py
- M /reportlab/trunk/reportlab/graphics/renderbase.py
- M /reportlab/trunk/reportlab/platypus/tables.py
- CanvasAdapter related changes
-r2456 | rgbecker | 2004-10-19 18:52:20 +0100 (Tue, 19 Oct 2004)
- M /reportlab/trunk/reportlab/platypus/paragraph.py
- paragraph.py: use canvas.setFillColor
-r2455 | rgbecker | 2004-10-07 18:51:31 +0100 (Thu, 07 Oct 2004)
- M /reportlab/trunk/reportlab/pdfbase/pdfutils.py
- pdfutils.py: added _fusc
-r2454 | rgbecker | 2004-10-07 10:36:36 +0100 (Thu, 07 Oct 2004)
- M /reportlab/trunk/reportlab/tools/pythonpoint/stdparser.py
- stdparser.py: fix 2.1 brokenness
-r2453 | andy | 2004-10-05 23:34:14 +0100 (Tue, 05 Oct 2004)
- M /reportlab/trunk/reportlab/platypus/tables.py
- fixed col/row shading bug where last row or col never got shaded - reported R Revill
-r2452 | andy | 2004-10-04 21:52:20 +0100 (Mon, 04 Oct 2004)
- M /reportlab/trunk/reportlab/platypus/tables.py
- Tim Roberts' fix to vertical table cell alignment
-r2451 | andy | 2004-10-04 08:03:42 +0100 (Mon, 04 Oct 2004)
- M /reportlab/trunk/reportlab/tools/pythonpoint/stdparser.py
- Francesco Pierfederici [fpierfed@noao.edu] fix to incorrect path argument
-r2450 | rgbecker | 2004-10-01 13:28:12 +0100 (Fri, 01 Oct 2004)
- M /reportlab/trunk/reportlab/rl_config.py
- rl_config.py: use import for local_rl_config
-r2449 | rgbecker | 2004-10-01 11:40:15 +0100 (Fri, 01 Oct 2004)
- M /reportlab/trunk/reportlab/platypus/tables.py
- tables.py: fix buglet in command adding
-r2448 | andy | 2004-09-29 11:18:32 +0100 (Wed, 29 Sep 2004)
- M /reportlab/trunk/reportlab/lib/colors.py
- M /reportlab/trunk/reportlab/lib/corp.py
- M /reportlab/trunk/reportlab/platypus/flowables.py
- M /reportlab/trunk/reportlab/platypus/tables.py
- M /reportlab/trunk/reportlab/test/test_platypus_tables.py
- table color cycle changes
-r2447 | andy | 2004-09-29 10:17:52 +0100 (Wed, 29 Sep 2004)
- M /reportlab/trunk/reportlab/license.txt
- Updated to 2004
-r2446 | rgbecker | 2004-09-23 17:52:19 +0100 (Thu, 23 Sep 2004)
- D /reportlab/trunk/reportlab/lib/Makefile.pre.in
- D /reportlab/trunk/reportlab/lib/README.extensions
- D /reportlab/trunk/reportlab/lib/Setup.in
- D /reportlab/trunk/reportlab/lib/__BUILD.dsw
- D /reportlab/trunk/reportlab/lib/_rl_accel.c
- D /reportlab/trunk/reportlab/lib/_rl_accel.dsp
- D /reportlab/trunk/reportlab/lib/_rl_accel.java
- D /reportlab/trunk/reportlab/lib/hnjalloc.c
- D /reportlab/trunk/reportlab/lib/hnjalloc.h
- D /reportlab/trunk/reportlab/lib/hyphen.c
- D /reportlab/trunk/reportlab/lib/hyphen.h
- D /reportlab/trunk/reportlab/lib/hyphen.mashed
- D /reportlab/trunk/reportlab/lib/pyHnj.dsp
- D /reportlab/trunk/reportlab/lib/pyHnjmodule.c
- D /reportlab/trunk/reportlab/lib/setup.py
- D /reportlab/trunk/reportlab/lib/sgmlop.c
- D /reportlab/trunk/reportlab/lib/sgmlop.dsp
- M /reportlab/trunk/reportlab/setup.py
- A /reportlab/trunk/rl_addons/rl_accel
- A /reportlab/trunk/rl_addons/rl_accel/Makefile.pre.in (from /reportlab/trunk/reportlab/lib/Makefile.pre.in:2444)
- A /reportlab/trunk/rl_addons/rl_accel/README.extensions (from /reportlab/trunk/reportlab/lib/README.extensions:2444)
- A /reportlab/trunk/rl_addons/rl_accel/Setup.in (from /reportlab/trunk/reportlab/lib/Setup.in:2444)
- A /reportlab/trunk/rl_addons/rl_accel/__BUILD.dsw (from /reportlab/trunk/reportlab/lib/__BUILD.dsw:2444)
- A /reportlab/trunk/rl_addons/rl_accel/_rl_accel.c (from /reportlab/trunk/reportlab/lib/_rl_accel.c:2444)
- A /reportlab/trunk/rl_addons/rl_accel/_rl_accel.dsp (from /reportlab/trunk/reportlab/lib/_rl_accel.dsp:2444)
- A /reportlab/trunk/rl_addons/rl_accel/_rl_accel.java (from /reportlab/trunk/reportlab/lib/_rl_accel.java:2444)
- A /reportlab/trunk/rl_addons/rl_accel/hnjalloc.c (from /reportlab/trunk/reportlab/lib/hnjalloc.c:2444)
- A /reportlab/trunk/rl_addons/rl_accel/hnjalloc.h (from /reportlab/trunk/reportlab/lib/hnjalloc.h:2444)
- A /reportlab/trunk/rl_addons/rl_accel/hyphen.c (from /reportlab/trunk/reportlab/lib/hyphen.c:2444)
- A /reportlab/trunk/rl_addons/rl_accel/hyphen.h (from /reportlab/trunk/reportlab/lib/hyphen.h:2444)
- A /reportlab/trunk/rl_addons/rl_accel/hyphen.mashed (from /reportlab/trunk/reportlab/lib/hyphen.mashed:2444)
- A /reportlab/trunk/rl_addons/rl_accel/pyHnj.dsp (from /reportlab/trunk/reportlab/lib/pyHnj.dsp:2444)
- A /reportlab/trunk/rl_addons/rl_accel/pyHnjmodule.c (from /reportlab/trunk/reportlab/lib/pyHnjmodule.c:2444)
- A /reportlab/trunk/rl_addons/rl_accel/setup.py (from /reportlab/trunk/reportlab/lib/setup.py:2444)
- A /reportlab/trunk/rl_addons/rl_accel/sgmlop.c (from /reportlab/trunk/reportlab/lib/sgmlop.c:2444)
- A /reportlab/trunk/rl_addons/rl_accel/sgmlop.dsp (from /reportlab/trunk/reportlab/lib/sgmlop.dsp:2444)
- reportlab/lib: moved _rl_accel and friends to rl_addons/rl_accel
-r2445 | rgbecker | 2004-09-23 13:36:41 +0100 (Thu, 23 Sep 2004)
- M /reportlab/trunk/reportlab/platypus/tables.py
- tables.py: robustify repr
-r2443 | rgbecker | 2004-09-22 09:57:45 +0100 (Wed, 22 Sep 2004)
- M /reportlab/trunk/reportlab/platypus/flowables.py
- flowables.py: remove 2.1 incompatibility
-r2442 | rgbecker | 2004-09-20 17:31:22 +0100 (Mon, 20 Sep 2004)
- M /reportlab/trunk/reportlab/platypus/flowables.py
- M /reportlab/trunk/reportlab/test/test_platypus_pto.py
- platypus/test: working pto (& inner pto)
-r2441 | rgbecker | 2004-09-17 11:46:56 +0100 (Fri, 17 Sep 2004)
- M /reportlab/trunk/reportlab/graphics/renderPM.py
- renderPM.py: backward compatibility fix for _renderPM version <=0.98
-r2440 | rgbecker | 2004-09-15 10:40:03 +0100 (Wed, 15 Sep 2004)
- M /reportlab/trunk/reportlab/setup.py
- setup.py: fix get_version using patch from michael@stroeder.com
-r2439 | rgbecker | 2004-09-14 12:08:13 +0100 (Tue, 14 Sep 2004)
- M /reportlab/trunk/reportlab/platypus/__init__.py
- M /reportlab/trunk/reportlab/platypus/flowables.py
- M /reportlab/trunk/reportlab/platypus/tables.py
- A /reportlab/trunk/reportlab/test/test_platypus_pto.py
- M /reportlab/trunk/reportlab/test/test_platypus_tables.py
- platypus: added ptocontainer, moved tables test
-r2438 | rgbecker | 2004-09-13 09:41:41 +0100 (Mon, 13 Sep 2004)
- M /reportlab/trunk/reportlab/test/test_platypus_general.py
- test_platypus_general.py: remove another 2.1 scope problem
-r2437 | rgbecker | 2004-09-12 11:06:45 +0100 (Sun, 12 Sep 2004)
- M /reportlab/trunk/reportlab/test/test_platypus_general.py
- test_platypus_general.py: eliminate 2.1 scope problem
-r2436 | rgbecker | 2004-09-11 15:18:33 +0100 (Sat, 11 Sep 2004)
- M /reportlab/trunk/reportlab/lib/randomtext.py
- randomtext.py: robustify textwrap import
-r2435 | rgbecker | 2004-09-10 10:54:15 +0100 (Fri, 10 Sep 2004)
- M /reportlab/trunk/reportlab/lib/randomtext.py
- randomtext.py: fix argument handling
-r2434 | rgbecker | 2004-09-09 18:42:18 +0100 (Thu, 09 Sep 2004)
- M /reportlab/trunk/reportlab/platypus/frames.py
- M /reportlab/trunk/reportlab/rl_config.py
- move _FUZZ to rl_config
-r2433 | rgbecker | 2004-09-09 18:01:57 +0100 (Thu, 09 Sep 2004)
- M /reportlab/trunk/reportlab/pdfbase/pdfdoc.py
- pdfdoc.py: improve image masking given by Colors
-r2432 | rgbecker | 2004-09-09 12:56:24 +0100 (Thu, 09 Sep 2004)
- M /reportlab/trunk/reportlab/lib/randomtext.py
- randomtext.py: some improvements
-r2431 | rgbecker | 2004-09-08 18:41:10 +0100 (Wed, 08 Sep 2004)
- M /reportlab/trunk/reportlab/platypus/flowables.py
- M /reportlab/trunk/reportlab/platypus/paraparser.py
- flowables.py: minor change to PTOContainer
-r2430 | rgbecker | 2004-09-08 18:37:26 +0100 (Wed, 08 Sep 2004)
- M /reportlab/trunk/reportlab/platypus/flowables.py
- M /reportlab/trunk/reportlab/platypus/frames.py
- platypus: almost finished PTOContainer
-r2429 | rgbecker | 2004-09-08 12:02:58 +0100 (Wed, 08 Sep 2004)
- M /reportlab/trunk/reportlab/platypus/tables.py
- tables.py: implement Eric Stephen's border drawing suggestion
-r2428 | rgbecker | 2004-09-08 11:47:55 +0100 (Wed, 08 Sep 2004)
- M /reportlab/trunk/reportlab/test/test_platypus_general.py
- test_platypus_general.py: fix so all output seen
-r2427 | rgbecker | 2004-09-03 10:53:17 +0100 (Fri, 03 Sep 2004)
- M /reportlab/trunk/rl_addons/pyRXP/pyRXP.c
- M /reportlab/trunk/rl_addons/pyRXP/rxp/xmlparser.c
- pyRXP: fix buf bug in xmlparser.c -->1.05
-r2426 | rgbecker | 2004-09-02 12:52:56 +0100 (Thu, 02 Sep 2004)
- M /reportlab/trunk/reportlab/platypus/xpreformatted.py
- XPreformatted: make __init__ lead args same as for paragraph
-r2425 | rgbecker | 2004-08-27 17:08:32 +0100 (Fri, 27 Aug 2004)
- M /reportlab/trunk/reportlab/graphics/charts/axes.py
- axes.py: fix format bug
-r2424 | rgbecker | 2004-08-25 15:38:48 +0100 (Wed, 25 Aug 2004)
- M /reportlab/trunk/reportlab/platypus/paraparser.py
- paraparser.py: minor speedup
-r2423 | rgbecker | 2004-08-24 12:36:22 +0100 (Tue, 24 Aug 2004)
- M /reportlab/trunk/reportlab/lib/sequencer.py
- M /reportlab/trunk/reportlab/platypus/paraparser.py
- M /reportlab/trunk/reportlab/test/test_paragraphs.py
- added seqchain/format tags
-r2422 | rgbecker | 2004-08-23 16:54:25 +0100 (Mon, 23 Aug 2004)
- M /reportlab/trunk/reportlab/platypus/paragraph.py
- M /reportlab/trunk/reportlab/test/test_paragraphs.py
- fix backcolour bug
-r2421 | rgbecker | 2004-08-20 17:12:33 +0100 (Fri, 20 Aug 2004)
- M /reportlab/trunk/reportlab/platypus/__init__.py
- M /reportlab/trunk/reportlab/platypus/doctemplate.py
- M /reportlab/trunk/reportlab/platypus/paragraph.py
- M /reportlab/trunk/reportlab/test/test_paragraphs.py
- minor twitching on Indenter
-r2420 | rgbecker | 2004-08-19 23:17:05 +0100 (Thu, 19 Aug 2004)
- M /reportlab/trunk/reportlab/lib/utils.py
- reportlab/lib/utils.py: added flatten utility function
-r2419 | rgbecker | 2004-08-19 10:58:05 +0100 (Thu, 19 Aug 2004)
- M /reportlab/trunk/reportlab/lib/_rl_accel.c
- _rl_accel.c: patch from Yves Bastide
-r2418 | rgbecker | 2004-08-18 14:11:15 +0100 (Wed, 18 Aug 2004)
- M /reportlab/trunk/reportlab/graphics/charts/textlabels.py
- M /reportlab/trunk/reportlab/graphics/widgetbase.py
- remove 2.2 isms
-r2417 | rgbecker | 2004-08-18 12:17:54 +0100 (Wed, 18 Aug 2004)
- M /reportlab/trunk/reportlab/graphics/charts/textlabels.py
- textlabels.py: added keyword arguments
-r2416 | rgbecker | 2004-08-17 14:52:21 +0100 (Tue, 17 Aug 2004)
- M /reportlab/trunk/reportlab/graphics/charts/lineplots.py
- lineplots.py: added filler handling
-r2415 | rgbecker | 2004-08-07 16:00:28 +0100 (Sat, 07 Aug 2004)
- M /reportlab/trunk/reportlab/graphics/renderPDF.py
- M /reportlab/trunk/reportlab/graphics/renderPM.py
- M /reportlab/trunk/reportlab/graphics/renderPS.py
- M /reportlab/trunk/reportlab/graphics/renderSVG.py
- M /reportlab/trunk/reportlab/graphics/renderbase.py
- M /reportlab/trunk/reportlab/rl_config.py
- rl_config add _unset_, graphics.renderxxx refactoring
-r2414 | rgbecker | 2004-07-28 08:53:41 +0100 (Wed, 28 Jul 2004)
- M /reportlab/trunk/reportlab/pdfbase/pdfdoc.py
- pdfdoc: fix rare bug (exposed in tinyrml)
-r2413 | rgbecker | 2004-07-26 09:56:04 +0100 (Mon, 26 Jul 2004)
- M /reportlab/trunk/rl_addons/pyRXP/rxp/system.h
- Attempt to fix LONG_LONG defn problem
-r2412 | rgbecker | 2004-07-23 17:57:11 +0100 (Fri, 23 Jul 2004)
- M /reportlab/trunk/reportlab/graphics/renderPM.py
- M /reportlab/trunk/rl_addons/renderPM/_renderPM.c
- M /reportlab/trunk/rl_addons/renderPM/gt1/gt1-parset1.c
- M /reportlab/trunk/rl_addons/renderPM/gt1/gt1-parset1.h
- Add reader callback arg to _renderPM.makeT1Font
-r2411 | rgbecker | 2004-07-23 14:48:21 +0100 (Fri, 23 Jul 2004)
- M /reportlab/trunk/reportlab/lib/utils.py
- Minor fixes to lib.utils.rl_get_module
-r2410 | rgbecker | 2004-07-23 10:43:00 +0100 (Fri, 23 Jul 2004)
- M /reportlab/trunk/reportlab/test/test_pdfbase_ttfonts.py
- test_pdfbase_ttfonts.py add multipage check
-r2409 | rgbecker | 2004-07-22 11:59:29 +0100 (Thu, 22 Jul 2004)
- M /reportlab/trunk/reportlab/lib/utils.py
- reportlab.lib.utils fix rl_isdir
-r2408 | rgbecker | 2004-07-17 20:43:44 +0100 (Sat, 17 Jul 2004)
- M /reportlab/trunk/rl_addons/pyRXP/patches/differ.bat
- D /reportlab/trunk/rl_addons/pyRXP/patches/rl-1.2.5.patch
- A /reportlab/trunk/rl_addons/pyRXP/patches/rl-1.4.0-patch
- M /reportlab/trunk/rl_addons/pyRXP/pyRXP.c
- M /reportlab/trunk/rl_addons/pyRXP/rxp/COPYRIGHT
- M /reportlab/trunk/rl_addons/pyRXP/rxp/Makefile
- M /reportlab/trunk/rl_addons/pyRXP/rxp/Manual
- A /reportlab/trunk/rl_addons/pyRXP/rxp/catalog.c
- A /reportlab/trunk/rl_addons/pyRXP/rxp/catalog.h
- A /reportlab/trunk/rl_addons/pyRXP/rxp/catalog_dtd.c
- A /reportlab/trunk/rl_addons/pyRXP/rxp/catutil.c
- A /reportlab/trunk/rl_addons/pyRXP/rxp/catutil.h
- M /reportlab/trunk/rl_addons/pyRXP/rxp/ctype16.c
- M /reportlab/trunk/rl_addons/pyRXP/rxp/ctype16.h
- M /reportlab/trunk/rl_addons/pyRXP/rxp/dtd.c
- M /reportlab/trunk/rl_addons/pyRXP/rxp/dtd.h
- A /reportlab/trunk/rl_addons/pyRXP/rxp/entityopener.c
- M /reportlab/trunk/rl_addons/pyRXP/rxp/infoset-print.c
- M /reportlab/trunk/rl_addons/pyRXP/rxp/input.c
- M /reportlab/trunk/rl_addons/pyRXP/rxp/input.h
- M /reportlab/trunk/rl_addons/pyRXP/rxp/namespaces.c
- M /reportlab/trunk/rl_addons/pyRXP/rxp/namespaces.h
- A /reportlab/trunk/rl_addons/pyRXP/rxp/nf16check.c
- A /reportlab/trunk/rl_addons/pyRXP/rxp/nf16check.h
- A /reportlab/trunk/rl_addons/pyRXP/rxp/nf16data.c
- A /reportlab/trunk/rl_addons/pyRXP/rxp/nf16data.h
- A /reportlab/trunk/rl_addons/pyRXP/rxp/resolve.c
- M /reportlab/trunk/rl_addons/pyRXP/rxp/rxp.1
- M /reportlab/trunk/rl_addons/pyRXP/rxp/rxp.c
- M /reportlab/trunk/rl_addons/pyRXP/rxp/rxputil.h
- M /reportlab/trunk/rl_addons/pyRXP/rxp/stdio16.c
- M /reportlab/trunk/rl_addons/pyRXP/rxp/system.h
- M /reportlab/trunk/rl_addons/pyRXP/rxp/url.c
- M /reportlab/trunk/rl_addons/pyRXP/rxp/version.c
- M /reportlab/trunk/rl_addons/pyRXP/rxp/xmlparser.c
- M /reportlab/trunk/rl_addons/pyRXP/rxp/xmlparser.h
- M /reportlab/trunk/rl_addons/pyRXP/setup.py
- Synchronize with rxp-1.4.0 --> version 1.04
-r2407 | rgbecker | 2004-07-15 11:22:38 +0100 (Thu, 15 Jul 2004)
- M /reportlab/trunk/reportlab/lib/utils.py
- Another know location
-r2406 | rgbecker | 2004-07-09 17:29:34 +0100 (Fri, 09 Jul 2004)
- M /reportlab/trunk/reportlab/rl_config.py
- Add user home to search paths
-r2405 | kirpal | 2004-07-09 15:34:52 +0100 (Fri, 09 Jul 2004)
- M /reportlab/trunk/reportlab/docs/userguide/ch1_intro.py
- changes to refrences of CVS
-r2404 | rgbecker | 2004-07-02 14:37:32 +0100 (Fri, 02 Jul 2004)
- A /reportlab/trunk/reportlab/tools/utils
- A /reportlab/trunk/reportlab/tools/utils/add_bleed.py
- Initial checkin
-r2402 | kirpal | 2004-06-29 14:28:59 +0100 (Tue, 29 Jun 2004)
- D /reportlab/trunk/reportlab/tools/pythonpoint/demos/confKit.xml
- moved to users/kirpals
-r2401 | kirpal | 2004-06-29 13:04:15 +0100 (Tue, 29 Jun 2004)
- M /reportlab/trunk/reportlab/tools/pythonpoint/demos/confKit.xml
- changes to presentation
-r2400 | kirpal | 2004-06-29 10:52:08 +0100 (Tue, 29 Jun 2004)
- M /reportlab/trunk/reportlab/tools/pythonpoint/demos/confKit.xml
-r2399 | kirpal | 2004-06-29 10:37:59 +0100 (Tue, 29 Jun 2004)
- M /reportlab/trunk/reportlab/tools/pythonpoint/demos/confKit.xml
- modified presentation
-r2398 | kirpal | 2004-06-29 10:19:21 +0100 (Tue, 29 Jun 2004)
- M /reportlab/trunk/reportlab/tools/pythonpoint/demos/confKit.xml
- modified presentation
-r2397 | kirpal | 2004-06-28 17:09:41 +0100 (Mon, 28 Jun 2004)
- M /reportlab/trunk/reportlab/tools/pythonpoint/demos/confKit.xml
- changes to presentation
-r2396 | kirpal | 2004-06-28 15:40:16 +0100 (Mon, 28 Jun 2004)
- A /reportlab/trunk/reportlab/tools/pythonpoint/demos/confKit.xml
- python point presentation for Confkit
-r2395 | rgbecker | 2004-06-25 19:10:50 +0100 (Fri, 25 Jun 2004)
- M /reportlab/trunk/reportlab/demos/stdfonts/stdfonts.py
- M /reportlab/trunk/reportlab/graphics/renderPDF.py
- M /reportlab/trunk/reportlab/graphics/shapes.py
- M /reportlab/trunk/reportlab/lib/validators.py
- M /reportlab/trunk/reportlab/pdfbase/pdfmetrics.py
- D /reportlab/trunk/reportlab/pdfbase/rl_codecs.py
- M /reportlab/trunk/reportlab/pdfbase/ttfonts.py
- M /reportlab/trunk/reportlab/pdfgen/canvas.py
- M /reportlab/trunk/reportlab/pdfgen/textobject.py
- M /reportlab/trunk/reportlab/platypus/flowables.py
- M /reportlab/trunk/reportlab/platypus/paragraph.py
- M /reportlab/trunk/reportlab/platypus/paraparser.py
- M /reportlab/trunk/reportlab/rl_config.py
- M /reportlab/trunk/reportlab/test/test_pdfbase_encodings.py
- M /reportlab/trunk/reportlab/test/test_pdfgen_general.py
- D /reportlab/trunk/reportlab/test/test_platypus_paraparser.py
- Removed unicode changes
-r2393 | rgbecker | 2004-06-23 15:56:24 +0100 (Wed, 23 Jun 2004)
- M /reportlab/trunk/reportlab/lib/utils.py
- Fix 2.2 mktemp argument mismatch
-r2392 | rgbecker | 2004-06-23 14:56:44 +0100 (Wed, 23 Jun 2004)
- M /reportlab/trunk/reportlab/lib/utils.py
- M /reportlab/trunk/reportlab/pdfbase/_fontdata.py
- M /reportlab/trunk/reportlab/rl_config.py
- More changes related to compact distro path recognition
-r2391 | rgbecker | 2004-06-23 09:52:43 +0100 (Wed, 23 Jun 2004)
- M /reportlab/trunk/reportlab/pdfbase/pdfmetrics.py
- Changes to bruteforce search, non-invasive changes to rl_accel stuff
-r2390 | rgbecker | 2004-06-23 09:49:10 +0100 (Wed, 23 Jun 2004)
- M /reportlab/trunk/reportlab/lib/codecharts.py
- Fix for unicode difficulties
-r2389 | rgbecker | 2004-06-22 18:00:41 +0100 (Tue, 22 Jun 2004)
- A /reportlab/trunk/reportlab/pdfbase/rl_codecs.py
- First try at Adobe T1 encodings
-r2388 | rgbecker | 2004-06-21 15:07:46 +0100 (Mon, 21 Jun 2004)
- M /reportlab/trunk/reportlab/demos/stdfonts/stdfonts.py
- Attempt to fix up for unicode
-r2387 | jjlee | 2004-06-18 11:39:08 +0100 (Fri, 18 Jun 2004)
- M /reportlab/trunk/reportlab/pdfbase/ttfonts.py
- Fixed zero-length string case in stringWidth
-r2386 | rgbecker | 2004-06-17 16:26:26 +0100 (Thu, 17 Jun 2004)
- M /reportlab/trunk/rl_addons/pyRXP/pyRXP.c
- M /reportlab/trunk/rl_addons/pyRXP/rxp/url.h
- M /reportlab/trunk/rl_addons/pyRXP/setup.py
- Remove $Header:, fix CopyRight & history
-r2385 | rgbecker | 2004-06-17 16:26:05 +0100 (Thu, 17 Jun 2004)
- M /reportlab/trunk/reportlab/__init__.py
- M /reportlab/trunk/reportlab/demos/colors/colortest.py
- M /reportlab/trunk/reportlab/demos/gadflypaper/gfe.py
- M /reportlab/trunk/reportlab/demos/odyssey/dodyssey.py
- M /reportlab/trunk/reportlab/demos/odyssey/fodyssey.py
- M /reportlab/trunk/reportlab/demos/odyssey/odyssey.py
- M /reportlab/trunk/reportlab/demos/rlzope/rlzope.py
- M /reportlab/trunk/reportlab/demos/stdfonts/stdfonts.py
- M /reportlab/trunk/reportlab/demos/tests/testdemos.py
- M /reportlab/trunk/reportlab/docs/graphguide/ch1_intro.py
- M /reportlab/trunk/reportlab/docs/graphguide/ch2_concepts.py
- M /reportlab/trunk/reportlab/docs/graphguide/ch3_shapes.py
- M /reportlab/trunk/reportlab/docs/graphguide/ch4_widgets.py
- M /reportlab/trunk/reportlab/docs/graphguide/ch5_charts.py
- M /reportlab/trunk/reportlab/docs/graphguide/gengraphguide.py
- M /reportlab/trunk/reportlab/docs/reference/genreference.py
- M /reportlab/trunk/reportlab/docs/userguide/app_demos.py
- M /reportlab/trunk/reportlab/docs/userguide/ch1_intro.py
- M /reportlab/trunk/reportlab/docs/userguide/ch2_graphics.py
- M /reportlab/trunk/reportlab/docs/userguide/ch2a_fonts.py
- M /reportlab/trunk/reportlab/docs/userguide/ch3_pdffeatures.py
- M /reportlab/trunk/reportlab/docs/userguide/ch4_platypus_concepts.py
- M /reportlab/trunk/reportlab/docs/userguide/ch5_paragraphs.py
- M /reportlab/trunk/reportlab/docs/userguide/ch6_tables.py
- M /reportlab/trunk/reportlab/docs/userguide/ch7_custom.py
- M /reportlab/trunk/reportlab/docs/userguide/ch9_future.py
- M /reportlab/trunk/reportlab/docs/userguide/genuserguide.py
- M /reportlab/trunk/reportlab/extensions/__init__.py
- M /reportlab/trunk/reportlab/graphics/__init__.py
- M /reportlab/trunk/reportlab/graphics/charts/__init__.py
- M /reportlab/trunk/reportlab/graphics/charts/areas.py
- M /reportlab/trunk/reportlab/graphics/charts/axes.py
- M /reportlab/trunk/reportlab/graphics/charts/barcharts.py
- M /reportlab/trunk/reportlab/graphics/charts/doughnut.py
- M /reportlab/trunk/reportlab/graphics/charts/legends.py
- M /reportlab/trunk/reportlab/graphics/charts/linecharts.py
- M /reportlab/trunk/reportlab/graphics/charts/lineplots.py
- M /reportlab/trunk/reportlab/graphics/charts/markers.py
- M /reportlab/trunk/reportlab/graphics/charts/piecharts.py
- M /reportlab/trunk/reportlab/graphics/charts/spider.py
- M /reportlab/trunk/reportlab/graphics/charts/textlabels.py
- M /reportlab/trunk/reportlab/graphics/charts/utils.py
- M /reportlab/trunk/reportlab/graphics/renderPDF.py
- M /reportlab/trunk/reportlab/graphics/renderPM.py
- M /reportlab/trunk/reportlab/graphics/renderPS.py
- M /reportlab/trunk/reportlab/graphics/renderbase.py
- M /reportlab/trunk/reportlab/graphics/samples/__init__.py
- M /reportlab/trunk/reportlab/graphics/shapes.py
- M /reportlab/trunk/reportlab/graphics/testdrawings.py
- M /reportlab/trunk/reportlab/graphics/testshapes.py
- M /reportlab/trunk/reportlab/graphics/widgetbase.py
- M /reportlab/trunk/reportlab/graphics/widgets/__init__.py
- M /reportlab/trunk/reportlab/graphics/widgets/eventcal.py
- M /reportlab/trunk/reportlab/graphics/widgets/flags.py
- M /reportlab/trunk/reportlab/graphics/widgets/grids.py
- M /reportlab/trunk/reportlab/graphics/widgets/markers.py
- M /reportlab/trunk/reportlab/graphics/widgets/signsandsymbols.py
- M /reportlab/trunk/reportlab/lib/__init__.py
- M /reportlab/trunk/reportlab/lib/_rl_accel.c
- M /reportlab/trunk/reportlab/lib/abag.py
- M /reportlab/trunk/reportlab/lib/attrmap.py
- M /reportlab/trunk/reportlab/lib/codecharts.py
- M /reportlab/trunk/reportlab/lib/colors.py
- M /reportlab/trunk/reportlab/lib/corp.py
- M /reportlab/trunk/reportlab/lib/enums.py
- M /reportlab/trunk/reportlab/lib/extformat.py
- M /reportlab/trunk/reportlab/lib/fonts.py
- M /reportlab/trunk/reportlab/lib/formatters.py
- M /reportlab/trunk/reportlab/lib/logger.py
- M /reportlab/trunk/reportlab/lib/pagesizes.py
- M /reportlab/trunk/reportlab/lib/randomtext.py
- M /reportlab/trunk/reportlab/lib/sequencer.py
- M /reportlab/trunk/reportlab/lib/set_ops.py
- M /reportlab/trunk/reportlab/lib/setup.py
- M /reportlab/trunk/reportlab/lib/styles.py
- M /reportlab/trunk/reportlab/lib/tocindex.py
- M /reportlab/trunk/reportlab/lib/units.py
- M /reportlab/trunk/reportlab/lib/utils.py
- M /reportlab/trunk/reportlab/lib/validators.py
- M /reportlab/trunk/reportlab/lib/yaml.py
- M /reportlab/trunk/reportlab/pdfbase/__init__.py
- M /reportlab/trunk/reportlab/pdfbase/_cidfontdata.py
- M /reportlab/trunk/reportlab/pdfbase/_fontdata.py
- M /reportlab/trunk/reportlab/pdfbase/cidfonts.py
- M /reportlab/trunk/reportlab/pdfbase/pdfdoc.py
- M /reportlab/trunk/reportlab/pdfbase/pdfmetrics.py
- M /reportlab/trunk/reportlab/pdfbase/pdfutils.py
- M /reportlab/trunk/reportlab/pdfbase/ttfonts.py
- M /reportlab/trunk/reportlab/pdfgen/__init__.py
- M /reportlab/trunk/reportlab/pdfgen/canvas.py
- M /reportlab/trunk/reportlab/pdfgen/pathobject.py
- M /reportlab/trunk/reportlab/pdfgen/pdfgeom.py
- M /reportlab/trunk/reportlab/pdfgen/pdfimages.py
- M /reportlab/trunk/reportlab/pdfgen/textobject.py
- M /reportlab/trunk/reportlab/platypus/__init__.py
- M /reportlab/trunk/reportlab/platypus/doctemplate.py
- M /reportlab/trunk/reportlab/platypus/figures.py
- M /reportlab/trunk/reportlab/platypus/flowables.py
- M /reportlab/trunk/reportlab/platypus/frames.py
- M /reportlab/trunk/reportlab/platypus/paragraph.py
- M /reportlab/trunk/reportlab/platypus/paraparser.py
- M /reportlab/trunk/reportlab/platypus/tableofcontents.py
- M /reportlab/trunk/reportlab/platypus/tables.py
- M /reportlab/trunk/reportlab/platypus/xpreformatted.py
- M /reportlab/trunk/reportlab/rl_config.py
- M /reportlab/trunk/reportlab/setup.py
- M /reportlab/trunk/reportlab/test/__init__.py
- M /reportlab/trunk/reportlab/test/runAll.py
- M /reportlab/trunk/reportlab/test/test_charts_textlabels.py
- M /reportlab/trunk/reportlab/test/test_docstrings.py
- M /reportlab/trunk/reportlab/test/test_graphics_charts.py
- M /reportlab/trunk/reportlab/test/test_graphics_images.py
- M /reportlab/trunk/reportlab/test/test_graphics_layout.py
- M /reportlab/trunk/reportlab/test/test_graphics_speed.py
- M /reportlab/trunk/reportlab/test/test_hello.py
- M /reportlab/trunk/reportlab/test/test_images.py
- M /reportlab/trunk/reportlab/test/test_invariant.py
- M /reportlab/trunk/reportlab/test/test_lib_colors.py
- M /reportlab/trunk/reportlab/test/test_lib_sequencer.py
- M /reportlab/trunk/reportlab/test/test_multibyte_chs.py
- M /reportlab/trunk/reportlab/test/test_multibyte_cht.py
- M /reportlab/trunk/reportlab/test/test_multibyte_jpn.py
- M /reportlab/trunk/reportlab/test/test_paragraphs.py
- M /reportlab/trunk/reportlab/test/test_pdfbase_pdfmetrics.py
- M /reportlab/trunk/reportlab/test/test_pdfbase_pdfutils.py
- M /reportlab/trunk/reportlab/test/test_pdfbase_postscript.py
- M /reportlab/trunk/reportlab/test/test_pdfgen_callback.py
- M /reportlab/trunk/reportlab/test/test_pdfgen_general.py
- M /reportlab/trunk/reportlab/test/test_pdfgen_links.py
- M /reportlab/trunk/reportlab/test/test_pdfgen_pagemodes.py
- M /reportlab/trunk/reportlab/test/test_pdfgen_pycanvas.py
- M /reportlab/trunk/reportlab/test/test_platypus_breaking.py
- M /reportlab/trunk/reportlab/test/test_platypus_general.py
- M /reportlab/trunk/reportlab/test/test_platypus_indents.py
- M /reportlab/trunk/reportlab/test/test_platypus_paragraphs.py
- M /reportlab/trunk/reportlab/test/test_platypus_paraparser.py
- M /reportlab/trunk/reportlab/test/test_platypus_tables.py
- M /reportlab/trunk/reportlab/test/test_platypus_toc.py
- M /reportlab/trunk/reportlab/test/test_platypus_xref.py
- M /reportlab/trunk/reportlab/test/test_pyfiles.py
- M /reportlab/trunk/reportlab/test/test_source_chars.py
- M /reportlab/trunk/reportlab/test/test_widgetbase_tpc.py
- M /reportlab/trunk/reportlab/tools/__init__.py
- M /reportlab/trunk/reportlab/tools/docco/__init__.py
- M /reportlab/trunk/reportlab/tools/docco/codegrab.py
- M /reportlab/trunk/reportlab/tools/docco/docpy.py
- M /reportlab/trunk/reportlab/tools/docco/examples.py
- M /reportlab/trunk/reportlab/tools/docco/graphdocpy.py
- M /reportlab/trunk/reportlab/tools/docco/rl_doc_utils.py
- M /reportlab/trunk/reportlab/tools/docco/rltemplate.py
- M /reportlab/trunk/reportlab/tools/docco/stylesheet.py
- M /reportlab/trunk/reportlab/tools/docco/t_parse.py
- M /reportlab/trunk/reportlab/tools/docco/yaml.py
- M /reportlab/trunk/reportlab/tools/docco/yaml2pdf.py
- M /reportlab/trunk/reportlab/tools/py2pdf/__init__.py
- M /reportlab/trunk/reportlab/tools/py2pdf/idle_print.py
- M /reportlab/trunk/reportlab/tools/pythonpoint/__init__.py
- M /reportlab/trunk/reportlab/tools/pythonpoint/customshapes.py
- M /reportlab/trunk/reportlab/tools/pythonpoint/styles/__init__.py
- M /reportlab/trunk/reportlab/tools/pythonpoint/styles/horrible.py
- M /reportlab/trunk/reportlab/tools/pythonpoint/styles/modern.py
- Remove $Header:, fix CopyRight & history
-r2384 | mike | 2004-06-17 15:50:51 +0100 (Thu, 17 Jun 2004)
- M /reportlab/trunk/reportlab/test/test_pdfgen_links.py
- Change back to native eol to fix line endings
-r2383 | mike | 2004-06-17 15:44:11 +0100 (Thu, 17 Jun 2004)
- M /reportlab/trunk/reportlab/test/test_pdfgen_links.py
- Temporary change to binary to fix line endings
-r2382 | rgbecker | 2004-06-17 15:23:21 +0100 (Thu, 17 Jun 2004)
- M /reportlab/trunk/reportlab/test/test_pdfgen_links.py
- Attempt to fix lineendings
-r2381 | rgbecker | 2004-06-17 13:01:26 +0100 (Thu, 17 Jun 2004)
- M /reportlab/trunk/reportlab/pdfbase/pdfmetrics.py
- M /reportlab/trunk/reportlab/pdfgen/canvas.py
- Fix encoding for zap & symbol
-r2380 | rgbecker | 2004-06-16 12:45:56 +0100 (Wed, 16 Jun 2004)
- M /reportlab/trunk/reportlab/lib/utils.py
- Forgot to check the exactly equal case for _startswith_rl
-r2379 | rgbecker | 2004-06-15 14:10:37 +0100 (Tue, 15 Jun 2004)
- M /reportlab/trunk/reportlab/pdfbase/ttfonts.py
- M /reportlab/trunk/reportlab/pdfgen/textobject.py
- Moved encoding checks into splitString
-r2378 | rgbecker | 2004-06-15 12:34:47 +0100 (Tue, 15 Jun 2004)
- M /reportlab/trunk/reportlab/test/test_platypus_paraparser.py
- Fix properties and possibly line-endings
-r2377 | rgbecker | 2004-06-15 11:33:32 +0100 (Tue, 15 Jun 2004)
- M /reportlab/trunk/reportlab/graphics/charts/axes.py
- remove use of False (invalid in 2.2)
-r2376 | andy | 2004-06-14 23:13:04 +0100 (Mon, 14 Jun 2004)
- M /reportlab/trunk/reportlab/pdfbase/ttfonts.py
- fixed widths bug for tt fonts
-r2375 | rgbecker | 2004-06-14 18:51:15 +0100 (Mon, 14 Jun 2004)
- M /reportlab/trunk/reportlab/graphics/charts/axes.py
-r2374 | andy | 2004-06-14 17:41:25 +0100 (Mon, 14 Jun 2004)
- M /reportlab/trunk/reportlab/graphics/renderPDF.py
- M /reportlab/trunk/reportlab/graphics/shapes.py
- M /reportlab/trunk/reportlab/lib/validators.py
- M /reportlab/trunk/reportlab/pdfbase/pdfmetrics.py
- M /reportlab/trunk/reportlab/pdfbase/ttfonts.py
- M /reportlab/trunk/reportlab/pdfgen/canvas.py
- M /reportlab/trunk/reportlab/pdfgen/textobject.py
- M /reportlab/trunk/reportlab/platypus/flowables.py
- M /reportlab/trunk/reportlab/platypus/paragraph.py
- M /reportlab/trunk/reportlab/platypus/paraparser.py
- M /reportlab/trunk/reportlab/test/test_pdfbase_encodings.py
- A /reportlab/trunk/reportlab/test/test_platypus_paraparser.py
- Unicode and UTF8 support changes
-r2373 | rgbecker | 2004-06-14 17:29:04 +0100 (Mon, 14 Jun 2004)
- M /reportlab/trunk/reportlab/pdfgen/canvas.py
- Fix import of logger
-r2372 | mike | 2004-06-11 18:11:22 +0100 (Fri, 11 Jun 2004)
- M /reportlab/trunk/reportlab/test/test_pdfbase_encodings.py
- Added more accurate checking of UTF8 output
-r2371 | mike | 2004-06-11 17:15:45 +0100 (Fri, 11 Jun 2004)
- M /reportlab/trunk/reportlab/test/test_pdfbase_encodings.py
- Made some corrections and got all TextEncodingTestCase tests working
-r2370 | mike | 2004-06-11 16:25:50 +0100 (Fri, 11 Jun 2004)
- M /reportlab/trunk/reportlab/pdfgen/canvas.py
- M /reportlab/trunk/reportlab/pdfgen/textobject.py
- Added support for mac_roman encoding and changed to always convert unicode strings to font encoding
-r2369 | robin | 2004-06-11 11:17:18 +0100 (Fri, 11 Jun 2004)
- M /reportlab/trunk/reportlab/pdfgen/canvas.py
- M /reportlab/trunk/reportlab/test/test_pdfbase_encodings.py
- Early 2.x has no UnicodeDecodeError and no ''.decode
-r2368 | andy_robinson | 2004-06-10 01:43:21 +0100 (Thu, 10 Jun 2004)
- M /reportlab/trunk/reportlab/pdfgen/canvas.py
- M /reportlab/trunk/reportlab/pdfgen/textobject.py
- M /reportlab/trunk/reportlab/test/test_pdfbase_encodings.py
- M /reportlab/trunk/reportlab/test/test_pdfgen_general.py
- Now has runnable encoding-conversion
-r2367 | rgbecker | 2004-06-07 17:30:37 +0100 (Mon, 07 Jun 2004)
- M /reportlab/trunk/reportlab/platypus/tables.py
- Add xpre example
-r2366 | rgbecker | 2004-06-03 12:26:44 +0100 (Thu, 03 Jun 2004)
- M /reportlab/trunk/reportlab/lib/utils.py
- Another rework of the open for read code
-r2365 | rgbecker | 2004-06-03 11:38:25 +0100 (Thu, 03 Jun 2004)
- M /reportlab/trunk/reportlab/test/test_platypus_general.py
- Attempt to fix the file: form
-r2364 | andy_robinson | 2004-05-29 00:41:18 +0100 (Sat, 29 May 2004)
- M /reportlab/trunk/reportlab/pdfgen/canvas.py
- M /reportlab/trunk/reportlab/pdfgen/textobject.py
- M /reportlab/trunk/reportlab/platypus/figures.py
- M /reportlab/trunk/reportlab/rl_config.py
- M /reportlab/trunk/reportlab/tools/pythonpoint/pythonpoint.dtd
- M /reportlab/trunk/reportlab/tools/pythonpoint/pythonpoint.py
- M /reportlab/trunk/reportlab/tools/pythonpoint/stdparser.py
- Prelim support for unicode conversion (disabled by
- rl_config.autoConvertEncodings at first);
- borders to drawings in pythonpoint and for figure
- objects;
-r2363 | rgbecker | 2004-05-28 15:39:42 +0100 (Fri, 28 May 2004)
- M /reportlab/trunk/reportlab/test/test_platypus_general.py
- Attempt to test http urls for images
-r2362 | rgbecker | 2004-05-28 15:04:25 +0100 (Fri, 28 May 2004)
- M /reportlab/trunk/reportlab/lib/utils.py
- Attempt to fix open_for_read again
-r2361 | rgbecker | 2004-05-28 15:02:14 +0100 (Fri, 28 May 2004)
- M /reportlab/trunk/reportlab/test/test_lib_utils.py
- Added open_and_read tests
-r2360 | rgbecker | 2004-05-26 19:44:55 +0100 (Wed, 26 May 2004)
- M /reportlab/trunk/reportlab/lib/utils.py
- More compact distro changes
-r2359 | jjlee | 2004-05-26 10:37:07 +0100 (Wed, 26 May 2004)
- M /reportlab/trunk/reportlab/graphics/charts/lineplots.py
- M /reportlab/trunk/reportlab/graphics/shapes.py
- Make a couple of files emacs font-lock friendly
-r2358 | rgbecker | 2004-05-25 22:12:31 +0100 (Tue, 25 May 2004)
- M /reportlab/trunk/reportlab/lib/utils.py
- Use more advanced __loader__ friendly code
-r2357 | rgbecker | 2004-05-25 17:33:56 +0100 (Tue, 25 May 2004)
- M /reportlab/trunk/reportlab/docs/reference/genreference.py
- Fix missing module
-r2356 | rgbecker | 2004-05-24 13:19:53 +0100 (Mon, 24 May 2004)
- M /reportlab/trunk/reportlab/lib/_rl_accel.c
- Attempt to fix 1.5 problems
-r2355 | rgbecker | 2004-05-23 11:39:30 +0100 (Sun, 23 May 2004)
- M /reportlab/trunk/reportlab/lib/utils.py
- rl_get_module now seems to work as intended
-r2354 | rgbecker | 2004-05-23 10:27:52 +0100 (Sun, 23 May 2004)
- M /reportlab/trunk/reportlab/lib/utils.py
- rl_get_module added
-r2353 | rgbecker | 2004-05-20 11:10:27 +0100 (Thu, 20 May 2004)
- M /reportlab/trunk/reportlab/lib/utils.py
- Attempt to robustify the memo
-r2352 | rgbecker | 2004-05-18 18:16:55 +0100 (Tue, 18 May 2004)
- M /reportlab/trunk/reportlab/platypus/tables.py
- Fix proposed by Derik Barclay
-r2351 | rgbecker | 2004-05-08 18:19:54 +0100 (Sat, 08 May 2004)
- M /reportlab/trunk/reportlab/tools/docco/docpy.py
- M /reportlab/trunk/reportlab/tools/docco/graphdocpy.py
- D /reportlab/trunk/reportlab/tools/docco/inspect.py
- Removed private version of inspect
-r2350 | rgbecker | 2004-05-07 17:56:29 +0100 (Fri, 07 May 2004)
- M /reportlab/trunk/reportlab/lib/utils.py
- Added some more stuff and script name to DebugMemo output
-r2349 | rgbecker | 2004-05-07 16:28:33 +0100 (Fri, 07 May 2004)
- M /reportlab/trunk/reportlab/lib/utils.py
- Added capture_traceback=1 to DebugMemo init
-r2348 | rgbecker | 2004-05-03 09:13:37 +0100 (Mon, 03 May 2004)
- M /reportlab/trunk/reportlab/graphics/widgets/grids.py
- Make stripe strokeColor same as fill
-r2347 | rgbecker | 2004-05-03 09:11:48 +0100 (Mon, 03 May 2004)
- M /reportlab/trunk/reportlab/test/test_docstrings.py
- Minor changes
-r2346 | rgbecker | 2004-05-03 09:09:52 +0100 (Mon, 03 May 2004)
- M /reportlab/trunk/reportlab/lib/_rl_accel.c
- Fix flagged and penalty values
-r2345 | rgbecker | 2004-04-28 16:27:31 +0100 (Wed, 28 Apr 2004)
- M /reportlab/trunk/reportlab/tools/docco/graphdocpy.py
- Move to using inspect for getsource (actually works)
-r2344 | rgbecker | 2004-04-28 15:41:56 +0100 (Wed, 28 Apr 2004)
- M /reportlab/trunk/reportlab/tools/docco/rl_doc_utils.py
- Added setStory
-r2343 | rgbecker | 2004-04-28 15:40:21 +0100 (Wed, 28 Apr 2004)
- M /reportlab/trunk/reportlab/docs/graphguide/gengraphguide.py
- M /reportlab/trunk/reportlab/docs/reference/genreference.py
- M /reportlab/trunk/reportlab/docs/userguide/ch1_intro.py
- M /reportlab/trunk/reportlab/docs/userguide/ch2a_fonts.py
- M /reportlab/trunk/reportlab/docs/userguide/ch6_tables.py
- M /reportlab/trunk/reportlab/docs/userguide/genuserguide.py
- Fixing up to not use folder relative import
-r2342 | rgbecker | 2004-04-22 18:36:41 +0100 (Thu, 22 Apr 2004)
- M /reportlab/trunk/reportlab/platypus/tables.py
- Attempt to fix the Mike Spanning example
-r2341 | rgbecker | 2004-04-21 17:39:36 +0100 (Wed, 21 Apr 2004)
- M /reportlab/trunk/reportlab/platypus/tables.py
- Added Mike's counter span example
-r2340 | rgbecker | 2004-04-14 14:10:51 +0100 (Wed, 14 Apr 2004)
- M /reportlab/trunk/reportlab/graphics/shapes.py
- Fix problem with empty charts
-r2339 | rgbecker | 2004-04-08 17:02:52 +0100 (Thu, 08 Apr 2004)
- M /reportlab/trunk/reportlab/lib/_rl_accel.c
- remove Box stuff prior to 2.3
-r2338 | rgbecker | 2004-04-08 15:17:42 +0100 (Thu, 08 Apr 2004)
- M /reportlab/trunk/reportlab/lib/_rl_accel.c
- removed PyDoc_STR for now; changed to do hex version checks
-r2337 | rgbecker | 2004-04-05 19:07:42 +0100 (Mon, 05 Apr 2004)
- M /reportlab/trunk/reportlab/platypus/flowables.py
- M /reportlab/trunk/reportlab/platypus/tables.py
- Minor changes
-r2336 | rgbecker | 2004-04-05 15:17:29 +0100 (Mon, 05 Apr 2004)
- M /reportlab/trunk/reportlab/pdfbase/ttfonts.py
- Another attempt to fix up wanrings
-r2335 | rgbecker | 2004-04-05 13:59:56 +0100 (Mon, 05 Apr 2004)
- M /reportlab/trunk/reportlab/lib/_rl_accel.c
- Forgot to bump the version
-r2334 | rgbecker | 2004-04-05 08:47:18 +0100 (Mon, 05 Apr 2004)
- M /reportlab/trunk/reportlab/lib/_rl_accel.c
- Added in BoxList, removed AttrDict
-r2333 | rgbecker | 2004-04-01 18:00:33 +0100 (Thu, 01 Apr 2004)
- M /reportlab/trunk/reportlab/lib/extformat.py
- Added header lines
-r2332 | rgbecker | 2004-04-01 17:59:22 +0100 (Thu, 01 Apr 2004)
- M /reportlab/trunk/reportlab/lib/utils.py
- Added get_rl_tempfile
-r2331 | rgbecker | 2004-04-01 17:58:02 +0100 (Thu, 01 Apr 2004)
- A /reportlab/trunk/reportlab/lib/extformat.py
- Added for better formatting
-r2330 | rgbecker | 2004-04-01 12:17:02 +0100 (Thu, 01 Apr 2004)
- M /reportlab/trunk/reportlab/platypus/tables.py
- Ensure _colWidths is defined
-r2329 | rgbecker | 2004-03-30 15:58:35 +0100 (Tue, 30 Mar 2004)
- M /reportlab/trunk/reportlab/platypus/flowables.py
- Added HRFlowable
-r2328 | rgbecker | 2004-03-27 09:42:24 +0000 (Sat, 27 Mar 2004)
- M /reportlab/trunk/reportlab/test/runAll.py
- Indicate output folder
-r2327 | rgbecker | 2004-03-27 09:41:37 +0000 (Sat, 27 Mar 2004)
- M /reportlab/trunk/reportlab/pdfbase/pdfdoc.py
- Ensure external mask gets through in a85 cases
-r2326 | rgbecker | 2004-03-26 21:34:03 +0000 (Fri, 26 Mar 2004)
- M /reportlab/trunk/reportlab/pdfbase/pdfdoc.py
- M /reportlab/trunk/reportlab/pdfbase/pdfutils.py
- Fix bug introduced during transparency/ImageReader changes
-r2325 | rgbecker | 2004-03-26 16:54:37 +0000 (Fri, 26 Mar 2004)
- M /reportlab/trunk/reportlab/test/test_tools_pythonpoint.py
- Fix buglet in compact testing
-r2324 | rgbecker | 2004-03-26 15:44:24 +0000 (Fri, 26 Mar 2004)
- M /reportlab/trunk/reportlab/platypus/tables.py
- Added percentages
-r2323 | rgbecker | 2004-03-26 14:27:24 +0000 (Fri, 26 Mar 2004)
- M /reportlab/trunk/reportlab/test/test_pyfiles.py
- Move to having all test output in a temp folder
-r2322 | rgbecker | 2004-03-26 14:26:50 +0000 (Fri, 26 Mar 2004)
- M /reportlab/trunk/reportlab/test/runAll.py
- Add test_*.txt cleanup
-r2321 | rgbecker | 2004-03-26 14:20:44 +0000 (Fri, 26 Mar 2004)
- M /reportlab/trunk/reportlab/test/runAll.py
- M /reportlab/trunk/reportlab/test/test_charts_textlabels.py
- M /reportlab/trunk/reportlab/test/test_docstrings.py
- M /reportlab/trunk/reportlab/test/test_graphics_charts.py
- M /reportlab/trunk/reportlab/test/test_graphics_images.py
- M /reportlab/trunk/reportlab/test/test_graphics_speed.py
- M /reportlab/trunk/reportlab/test/test_hello.py
- M /reportlab/trunk/reportlab/test/test_invariant.py
- M /reportlab/trunk/reportlab/test/test_lib_colors.py
- M /reportlab/trunk/reportlab/test/test_multibyte_chs.py
- M /reportlab/trunk/reportlab/test/test_multibyte_cht.py
- M /reportlab/trunk/reportlab/test/test_multibyte_jpn.py
- M /reportlab/trunk/reportlab/test/test_multibyte_kor.py
- M /reportlab/trunk/reportlab/test/test_paragraphs.py
- M /reportlab/trunk/reportlab/test/test_pdfbase_encodings.py
- M /reportlab/trunk/reportlab/test/test_pdfbase_fontembed.py
- M /reportlab/trunk/reportlab/test/test_pdfbase_pdfmetrics.py
- M /reportlab/trunk/reportlab/test/test_pdfbase_postscript.py
- M /reportlab/trunk/reportlab/test/test_pdfbase_ttfonts.py
- M /reportlab/trunk/reportlab/test/test_pdfgen_callback.py
- M /reportlab/trunk/reportlab/test/test_pdfgen_general.py
- M /reportlab/trunk/reportlab/test/test_pdfgen_links.py
- M /reportlab/trunk/reportlab/test/test_pdfgen_pagemodes.py
- M /reportlab/trunk/reportlab/test/test_pdfgen_pycanvas.py
- M /reportlab/trunk/reportlab/test/test_platypus_breaking.py
- M /reportlab/trunk/reportlab/test/test_platypus_general.py
- M /reportlab/trunk/reportlab/test/test_platypus_indents.py
- M /reportlab/trunk/reportlab/test/test_platypus_paragraphs.py
- M /reportlab/trunk/reportlab/test/test_platypus_tables.py
- M /reportlab/trunk/reportlab/test/test_platypus_toc.py
- M /reportlab/trunk/reportlab/test/test_platypus_xref.py
- M /reportlab/trunk/reportlab/test/test_renderSVG.py
- M /reportlab/trunk/reportlab/test/test_source_chars.py
- M /reportlab/trunk/reportlab/test/test_table_layout.py
- M /reportlab/trunk/reportlab/test/test_tools_pythonpoint.py
- M /reportlab/trunk/reportlab/test/test_widgets_grids.py
- M /reportlab/trunk/reportlab/test/utils.py
- Move to having all test output in a temp folder
-r2320 | rgbecker | 2004-03-26 11:37:09 +0000 (Fri, 26 Mar 2004)
- M /reportlab/trunk/reportlab/test/test_platypus_indents.py
- M /reportlab/trunk/reportlab/test/test_platypus_paragraphs.py
- M /reportlab/trunk/reportlab/test/test_widgetbase_tpc.py
- Remove unwanted import
-r2319 | rgbecker | 2004-03-26 11:34:11 +0000 (Fri, 26 Mar 2004)
- M /reportlab/trunk/reportlab/test/test_charts_textlabels.py
- M /reportlab/trunk/reportlab/test/test_graphics_charts.py
- M /reportlab/trunk/reportlab/test/test_lib_utils.py
- M /reportlab/trunk/reportlab/test/test_platypus_toc.py
- Eliminate bad tempdir setting
-r2318 | rgbecker | 2004-03-26 10:48:43 +0000 (Fri, 26 Mar 2004)
- M /reportlab/trunk/rl_addons/pyRXP/pyRXP.c
- Fix up bug introduced with new CB API
-r2317 | rgbecker | 2004-03-24 17:17:05 +0000 (Wed, 24 Mar 2004)
- M /reportlab/trunk/reportlab/tools/pythonpoint/pythonpoint.py
- Add eoCB for compactdistro
-r2316 | rgbecker | 2004-03-24 17:16:22 +0000 (Wed, 24 Mar 2004)
- M /reportlab/trunk/reportlab/test/test_tools_pythonpoint.py
- Fix test_tools_pythonpoint for compact distro
-r2315 | rgbecker | 2004-03-24 17:14:53 +0000 (Wed, 24 Mar 2004)
- M /reportlab/trunk/rl_addons/pyRXP/pyRXP.c
- Allow eoCB to return (URI,contents) for compact distro
-r2314 | rgbecker | 2004-03-24 14:04:51 +0000 (Wed, 24 Mar 2004)
- M /reportlab/trunk/reportlab/pdfbase/cidfonts.py
- Switch to using get_rl_tempdir
-r2313 | rgbecker | 2004-03-24 14:03:31 +0000 (Wed, 24 Mar 2004)
- M /reportlab/trunk/reportlab/lib/utils.py
- Added get_rl_tempdir
-r2312 | rgbecker | 2004-03-24 09:42:22 +0000 (Wed, 24 Mar 2004)
- M /reportlab/trunk/reportlab/lib/utils.py
- True/False aren't defined for Python < 2.3
-r2311 | rgbecker | 2004-03-23 18:57:33 +0000 (Tue, 23 Mar 2004)
- M /reportlab/trunk/reportlab/lib/utils.py
- M /reportlab/trunk/reportlab/test/utils.py
- Remove things that python 2.1 fails on
-r2310 | rgbecker | 2004-03-23 17:35:42 +0000 (Tue, 23 Mar 2004)
- M /reportlab/trunk/reportlab/pdfbase/pdfmetrics.py
- Compact distro friendly
-r2309 | rgbecker | 2004-03-23 17:34:11 +0000 (Tue, 23 Mar 2004)
- M /reportlab/trunk/reportlab/lib/utils.py
- Added rl_glob
-r2308 | rgbecker | 2004-03-23 17:32:20 +0000 (Tue, 23 Mar 2004)
- M /reportlab/trunk/reportlab/rl_config.py
- Use rl_isdir
-r2307 | rgbecker | 2004-03-23 16:18:29 +0000 (Tue, 23 Mar 2004)
- M /reportlab/trunk/reportlab/pdfbase/ttfonts.py
- Now works in compact distro
-r2306 | rgbecker | 2004-03-23 15:43:13 +0000 (Tue, 23 Mar 2004)
- M /reportlab/trunk/reportlab/test/test_invariant.py
- Now works in compact distro
-r2305 | rgbecker | 2004-03-23 15:37:53 +0000 (Tue, 23 Mar 2004)
- M /reportlab/trunk/reportlab/test/test_pdfgen_general.py
- Fix for compact distro
-r2304 | rgbecker | 2004-03-23 15:20:50 +0000 (Tue, 23 Mar 2004)
- M /reportlab/trunk/reportlab/lib/utils.py
- We prefer absolute RL DIR
-r2303 | rgbecker | 2004-03-23 15:19:21 +0000 (Tue, 23 Mar 2004)
- M /reportlab/trunk/reportlab/test/test_platypus_paragraphs.py
- Now works in compact distro
-r2302 | rgbecker | 2004-03-23 15:18:34 +0000 (Tue, 23 Mar 2004)
- M /reportlab/trunk/reportlab/test/utils.py
- Switch to using rl_isdir
-r2301 | rgbecker | 2004-03-23 14:46:35 +0000 (Tue, 23 Mar 2004)
- M /reportlab/trunk/reportlab/test/runAll.py
- Allow specifying the pattern
-r2300 | rgbecker | 2004-03-23 14:30:01 +0000 (Tue, 23 Mar 2004)
- M /reportlab/trunk/reportlab/lib/utils.py
- Added open_and_readlines
-r2299 | rgbecker | 2004-03-23 14:28:47 +0000 (Tue, 23 Mar 2004)
- M /reportlab/trunk/reportlab/test/test_lib_utils.py
- M /reportlab/trunk/reportlab/test/test_pyfiles.py
- Fix up for compact distro
-r2298 | rgbecker | 2004-03-23 14:15:47 +0000 (Tue, 23 Mar 2004)
- M /reportlab/trunk/reportlab/test/test_source_chars.py
- Fix up for compact distro (leave Zapping alone)
-r2297 | rgbecker | 2004-03-23 13:54:42 +0000 (Tue, 23 Mar 2004)
- M /reportlab/trunk/reportlab/lib/utils.py
- Improvements for compact running
-r2296 | rgbecker | 2004-03-23 13:50:40 +0000 (Tue, 23 Mar 2004)
- M /reportlab/trunk/reportlab/test/test_platypus_general.py
- Ensure runnable in compact distro
-r2295 | rgbecker | 2004-03-23 12:55:44 +0000 (Tue, 23 Mar 2004)
- M /reportlab/trunk/reportlab/test/test_lib_utils.py
- Allow to run in a compact distro
-r2294 | rgbecker | 2004-03-23 12:20:08 +0000 (Tue, 23 Mar 2004)
- M /reportlab/trunk/reportlab/platypus/flowables.py
- Make Image to use open_for_read
-r2293 | rgbecker | 2004-03-22 18:09:51 +0000 (Mon, 22 Mar 2004)
- M /reportlab/trunk/reportlab/lib/utils.py
- Added rl_isfile
-r2292 | rgbecker | 2004-03-22 18:08:50 +0000 (Mon, 22 Mar 2004)
- M /reportlab/trunk/reportlab/test/runAll.py
- M /reportlab/trunk/reportlab/test/test_images.py
- M /reportlab/trunk/reportlab/test/test_pdfgen_pycanvas.py
- M /reportlab/trunk/reportlab/test/test_platypus_general.py
- Small changes to make tests work compactly
-r2291 | rgbecker | 2004-03-22 15:59:22 +0000 (Mon, 22 Mar 2004)
- M /reportlab/trunk/reportlab/test/utils.py
- Remove spurious print
-r2290 | rgbecker | 2004-03-22 14:06:12 +0000 (Mon, 22 Mar 2004)
- M /reportlab/trunk/reportlab/platypus/flowables.py
- Fix up more Image cases
-r2289 | rgbecker | 2004-03-22 14:01:09 +0000 (Mon, 22 Mar 2004)
- M /reportlab/trunk/reportlab/test/test_platypus_general.py
- Add new Image flowable exemplars
-r2288 | rgbecker | 2004-03-22 13:21:06 +0000 (Mon, 22 Mar 2004)
- M /reportlab/trunk/reportlab/test/runAll.py
- M /reportlab/trunk/reportlab/test/test_pyfiles.py
- M /reportlab/trunk/reportlab/test/utils.py
- Minor changes preparing for zip comapct distros
-r2287 | rgbecker | 2004-03-22 13:02:43 +0000 (Mon, 22 Mar 2004)
- M /reportlab/trunk/reportlab/pdfbase/pdfdoc.py
- Get the right fp
-r2286 | rgbecker | 2004-03-22 12:54:30 +0000 (Mon, 22 Mar 2004)
- M /reportlab/trunk/reportlab/pdfbase/pdfdoc.py
- Attempt to fix the epc bug
-r2285 | andy_robinson | 2004-03-19 22:18:37 +0000 (Fri, 19 Mar 2004)
- M /reportlab/trunk/reportlab/docs/userguide/ch4_platypus_concepts.py
- Documentation about hAlign
-r2284 | rgbecker | 2004-03-19 18:00:56 +0000 (Fri, 19 Mar 2004)
- M /reportlab/trunk/reportlab/lib/utils.py
- First attempt at reading from the zip archive
-r2283 | rgbecker | 2004-03-19 10:55:55 +0000 (Fri, 19 Mar 2004)
- M /reportlab/trunk/reportlab/rl_config.py
- Sys_version was being used in older python
-r2282 | rgbecker | 2004-03-18 15:55:50 +0000 (Thu, 18 Mar 2004)
- M /reportlab/trunk/reportlab/lib/utils.py
- M /reportlab/trunk/reportlab/pdfbase/pdfdoc.py
- M /reportlab/trunk/reportlab/pdfbase/pdfutils.py
- M /reportlab/trunk/reportlab/pdfgen/canvas.py
- M /reportlab/trunk/reportlab/pdfgen/pdfimages.py
- Fix transparency & jpeg behaviour
-r2281 | rgbecker | 2004-03-18 12:05:22 +0000 (Thu, 18 Mar 2004)
- M /reportlab/trunk/reportlab/pdfgen/textobject.py
- TextObject fixes from Ian Millington
-r2280 | rgbecker | 2004-03-17 18:54:06 +0000 (Wed, 17 Mar 2004)
- M /reportlab/trunk/reportlab/lib/utils.py
- Move ImageReader open wrapper to where it should be
-r2279 | rgbecker | 2004-03-17 16:29:30 +0000 (Wed, 17 Mar 2004)
- M /reportlab/trunk/reportlab/demos/rlzope/rlzope.py
- Attempt to fix to match ImageReader
-r2278 | rgbecker | 2004-03-17 14:35:51 +0000 (Wed, 17 Mar 2004)
- M /reportlab/trunk/reportlab/lib/utils.py
- Improve the fs distro check
-r2277 | rgbecker | 2004-03-17 14:34:41 +0000 (Wed, 17 Mar 2004)
- M /reportlab/trunk/reportlab/rl_config.py
- Added rlhome/../fonts
-r2276 | rgbecker | 2004-03-17 00:21:39 +0000 (Wed, 17 Mar 2004)
- M /reportlab/trunk/reportlab/pdfgen/pdfimages.py
- Remove spurious print reported by Joel Pearson
-r2275 | rgbecker | 2004-03-16 15:28:26 +0000 (Tue, 16 Mar 2004)
- M /reportlab/trunk/rl_addons/pyRXP/pyRXP.c
- Fix BOM removal buglet & valid/ext-sa/014
-r2274 | andy_robinson | 2004-03-15 23:49:48 +0000 (Mon, 15 Mar 2004)
- M /reportlab/trunk/reportlab/platypus/tables.py
- corrected erroneous comment
-r2273 | rgbecker | 2004-03-14 09:47:14 +0000 (Sun, 14 Mar 2004)
- M /reportlab/trunk/reportlab/platypus/tables.py
- Slightly more efficient linedrawing
-r2272 | andy_robinson | 2004-03-12 23:54:11 +0000 (Fri, 12 Mar 2004)
- M /reportlab/trunk/reportlab/lib/corp.py
- M /reportlab/trunk/reportlab/pdfgen/canvas.py
- M /reportlab/trunk/reportlab/platypus/tables.py
- M /reportlab/trunk/reportlab/test/test_pdfgen_general.py
- Multiple lines and decimal alignments now supported
-r2271 | rgbecker | 2004-03-11 10:57:59 +0000 (Thu, 11 Mar 2004)
- M /reportlab/trunk/utils/README
- Fix missing command instruction
-r2270 | andy_robinson | 2004-03-09 23:24:34 +0000 (Tue, 09 Mar 2004)
- M /reportlab/trunk/reportlab/pdfbase/pdfmetrics.py
- M /reportlab/trunk/reportlab/pdfbase/ttfonts.py
- M /reportlab/trunk/reportlab/pdfgen/textobject.py
- Truetype fonts now convert latin-1 to utf8 if fed non-utf8
-r2269 | andy_robinson | 2004-03-09 22:22:26 +0000 (Tue, 09 Mar 2004)
- M /reportlab/trunk/reportlab/__init__.py
- M /reportlab/trunk/reportlab/lib/fonts.py
- M /reportlab/trunk/reportlab/pdfbase/_fontdata.py
- M /reportlab/trunk/reportlab/pdfbase/pdfmetrics.py
- M /reportlab/trunk/reportlab/pdfbase/ttfonts.py
- M /reportlab/trunk/reportlab/platypus/doctemplate.py
- Font reregistration cleanup
-r2268 | rgbecker | 2004-03-08 18:36:05 +0000 (Mon, 08 Mar 2004)
- M /reportlab/trunk/reportlab/lib/utils.py
- Added _findFiles & CIDict
-r2267 | rgbecker | 2004-02-22 17:35:43 +0000 (Sun, 22 Feb 2004)
- M /reportlab/trunk/reportlab/graphics/renderPM.py
- URL change from Aleksander Piotrowski
-r2266 | rgbecker | 2004-02-17 16:10:18 +0000 (Tue, 17 Feb 2004)
- M /reportlab/trunk/reportlab/platypus/frames.py
- M /reportlab/trunk/reportlab/rl_config.py
- Added overlapAttachedSpace
-r2265 | andy_robinson | 2004-02-10 00:12:21 +0000 (Tue, 10 Feb 2004)
- M /reportlab/trunk/reportlab/pdfgen/canvas.py
- M /reportlab/trunk/reportlab/test/test_pdfbase_postscript.py
- Added finegrained control of where postscript commands appear
-r2264 | rgbecker | 2004-02-05 18:31:35 +0000 (Thu, 05 Feb 2004)
- M /reportlab/trunk/reportlab/platypus/paragraph.py
- Fix to from Ulrich Screiner
-r2263 | rgbecker | 2004-02-05 18:21:50 +0000 (Thu, 05 Feb 2004)
- M /reportlab/trunk/reportlab/pdfgen/pdfimages.py
- Fix missing import found by Ulrich Schreiner
-r2262 | rgbecker | 2004-02-02 08:43:51 +0000 (Mon, 02 Feb 2004)
- M /reportlab/trunk/reportlab/lib/_rl_accel.c
- Start on tex lib in C
-r2261 | rgbecker | 2004-01-29 17:06:24 +0000 (Thu, 29 Jan 2004)
- M /reportlab/trunk/reportlab/graphics/renderPS.py
- Attempt to get delayed font setting and proper psNames
-r2260 | rgbecker | 2004-01-28 13:03:47 +0000 (Wed, 28 Jan 2004)
- M /reportlab/trunk/reportlab/graphics/testshapes.py
- Allow for bad fonts in getDrawing13
-r2259 | rgbecker | 2004-01-28 13:03:19 +0000 (Wed, 28 Jan 2004)
- M /reportlab/trunk/reportlab/graphics/renderPM.py
- Allow for no eps preview in tests
-r2258 | rgbecker | 2004-01-23 00:04:40 +0000 (Fri, 23 Jan 2004)
- M /reportlab/trunk/rl_addons/pyRXP/rxp/url.c
- Attempt to fix UNC opening
-r2257 | rgbecker | 2004-01-21 18:04:05 +0000 (Wed, 21 Jan 2004)
- M /reportlab/trunk/utils/README
-#################################################################################
-#################### RELEASE 1.19 at 18:00 GMT 21/Jan/2004 #################
-#################################################################################
-##### 2004/01/21 #####
- pdfbase/ttfonts.py 1.18 rgbecker Improve error handling & naming
-##### 2004/01/14 #####
- rl_addons/renderPM/pfm.py 1.3 rgbecker Changes for 2.3 compatibility
-##### 2004/01/13 #####
- pdfgen/canvas.py 1.118 rgbecker Allow for possible restarts
- platypus/doctemplate.py 1.71 rgbecker Allow for simple loop detection
-##### 2004/01/10 #####
- platypus/figures.py 1.16 rgbecker Added optional memory caching
-##### 2004/01/09 #####
- platypus/tables.py 1.71 rgbecker Modified version of Henning von Bargen's LongTables optimisation
-##### 2004/01/08 #####
- platypus/doctemplate.py 1.70 andy_robinson Upped empty page limit to 10
-##### 2004/01/07 #####
- platypus/flowables.py 1.44 andy_robinson Candidate fix for infinite looping
- platypus/doctemplate.py 1.69 andy_robinson Candidate fix for infinite looping
- lib/codecharts.py 1.8 andy_robinson Candidate fix for infinite looping
- platypus/figures.py 1.15 rgbecker Fix up caption and split methods etc
- platypus/tables.py 1.70 dragan1 merging Jython-branch
- platypus/tables.py 1.69 rgbecker Make _listCellGeom more specific
- platypus/__init__.py 1.16.2.2 dragan1 added conditional import linee for jython compatilibity
- platypus/figures.py 1.14 rgbecker Improved FlexFigure scaling, in memory PageCatcherFigures
-##### 2004/01/05 #####
- rl_addons/renderPM/_renderPM.c 1.31 rgbecker Fix bad long field value
-##### 2003/12/23 #####
- lib/_rl_accel.c 1.37 rgbecker Added hex32
-##### 2003/12/19 #####
- platypus/tables.py 1.68 rgbecker Added splitfirst/last handling
-##### 2003/12/18 #####
- tools/pythonpoint/styles/standard.py 1.3.4.1 dragan1 Platypus import structure changes
- tools/pythonpoint/styles/htu.py 1.1.4.1 dragan1 Platypus import structure changes
- tools/pythonpoint/pythonpoint.py 1.27.2.1 dragan1 Platypus import structure changes
- tools/pythonpoint/demos/examples.py 1.3.4.1 dragan1 Platypus import structure changes
- tools/docco/yaml2pdf.py 1.2.4.1 dragan1 Platypus import structure changes
- tools/docco/rltemplate.py 1.3.4.1 dragan1 Platypus import structure changes
- tools/docco/rl_doc_utils.py 1.6.4.1 dragan1 Platypus import structure changes
- tools/docco/examples.py 1.4.4.1 dragan1 Platypus import structure changes
- test/test_table_layout.py 1.1.4.1 dragan1 Platypus import structure changes
- test/test_rl_accel.py 1.3.2.1 dragan1 Platypus import structure changes
- test/test_platypus_xref.py 1.3.4.1 dragan1 Platypus import structure changes
- test/test_platypus_tables.py 1.3.4.1 dragan1 Platypus import structure changes
- test/test_platypus_paragraphs.py 1.11.4.1 dragan1 Platypus import structure changes
- test/test_platypus_indents.py 1.1.4.1 dragan1 Platypus import structure changes
- test/test_platypus_general.py 1.13.2.1 dragan1 Platypus import structure changes
- test/test_platypus_breaking.py 1.6.4.1 dragan1 Platypus import structure changes
- test/test_paragraphs.py 1.17.2.1 dragan1 Platypus import structure changes
- test/test_graphics_speed.py 1.12.4.1 dragan1 Platypus import structure changes
- test/test_graphics_charts.py 1.14.4.1 dragan1 Platypus import structure changes
- platypus/tables.py 1.67.2.1 dragan1 Platypus import structure changes
- platypus/paraparser.py 1.53.2.1 dragan1 Platypus import structure changes
- platypus/figures.py 1.13.2.1 dragan1 Platypus import structure changes
- platypus/__init__.py 1.16.2.1 dragan1 Platypus import structure changes
- lib/tocindex.py 1.10.2.1 dragan1 Platypus import structure changes
- lib/codecharts.py 1.7.4.1 dragan1 Platypus import structure changes
- graphics/shapes.py 1.100.2.1 dragan1 Platypus import structure changes
- graphics/renderPDF.py 1.24.2.1 dragan1 Platypus import structure changes
- docs/userguide/ch7_custom.py 1.4.4.1 dragan1 Platypus import structure changes
- docs/userguide/ch6_tables.py 1.6.4.1 dragan1 Platypus import structure changes
- docs/userguide/ch4_platypus_concepts.py 1.4.4.1 dragan1 Platypus import structure changes
- docs/userguide/ch2a_fonts.py 1.10.2.1 dragan1 Platypus import structure changes
- demos/rlzope/rlzope.py 1.5.4.1 dragan1 Platypus import structure changes
- demos/odyssey/fodyssey.py 1.17.4.1 dragan1 Platypus import structure changes
- demos/gadflypaper/gfe.py 1.15.4.1 dragan1 Platypus import structure changes
-##### 2003/12/17 #####
- graphics/testshapes.py 1.20 rgbecker Attempt to control ttf usage
- graphics/renderPM.py 1.44 rgbecker Attempt to control ttf usage
- platypus/paragraph.py 1.71 rgbecker Fix missing return
-##### 2003/12/16 #####
- platypus/paragraph.py 1.70 rgbecker Underline alignment fix from Marc Stober
-##### 2003/12/15 #####
- test/test_lib_sequencer.py 1.7 dragan1 changed method call from this to _this - java keyword
- lib/sequencer.py 1.14 dragan1 renamed methid this to _this - java keyword
-##### 2003/12/14 #####
- tools/pythonpoint/styles/modern.py 1.4 andy_robinson Permits style file to live in local directory
- tools/pythonpoint/stdparser.py 1.20 andy_robinson Permits style file to live in local directory
-##### 2003/12/12 #####
- lib/rparsexml.py 1.6 rgbecker Allow for both to have the fake entityReplacer thing
- rl_addons/pyRXP/examples/benchmarks.py 1.2 rgbecker -->reportlab.lib.rparsexml
-##### 2003/12/11 #####
- lib/rparsexml.py 1.5 rgbecker Add some support for slices etc
-#################################################################################
-#################### RELEASE 1.08 at 12:00 BST 19/June/2001 #####################
-#################################################################################
-##### 2001/06/19 #####
- test/test_graphics_speed.py 1.10 dinu_gherman
- Renamed chart attribute names to bars/lines/slices.
- test/test_graphics_charts.py 1.12 dinu_gherman
- Renamed chart attribute names to bars/lines/slices.
- graphics/charts/piecharts.py 1.17 dinu_gherman
- Renamed chart attribute names to bars/lines/slices.
- graphics/charts/lineplots.py 1.17 dinu_gherman
- Renamed chart attribute names to bars/lines/slices.
- graphics/charts/linecharts.py 1.12 dinu_gherman
- Renamed chart attribute names to bars/lines/slices.
- graphics/charts/barcharts.py 1.18 dinu_gherman
- Renamed chart attribute names to bars/lines/slices.
-##### 2001/06/18 #####
- docs/graphguide/ch2_graphics.py 1.21 rgbecker
- Changed from defaultStyles to pieStyles
- graphics/widgetbase.py 1.25 rgbecker
- Added recur arg to allow non-recurring
- graphics/shapes.py 1.32 rgbecker
- Added recur arg to allow non-recurring
- test/test_graphics_speed.py 1.9 dinu_gherman
- Renamed defaultStyles attribute with barStyles, lineStyles, pieStyles.
- test/test_graphics_charts.py 1.11 dinu_gherman
- Renamed defaultStyles attribute with barStyles, lineStyles, pieStyles.
- graphics/charts/piecharts.py 1.16 dinu_gherman
- Renamed defaultStyles attribute with barStyles, lineStyles, pieStyles.
- graphics/charts/lineplots.py 1.16 dinu_gherman
- Renamed defaultStyles attribute with barStyles, lineStyles, pieStyles.
- graphics/charts/linecharts.py 1.11 dinu_gherman
- Renamed defaultStyles attribute with barStyles, lineStyles, pieStyles.
- graphics/charts/barcharts.py 1.17 dinu_gherman
- Renamed defaultStyles attribute with barStyles, lineStyles, pieStyles.
-##### 2001/06/16 #####
- graphics/shapes.py 1.31 rgbecker
- Added Null _DrawingEditorMixin class
-##### 2001/06/15 #####
- pdfbase/pdfdoc.py 1.45 aaron_watters
- added missing PDFText() function for consistency (needed by pagecatcher)
-##### 2001/06/13 #####
- rl_addons/renderPM/setup.py 1.4 jvr
- some changes to make it potentially work under MacOS with the CodeWarrior compiler. Unfortunately it still doesn't :-(
- lib/setup.py 1.8 jvr
- minor patch: building the sgmlop, _rl_accel and pyHnj now simply *works* with distutils under MacOS with codeWarrior. Good Stuff. (haven't added any install smartness yet)
- graphics/renderPM.py 1.8 jvr
- Test program: use os.path.join() for path manipulation instead of things like 'pmout%s%s'%(os.sep,filename) as this gets it wrong under MacOS.
- rl_addons/renderPM/libart_lgpl/art_misc.c 1.2 jvr
- extended #ifndef _WIN32 to also check for undefined-ness of 'macintosh'
- rl_addons/renderPM/gt1/gt1-parset1.c 1.2 jvr
- change to make it compile under MacOS: added strdup() hack for Mac
- rl_addons/renderPM/_renderPM.c 1.3 jvr
- changes to make it compile under MacOS: - added strdup() hack for Mac - changed size_t fields in gstateObject to int -- otherwise I'd have to add casts to each and every bpath_add_point() call (can't implicitly go from size_t to int) - repaired "illegal constant expression" in gstate like Robin suggested
- lib/_rl_accel.c 1.18 rgbecker
- Just's Mac patch
- graphics/widgetbase.py 1.24 andy_robinson
- Changes to support customer project: allow nulls in bar charts, and added some missing but obvious properties e.g. strokeColor for bar and legend borders.
- graphics/charts/piecharts.py 1.15 andy_robinson
- Changes to support customer project: allow nulls in bar charts, and added some missing but obvious properties e.g. strokeColor for bar and legend borders.
- graphics/charts/legends.py 1.9 andy_robinson
- Changes to support customer project: allow nulls in bar charts, and added some missing but obvious properties e.g. strokeColor for bar and legend borders.
- graphics/charts/barcharts.py 1.16 andy_robinson
- Changes to support customer project: allow nulls in bar charts, and added some missing but obvious properties e.g. strokeColor for bar and legend borders.
- graphics/charts/axes.py 1.27 andy_robinson
- Changes to support customer project: allow nulls in bar charts, and added some missing but obvious properties e.g. strokeColor for bar and legend borders.
-##### 2001/06/11 #####
- pdfgen/canvas.py 1.80 rgbecker
- Made canvas default to rl_config.pageCompression
- rl_config.py 1.9 rgbecker
- Added pageCompression
- graphics/renderPDF.py 1.9 andy_robinson
- Added autoSize option to rendderPDF, and allowed "no border" around bars in bar charts. To support QIR project.
- graphics/charts/barcharts.py 1.15 andy_robinson
- Added autoSize option to rendderPDF, and allowed "no border" around bars in bar charts. To support QIR project.
-##### 2001/06/09 #####
- platypus/frames.py 1.13 rgbecker
- added _FUZZ and changed frame add test
-##### 2001/06/07 #####
- platypus/paragraph.py 1.55 rgbecker
- Remove explicit £ character to stop Dinu moaning
- test/test_pdfgen_pagemodes.py 1.5 rgbecker
- Try to shorten filenames
- test/test_widgetbase_tpc.py 1.1 rgbecker
- Shortened names
- test/test_graphics_widgetbase_tpc.py 1.2 rgbecker
- Shortened names
- test/test_graphics_charts_textlabels.py 1.4 rgbecker
- Shortened names
- test/test_charts_textlabels.py 1.1 rgbecker
- Shortened names
- lib/utils.py 1.16 rgbecker
- Imported PIL_WARNINGS
- graphics/widgetbase.py 1.23 rgbecker
- Allow TypedPropertyCollection exemplar class to have getattr etc
-##### 2001/06/06 #####
- graphics/widgetbase.py 1.22 rgbecker
- Fbot's suggested fix
- lib/setup.py 1.7 rgbecker
- Fixed up MovePYDs
- rl_addons/renderPM/setup.py 1.3 rgbecker
- Fixed up MovePYDs
- rl_addons/renderPM/_renderPM.c 1.2 rgbecker
- Niki Spahiev's PyMem_New patch for 1.5.2
-##### 2001/05/30 #####
- test/test_pdfbase_pdfmetrics.py 1.7 rgbecker
- Fixes for 2.1 whining
- test/runAll.py 1.6 rgbecker
- Fixes for 2.1 whining
- rl_addons/renderPM/setup.py 1.2 rgbecker
- Moved pyds to DLLs
- lib/setup.py 1.6 rgbecker
- Moved pyds to DLLs
-##### 2001/05/29 #####
- docs/graphguide/ch2_graphics.py 1.20 johnprecedo
- A number of small changes made - mainly changing import statements in the examples so that they actually work as given without producing an errors. Done up to page 15.
- pdfgen/canvas.py 1.79 rgbecker
- Fix the 2.1 _escape fix
- rl_config.py 1.8 rgbecker
- Changes for 2.1 escape fix
- pdfgen/canvas.py 1.78 rgbecker
- Changes for 2.1 escape fix
- lib/_rl_accel.c 1.17 rgbecker
- Changes for 2.1 escape fix
- test/test_pyfiles.py 1.6 dinu_gherman
- Added a test for first lines containing #!...python...
-##### 2001/05/28 #####
- platypus/paragraph.py 1.54 rgbecker
- Add some pound signs to test 5
-##### 2001/05/26 #####
- utils/daily.py 1.43 rgbecker
- Fixed precedence
- utils/daily.py 1.42 rgbecker
- Fixed error print' daily.py
-##### 2001/05/25 #####
- graphics/charts/legends.py 1.8 dinu_gherman
- Added font attributes for text in legends.
- lib/_rl_accel.c 1.16 rgbecker
- Fix special case ','
- lib/_rl_accel.c 1.15 rgbecker
- Added fix for comma decimal point
- lib/utils.py 1.15 rgbecker
- Attempt to fix the locale mismatch problem
- lib/graphdocpy.py 1.8 rgbecker
- removed use of renderGD
- pdfgen/pathobject.py 1.9 rgbecker
- Changed a few %f formats to use %s and fp_str
- pdfgen/canvas.py 1.77 rgbecker
- Changed a few %f formats to use %s and fp_str
-##### 2001/05/23 #####
- graphics/charts/textlabels.py 1.7 rgbecker
- Standardize nattribute names
- graphics/renderPS.py 1.7 rgbecker
- Synchronize backend to PDF standard
- graphics/renderPM.py 1.7 rgbecker
- Synchronize backend to PDF standard
- graphics/renderPDF.py 1.8 rgbecker
- Synchronize backend to PDF standard
- graphics/widgetbase.py 1.21 rgbecker
- Correct names and factorise some behaviour
- graphics/shapes.py 1.30 rgbecker
- Correct names and factorise some behaviour
-##### 2001/05/22 #####
- graphics/charts/barcharts.py 1.14 dinu_gherman
- Made strokeColor attribute for the bars be really used.
- graphics/charts/textlabels.py 1.6 dinu_gherman
- Added missing fillColor attribute for the string itself.
- graphics/charts/piecharts.py 1.14 rgbecker
- Fixes to piechart label handling
- lib/__BUILD.dsw 1.4 rgbecker
- Indicated usage of setup.py
- lib/README.extensions 1.3 rgbecker
- Indicated usage of setup.py
-##### 2001/05/21 #####
- graphics/widgetbase.py 1.20 rgbecker
- Fixed _ItemWrapper name and made it really cache
- graphics/widgetbase.py 1.19 rgbecker
- Improved element wrapping seems to work
- test/test_graphics_widgetbase_tpc.py 1.1 dinu_gherman
- Initial checkin.
- graphics/widgetbase.py 1.18 rgbecker
- Added element wrapper and fixed getitem so collections work better
- test/test_docstrings.py 1.7 dinu_gherman
- Substantial rewrite.
-##### 2001/05/20 #####
- pdfbase/_fontdata.py 1.10 rgbecker
- Fix typo
- rl_config.py 1.7 rgbecker
- Better Font handling for linux2
- pdfbase/_fontdata.py 1.9 rgbecker
- Better Font handling for linux2
- rl_config.py 1.6 rgbecker
- Font handling patches for linux2 from L Catucci
- pdfbase/_fontdata.py 1.8 rgbecker
- Font handling patches for linux2 from L Catucci
- test/unittest.py 1.4 rgbecker
- Fix linesep for non-JPython
- rl_config.py 1.5 rgbecker
- Added PIL_WARNINGS/ZLIB_WARNINGS
- lib/utils.py 1.14 rgbecker
- Added PIL_WARNINGS/ZLIB_WARNINGS
-##### 2001/05/18 #####
- test/test_docstrings.py 1.6 dinu_gherman
- Applied Robin's patch.
- graphics/testshapes.py 1.12 rgbecker
- Added locals & globals to the eval
- graphics/charts/piecharts.py 1.13 rgbecker
- Need some real strokeWidths
- rl_addons/renderPM/pfm.py 1.2 rgbecker
- Remove above 127 characters
- test/runAll.py 1.5 dinu_gherman
- Sorted order in which test module are executed (using sort()).
- test/test_docstrings.py 1.5 dinu_gherman
- Fixed bug where files got written everywhere by using new SecureTestCase.
- test/utils.py 1.1 dinu_gherman
- Initial checkin.
- platypus/paragraph.py 1.53 rgbecker
- added minWidth method to Flowable, Paragraph
- platypus/flowables.py 1.19 rgbecker
- added minWidth method to Flowable, Paragraph
- graphics/widgetbase.py 1.17 rgbecker
- Make setVector more friendly
- graphics/shapes.py 1.29 rgbecker
- Fixed expandUserNode method
- graphics/widgetbase.py 1.16 rgbecker
- Added TypedPropertyCollection.setVector
-##### 2001/05/17 #####
- docs/graphguide/ch2_graphics.py 1.19 rgbecker
- Pies don't seem to have a wedges collection any longer
- graphics/shapes.py 1.28 rgbecker
- Use canned routine validateSetattr
- lib/validators.py 1.6 rgbecker
- New AttrMap emplacement
- lib/attrmap.py 1.2 rgbecker
- New AttrMap emplacement
- graphics/widgets/signsandsymbols.py 1.12 rgbecker
- New AttrMap emplacement
- graphics/widgets/flags.py 1.5 rgbecker
- New AttrMap emplacement
- graphics/charts/textlabels.py 1.5 rgbecker
- New AttrMap emplacement
- graphics/charts/piecharts.py 1.12 rgbecker
- New AttrMap emplacement
- graphics/charts/lineplots.py 1.15 rgbecker
- New AttrMap emplacement
- graphics/charts/linecharts.py 1.10 rgbecker
- New AttrMap emplacement
- graphics/charts/legends.py 1.7 rgbecker
- New AttrMap emplacement
- graphics/charts/barcharts.py 1.13 rgbecker
- New AttrMap emplacement
- graphics/charts/axes.py 1.26 rgbecker
- New AttrMap emplacement
- graphics/widgetbase.py 1.15 rgbecker
- New AttrMap emplacement
- graphics/shapes.py 1.27 rgbecker
- New AttrMap emplacement
- graphics/shapes.py 1.26 rgbecker
- Removal of the Auto Thing
- graphics/charts/linecharts.py 1.9 rgbecker
- Removal of the Auto Thing
- graphics/charts/barcharts.py 1.12 rgbecker
- Removal of the Auto Thing
- graphics/charts/axes.py 1.25 rgbecker
- Removal of the Auto Thing
- docs/graphguide/ch2_graphics.py 1.18 rgbecker
- Removal of the Auto Thing
- lib/attrmap.py 1.1 rgbecker
- Initial version
- lib/validators.py 1.5 rgbecker
- New Scheme Validators
- test/test_lib_validators.py 1.4 rgbecker
- New Scheme Validators
-##### 2001/05/16 #####
- graphics/renderPM.py 1.6 rgbecker
- Added drawToString
- test/test_graphics_charts.py 1.10 rgbecker
- Renamed Legend0 to Legend, fixed _attrmap typo
- graphics/charts/legends.py 1.6 rgbecker
- Renamed Legend0 to Legend, fixed _attrmap typo
-##### 2001/05/15 #####
- graphics/charts/lineplots.py 1.14 dinu_gherman
- Added strokeDashArray attribute to LinePlotProperties class.
- test/test_lib_validators.py 1.3 dinu_gherman
- Removed isNumberOrAuto validator.
- lib/validators.py 1.4 dinu_gherman
- Removed isNumberOrAuto validator.
- graphics/charts/axes.py 1.24 dinu_gherman
- Removed isNumberOrAuto validator.
- graphics/widgetbase.py 1.14 dinu_gherman
- Adapted to use Validator instances in validators.py.
- graphics/shapes.py 1.25 dinu_gherman
- Adapted to use Validator instances in validators.py.
- graphics/testshapes.py 1.11 rgbecker
- Improvements to testshapse.py
- graphics/renderPM.py 1.5 rgbecker
- Improvements to testshapse.py
- platypus/paragraph.py 1.52 rgbecker
- Added find to imports
- test/test_paragraphs.py 1.10 rgbecker
- Added in line font changes
-##### 2001/05/11 #####
- platypus/doctemplate.py 1.40 rgbecker
- Dynamic page sizes
- lib/graphdocpy.py 1.7 dinu_gherman
- Fixed buglet.
- graphics/widgets/signsandsymbols.py 1.11 dinu_gherman
- Adapted to using vlaidator classes.
- graphics/widgets/flags.py 1.4 dinu_gherman
- Adapted to using vlaidator classes.
- lib/graphdocpy.py 1.6 dinu_gherman
- Added display of documented public widget attributes.
- graphics/charts/textlabels.py 1.4 dinu_gherman
- Adapted to using validator classes in attribute maps.
- graphics/charts/piecharts.py 1.11 dinu_gherman
- Adapted to using validator classes in attribute maps.
- graphics/charts/lineplots.py 1.13 dinu_gherman
- Adapted to using validator classes in attribute maps.
- graphics/charts/linecharts.py 1.8 dinu_gherman
- Adapted to using validator classes in attribute maps.
- graphics/charts/legends.py 1.5 dinu_gherman
- Adapted to using validator classes in attribute maps.
- graphics/charts/barcharts.py 1.11 dinu_gherman
- Adapted to using validator classes in attribute maps.
- graphics/charts/axes.py 1.23 dinu_gherman
- Adapted to using validator classes in attribute maps.
- test/test_lib_validators.py 1.2 dinu_gherman
- Changed validator functions into classes. Adapted test cases. Added a tiny change to widgetbase.py.
- lib/validators.py 1.3 dinu_gherman
- Changed validator functions into classes. Adapted test cases. Added a tiny change to widgetbase.py.
- graphics/widgetbase.py 1.13 dinu_gherman
- Changed validator functions into classes. Adapted test cases. Added a tiny change to widgetbase.py.
- test/test_coordtracking.py 1.2 rgbecker
- Removed for for later correction
-##### 2001/05/10 #####
- test/test_coordtracking.py 1.1 aaron_watters
- test file for coordinate tracking and links
- pdfgen/canvas.py 1.76 aaron_watters
- canvas coordinate matrix tracking and related linkage support
- graphics/widgetbase.py 1.12 dinu_gherman
- Switched to using lib.validators module.
- graphics/widgets/signsandsymbols.py 1.10 dinu_gherman
- Switched to using lib.validators module.
- graphics/widgets/flags.py 1.3 dinu_gherman
- Switched to using lib.validators module.
-##### 2001/05/09 #####
- lib/setup.py 1.5 rgbecker
- Compatibility fixes
- lib/_rl_accel.c 1.14 rgbecker
- Compatibility fixes
- graphics/widgetbase.py 1.11 dinu_gherman
- Code and docstring enhancements.
- test/test_graphics_speed.py 1.8 dinu_gherman
- Switched to using defaultStyles attribute.
- test/test_graphics_charts.py 1.9 dinu_gherman
- Switched to using defaultStyles attribute.
- graphics/charts/axes.py 1.22 dinu_gherman
- Added visibleAxis/visibleTicks attributes.
- graphics/charts/piecharts.py 1.10 dinu_gherman
- Broken draw method apart (well...).
- graphics/charts/piecharts.py 1.9 dinu_gherman
- Done some slight code enhancements.
- graphics/charts/lineplots.py 1.12 dinu_gherman
- Switched to using PropHolder superclass for LinePlotProperties. Added strokeWidth attribute to LinePlotProperties.
- test/test_lib_validators.py 1.1 dinu_gherman
- Initial checkin.
-##### 2001/05/08 #####
- graphics/charts/barcharts.py 1.10 dinu_gherman
- Switched to using defaultStyles attribute.
- graphics/charts/linecharts.py 1.7 dinu_gherman
- Switched to using typed collection styles.
- graphics/charts/piecharts.py 1.8 dinu_gherman
- Made more consistent use of typed collections.
- graphics/charts/lineplots.py 1.11 dinu_gherman
- Removed dead code. Removed references to usedSymbol attribute. Made defaultStyles attribute a typed collection.
- graphics/widgetbase.py 1.10 dinu_gherman
- Added a __len__ method to TypedPropertyCOllection.
- graphics/charts/lineplots.py 1.10 dinu_gherman
- Removed references to defaultColors.
- lib/graphdocpy.py 1.5 dinu_gherman
- Opening now showing PDF outline (with closed function sections). Minor fixes.
-##### 2001/05/07 #####
- graphics/renderPDF.py 1.7 aaron_watters
- get rid of automatic boundary box option
- graphics/charts/axes.py 1.21 dinu_gherman
- Reduced number of arguments for joinToAxis() methods.
- lib/validators.py 1.2 dinu_gherman
- Extracted validator functions into lib.validators. Modified import statements.
- graphics/shapes.py 1.24 dinu_gherman
- Extracted validator functions into lib.validators. Modified import statements.
- graphics/charts/textlabels.py 1.3 dinu_gherman
- Extracted validator functions into lib.validators. Modified import statements.
- graphics/charts/piecharts.py 1.7 dinu_gherman
- Extracted validator functions into lib.validators. Modified import statements.
- graphics/charts/lineplots.py 1.9 dinu_gherman
- Extracted validator functions into lib.validators. Modified import statements.
- graphics/charts/linecharts.py 1.6 dinu_gherman
- Extracted validator functions into lib.validators. Modified import statements.
- graphics/charts/legends.py 1.4 dinu_gherman
- Extracted validator functions into lib.validators. Modified import statements.
- graphics/charts/barcharts.py 1.9 dinu_gherman
- Extracted validator functions into lib.validators. Modified import statements.
- graphics/charts/axes.py 1.20 dinu_gherman
- Extracted validator functions into lib.validators. Modified import statements.
- lib/validators.py 1.1 dinu_gherman
- Added future validators module (stripped off from shapes.py).
- graphics/charts/piecharts.py 1.6 dinu_gherman
- Various minor changes.
- graphics/charts/lineplots.py 1.8 dinu_gherman
- Various minor changes.
- graphics/charts/linecharts.py 1.5 dinu_gherman
- Various minor changes.
- graphics/charts/legends.py 1.3 dinu_gherman
- Various minor changes.
- graphics/charts/barcharts.py 1.8 dinu_gherman
- Various minor changes.
- graphics/charts/axes.py 1.19 dinu_gherman
- Various minor changes.
-##### 2001/05/05 #####
- platypus/tables.py 1.39 aaron_watters
- hacky fix to nudge bug
- pdfgen/canvas.py 1.75 aaron_watters
- fix for major font metrics state tracking bug
-##### 2001/05/04 #####
- platypus/tables.py 1.38 aaron_watters
- use round caps for miter limit
- graphics/renderPM.py 1.4 rgbecker
- Readded import checks and improved messages
- graphics/renderPM.py 1.3 rgbecker
- Added fix for png files
-##### 2001/05/03 #####
- graphics/renderPM.py 1.2 rgbecker
- ImportError checks for _renderPM
- graphics/renderPM.py 1.1 rgbecker
- Moved from rlextra/graphics/Csrc/renderPM
-#################################################################################
-#################### RELEASE 1.07 at 11:54 BST ##################################
-#################################################################################
-##### 2001/05/02 #####
- lib/units.py 1.3 rgbecker
- Added toLength function
-##### 2001/05/01 #####
- lib/colors.py 1.18 johnprecedo
- Added special color - ReportLabBlue.
- graphics/charts/axes.py 1.18 rgbecker
- makeLabels/Ticks changed
- graphics/testshapes.py 1.10 rgbecker
- strokeDashArray fixes
- graphics/shapes.py 1.23 rgbecker
- strokeDashArray fixes
- graphics/charts/axes.py 1.17 rgbecker
- strokeDashArray fixes
-##### 2001/04/30 #####
- pdfbase/pdfmetrics.py 1.37 rgbecker
- Added some imports for compatibility/efficiency
-##### 2001/04/28 #####
- graphics/widgets/signsandsymbols.py 1.9 rgbecker
- try and ensure float division
-##### 2001/04/26 #####
- graphics/charts/lineplots.py 1.7 dinu_gherman
- Changed defaultColors to defaultStyles.
- pdfgen/pdfimages.py 1.12 rgbecker
- Fixed typo zlib (not lib)
- lib/randomtext.py 1.7 johnprecedo
- Minor changes. Now allows you to specify the maximum number of sentences for the randomtext as an argument. Also added an example usage to the docstring.
-##### 2001/04/25 #####
- license.txt 1.2 andy_robinson
- Trivial change to test CVS write access
- graphics/charts/piecharts.py 1.5 dinu_gherman
- Added more samples.
- graphics/charts/piecharts.py 1.4 johnprecedo
- Added a new example.
- graphics/charts/piecharts.py 1.3 dinu_gherman
- Removed sector line for single sliced pie charts.
-##### 2001/04/24 #####
- graphics/charts/axes.py 1.16 dinu_gherman
- Made joining of axes possible via axes attributes.
-##### 2001/04/23 #####
- pdfbase/pdfmetrics.py 1.36 rgbecker
- Added findT1File to base Face, and _fontdata
- pdfbase/_fontdata.py 1.7 rgbecker
- Added findT1File to base Face, and _fontdata
- lib/fonts.py 1.7 rgbecker
- Moved T1 search stuff into pdfbase.fontdata
- pdfbase/pdfmetrics.py 1.35 rgbecker
- Remove debug prints
-##### 2001/04/20 #####
- test/test_pdfbase_fontembed.py 1.2 rgbecker
- Merged pdfgen.fonts into pdfmetrics again
- test/test_pdfbase_encodings.py 1.2 rgbecker
- Merged pdfgen.fonts into pdfmetrics again
- pdfgen/fonts.py 1.2 rgbecker
- Merged pdfgen.fonts into pdfmetrics again
- pdfbase/pdfmetrics.py 1.34 rgbecker
- Merged pdfgen.fonts into pdfmetrics again
- pdfbase/_fontdata.py 1.6 rgbecker
- Merged pdfgen.fonts into pdfmetrics again
- lib/_rl_accel.c 1.13 rgbecker
- Merged pdfgen.fonts into pdfmetrics again
- utils/daily.py 1.41 rgbecker
- Fix graphguide generation
- utils/daily.py 1.40 rgbecker
- Add graphguide generation
- pdfgen/canvas.py 1.74 rgbecker
- pageCompression fix from Mark Charlebois (was undefined if zlib not present); removed stray print statements on font registration.
- pdfbase/pdfmetrics.py 1.33 rgbecker
- pageCompression fix from Mark Charlebois (was undefined if zlib not present); removed stray print statements on font registration.
-##### 2001/04/18 #####
- test/test_pdfbase_fontembed.py 1.1 rgbecker
- New font embedding mechanism
- test/test_pdfbase_encodings.py 1.1 rgbecker
- New font embedding mechanism
- pdfgen/fonts.py 1.1 rgbecker
- New font embedding mechanism
- test/test_pdfgen_general.py 1.4 rgbecker
- New font embedding stuff.
- test/test_pdfbase_pdfmetrics.py 1.6 rgbecker
- New font embedding stuff.
- pdfgen/canvas.py 1.73 rgbecker
- New font embedding stuff.
- pdfbase/pdfmetrics.py 1.32 rgbecker
- New font embedding stuff.
- pdfbase/pdfdoc.py 1.44 rgbecker
- New font embedding stuff.
- README 1.5 rgbecker
- Testing write access to CVS, only whitespace changed
- testfile.txt 1.2 johnprecedo
- removed test file
- testfile.txt 1.1 johnprecedo
- nitial checkin to test CVS write access
-##### 2001/04/17 #####
- rl_config.py 1.4 rgbecker
- Fix typo in T1SearchPath name
- pdfbase/afm2w.py 1.2 rgbecker
- Removed file added for test
- pdfbase/afm2w.py 1.1 rgbecker
- Adding afm2w as a test
- docs/userguide/testfile.txt 1.1 andy_robinson
- Testing checkin rights
- docs/userguide/ch9_future.py 1.3 andy_robinson
- Testing SF commit ability
-##### 2001/04/16 #####
- __init__.py 1.13 rgbecker
- Changed copyright dates
- README 1.4 andy_robinson
- Whitespace change to test CVS write access
-##### 2001/04/13 #####
- test/test_pdfgen_general.py 1.3 rgbecker
- Added sausages
- test/test_pdfgen_general.py 1.2 andy_robinson
- filename case change for an embedded GIF
- test/test_platypus_general.py 1.2 andy_robinson
- General pdfgen test moved to here
- test/test_pdfgen_general.py 1.1 andy_robinson
- General pdfgen test moved to here
- test/test_platypus_tables.py 1.1 andy_robinson
- Added tests formerly under platypus/test
- test/test_platypus_general.py 1.1 andy_robinson
- Added tests formerly under platypus/test
- test/pythonpowered.gif 1.1 andy_robinson
- Added tests formerly under platypus/test
-##### 2001/04/12 #####
- graphics/charts/barcharts.py 1.7 rgbecker
- Moved functionality into the base Barchart class
- graphics/renderPDF.py 1.6 rgbecker
- Added showBoundary arg
-##### 2001/04/11 #####
- graphics/charts/axes.py 1.15 rgbecker
- Move common value axis bits into base class
- graphics/charts/axes.py 1.14 rgbecker
- Try and make min/max finding as complicated as possible
- graphics/charts/axes.py 1.13 rgbecker
- Moved some common stuff into ValueAxis, added maximumTicks
- graphics/shapes.py 1.22 rgbecker
- Improved comment somewhat
- graphics/charts/axes.py 1.12 rgbecker
- Added _findMax/Min funcs
- graphics/charts/axes.py 1.11 rgbecker
- Added _calcValueStep and _rangeAdjust methods
- graphics/widgetbase.py 1.9 rgbecker
- Added StyleProeprties class
-##### 2001/04/10 #####
- graphics/widgetbase.py 1.8 andy_robinson
- Robin's refactoring to separate propholder and Widget
- demos/pythonpoint/pythonpoint.py 1.32 andy_robinson
- Removing pingo dependency
- graphics/charts/markers.py 1.2 dinu_gherman
- Added two funcions and tidied-up.
- lib/normalDate.py 1.1 dinu_gherman
- Initial checkin.
- lib/pagesizes.py 1.7 andy_robinson
- Fixed size of legal
-##### 2001/04/09 #####
- graphics/charts/lineplots.py 1.6 dinu_gherman
- Fixed import buglet.
- test/test_graphics_charts.py 1.8 dinu_gherman
- Adapted to new LineChart class names.
- graphics/charts/markers.py 1.1 dinu_gherman
- Initial checkin.
- graphics/charts/lineplots.py 1.5 dinu_gherman
- Splitted draw() method. Removed marker functions. Removed usage of XTimeSeriesAxis. Lots of tiny changes.
- graphics/charts/linecharts.py 1.4 dinu_gherman
- Aplitted draw method. Moved marker functions into markers.py. Many tiny modifications.
- graphics/charts/barcharts.py 1.6 dinu_gherman
- Minimal doc string changes.
- graphics/charts/axes.py 1.10 dinu_gherman
- Added attribute valueSteps to X- and YValueAxis. Commented XTimeSeriesAxes.
- graphics/charts/barcharts.py 1.5 dinu_gherman
- Added abstract BarChart base class. Applied various code simplifications. Removed 'import *'.
- graphics/charts/barcharts.py 1.4 dinu_gherman
- Tiny changes (to verify CVS works).
- graphics/charts/barcharts.py 1.3 dinu_gherman
- Split draw() methods into makeBars() and makeBackground(). Fixed one possible bug (reverted order of configure and setPosition()).
- graphics/charts/utils.py 1.2 dinu_gherman
- Added Robin's stuff from rgb_ticks.py.
- graphics/charts/axes.py 1.9 dinu_gherman
- Factorized two more methods into ValueAxis.
- graphics/charts/axes.py 1.8 dinu_gherman
- Factorized some more methods into abstract base classes.
- graphics/charts/axes.py 1.7 dinu_gherman
- Added new abstract base classes CategoryAxis and ValueAxis. Factorized some methods in X/Y axes and moved to these base classes. Split draw methods into three new methods.
- graphics/charts/lineplots.py 1.4 dinu_gherman
- Removed commented code.
- graphics/charts/utils.py 1.1 dinu_gherman
- Moved utility functions into new module utils.py.
- graphics/charts/lineplots.py 1.3 dinu_gherman
- Moved utility functions into new module utils.py.
- graphics/charts/axes.py 1.6 dinu_gherman
- Moved utility functions into new module utils.py.
- graphics/charts/axes.py 1.5 dinu_gherman
- Removed 'import *'.
-##### 2001/04/06 #####
- lib/graphdocpy.py 1.4 andy_robinson
- Now adds the current directory to the path; makes it easier to run it over other modules.
- graphics/charts/axes.py 1.4 andy_robinson
- Changes received from Dinu - required for demo, not sure what's in it (Andy)
- graphics/shapes.py 1.21 rgbecker
- Fix indent
- graphics/shapes.py 1.20 rgbecker
- _updater was silly
- lib/utils.py 1.13 rgbecker
- _updater was silly
- lib/utils.py 1.12 rgbecker
- Added dict _updater func
- graphics/shapes.py 1.19 rgbecker
- Group/Drawing slightly cleaner python
-##### 2001/04/05 #####
- graphics/shapes.py 1.18 rgbecker
- Added Group insert method
- graphics/shapes.py 1.17 rgbecker
- Added stringWidth import
- utils/cvs_status.py 1.2 rgbecker
- License text changes
- test/test_pyfiles.py 1.5 rgbecker
- License text changes
- test/test_platypus_toc.py 1.6 rgbecker
- License text changes
- test/test_platypus_paragraphs.py 1.6 rgbecker
- License text changes
- test/test_pdfgen_pagemodes.py 1.4 rgbecker
- License text changes
- test/test_pdfbase_pdfutils.py 1.3 rgbecker
- License text changes
- test/test_pdfbase_pdfmetrics.py 1.5 rgbecker
- License text changes
- test/test_paragraphs.py 1.9 rgbecker
- License text changes
- test/test_lib_sequencer.py 1.4 rgbecker
- License text changes
- test/test_lib_colors.py 1.6 rgbecker
- License text changes
- test/test_graphics_speed.py 1.7 rgbecker
- License text changes
- test/test_graphics_charts_textlabels.py 1.3 rgbecker
- License text changes
- test/test_graphics_charts.py 1.7 rgbecker
- License text changes
- test/test_docstrings.py 1.4 rgbecker
- License text changes
- test/runAll.py 1.4 rgbecker
- License text changes
- test/__init__.py 1.2 rgbecker
- License text changes
- platypus/tableofcontents.py 1.2 rgbecker
- License text changes
- pdfbase/pdfmetrics.py 1.31 rgbecker
- License text changes
- pdfbase/_fontdata.py 1.5 rgbecker
- License text changes
- lib/yaml.py 1.2 rgbecker
- License text changes
- lib/setup.py 1.4 rgbecker
- License text changes
- lib/graphdocpy.py 1.3 rgbecker
- License text changes
- rl_config.py 1.3 rgbecker
- License text changes
- lib/docpy.py 1.4 rgbecker
- License text changes
- graphics/widgets/signsandsymbols.py 1.8 rgbecker
- License text changes
- graphics/widgets/flags.py 1.2 rgbecker
- License text changes
- graphics/widgets/__init__.py 1.2 rgbecker
- License text changes
- graphics/widgetbase.py 1.7 rgbecker
- License text changes
- graphics/testshapes.py 1.9 rgbecker
- License text changes
- graphics/testdrawings.py 1.2 rgbecker
- License text changes
- graphics/renderbase.py 1.9 rgbecker
- License text changes
- graphics/renderPS.py 1.6 rgbecker
- License text changes
- graphics/renderPDF.py 1.5 rgbecker
- License text changes
- graphics/charts/textlabels.py 1.2 rgbecker
- License text changes
- graphics/charts/piecharts.py 1.2 rgbecker
- License text changes
- graphics/charts/lineplots.py 1.2 rgbecker
- License text changes
- graphics/charts/linecharts.py 1.3 rgbecker
- License text changes
- graphics/charts/legends.py 1.2 rgbecker
- License text changes
- graphics/charts/barcharts.py 1.2 rgbecker
- License text changes
- graphics/charts/axes.py 1.3 rgbecker
- License text changes
- graphics/charts/__init__.py 1.2 rgbecker
- License text changes
- graphics/__init__.py 1.2 rgbecker
- License text changes
- docs/userguide/ch9_future.py 1.2 rgbecker
- License text changes
- docs/graphguide/t_parse.py 1.2 rgbecker
- License text changes
- docs/graphguide/platdemos.py 1.2 rgbecker
- License text changes
- docs/graphguide/gengraphguide.py 1.2 rgbecker
- License text changes
- docs/graphguide/examples.py 1.2 rgbecker
- License text changes
- docs/graphguide/ch2_graphics.py 1.17 rgbecker
- License text changes
- docs/graphguide/ch1_intro.py 1.7 rgbecker
- License text changes
- graphics/shapes.py 1.16 rgbecker
- Fixed indentation
- graphics/shapes.py 1.15 rgbecker
- Added missing comment
- graphics/shapes.py 1.14 rgbecker
- Made Drawings inherit from Group
- utils/copyr.txt 1.2 rgbecker
- Changed copyright period
- utils/copyrite.py 1.2 rgbecker
- Removed spurious assignnments
-##### 2001/04/04 #####
- lib/logger.py 1.3 rgbecker
- Added enable attribute to the WarnOnce class
- graphics/shapes.py 1.13 rgbecker
- Added _textBoxLimits
-##### 2001/04/03 #####
- docs/graphguide/ch2_graphics.py 1.16 johnprecedo
- Spellchecked - fixed 15 typos.
- docs/graphguide/ch2_graphics.py 1.15 johnprecedo
- Minor changes - resolved a conflict.
- docs/graphguide/ch2_graphics.py 1.14 johnprecedo
- Added another sample Pie.
-##### 2001/04/02 #####
- docs/graphguide/ch1_intro.py 1.6 johnprecedo
- Corrected a couple of typoes.
- docs/graphguide/ch2_graphics.py 1.13 johnprecedo
- Corrected a couple of typoes.
-#################################################################################
-#################### RELEASE 1.06 at 14:00 BST ##################################
-#################################################################################
-##### 2001/03/30 #####
- docs/graphguide/ch2_graphics.py 1.11 dinu_gherman
- Minor changes.
- docs/graphguide/ch2_graphics.py 1.10 dinu_gherman
- Updated text.
- docs/graphguide/ch2_graphics.py 1.9 dinu_gherman
- Added two bar charts.
- docs/graphguide/ch2_graphics.py 1.8 dinu_gherman
- Added samples for signsandsymbols.
- docs/graphguide/ch2_graphics.py 1.7 dinu_gherman
- Added minor changes.
- docs/graphguide/ch1_intro.py 1.5 dinu_gherman
- Added minor changes.
- docs/graphguide/ch1_intro.py 1.4 dinu_gherman
- Retrofitted a few changes to the content.
- docs/userguide/genuserguide.py 1.46 dinu_gherman
- Removed two commented imports (to see if CVS works).
- utils/daily.py 1.39 rgbecker
- Changed to account for graphdocpy and dos/graphguide
- docs/userguide/genuserguide.py 1.45 rgbecker
- Cross-refrenced to graphics guide, removed spurious ch8
- docs/userguide/ch8_graphics.py 1.15 rgbecker
- Cross-refrenced to graphics guide, removed spurious ch8
- docs/userguide/ch2_graphics.py 1.12 rgbecker
- Cross-refrenced to graphics guide, removed spurious ch8
- docs/userguide/ch1_intro.py 1.13 rgbecker
- Cross-refrenced to graphics guide, removed spurious ch8
- README 1.3 rgbecker
- Touch Test
-##### 2001/03/29 #####
- docs/userguide/ch8_graphics.py 1.14 dinu_gherman
- Added further minor corrections.
- docs/graphguide/ch2_graphics.py 1.6 dinu_gherman
- Further changes.
- docs/graphguide/ch2_graphics.py 1.5 dinu_gherman
- Added a table.
- docs/graphguide/ch2_graphics.py 1.4 dinu_gherman
- Further changes.
- docs/userguide/ch8_graphics.py 1.13 dinu_gherman
- Shortened even further.
- docs/graphguide/ch2_graphics.py 1.3 dinu_gherman
- Minor changes.
- docs/graphguide/ch1_intro.py 1.3 dinu_gherman
- Minor changes.
- docs/graphguide/ch2_graphics.py 1.2 dinu_gherman
- Changed granularity of chapters.
- docs/graphguide/ch1_intro.py 1.2 dinu_gherman
- Changed granularity of chapters.
- docs/userguide/genuserguide.py 1.44 dinu_gherman
- Removed reference to original graphics chapter.
- docs/userguide/ch8_graphics_long.py 1.2 dinu_gherman
- Removed graphics chapter into graphics guide.
- docs/graphguide/t_parse.py 1.1 dinu_gherman
- Initial checkin, mostly copied from user guide.
- docs/graphguide/platdemos.py 1.1 dinu_gherman
- Initial checkin, mostly copied from user guide.
- docs/graphguide/gengraphguide.py 1.1 dinu_gherman
- Initial checkin, mostly copied from user guide.
- docs/graphguide/examples.py 1.1 dinu_gherman
- Initial checkin, mostly copied from user guide.
- docs/graphguide/ch2_graphics.py 1.1 dinu_gherman
- Initial checkin, mostly copied from user guide.
- docs/graphguide/ch1_intro.py 1.1 dinu_gherman
- Initial checkin, mostly copied from user guide.
-##### 2001/03/28 #####
- docs/userguide/ch8_graphics.py 1.12 dinu_gherman
- Further changes.
- docs/userguide/ch8_graphics.py 1.11 dinu_gherman
- Shortened from previous version.
- docs/userguide/genuserguide.py 1.43 dinu_gherman
- Added import of short graphics chapter.
- docs/userguide/ch8_graphics_long.py 1.1 dinu_gherman
- Copyied graphics chapter file (to be extracted into a seperate document).
- docs/userguide/ch8_graphics.py 1.10 johnprecedo
- More images.
- docs/userguide/ch8_graphics.py 1.9 johnprecedo
- Added more illustrations.
- graphics/charts/linecharts.py 1.2 dinu_gherman
- Added to docstrings and tidied-up a bit.
-##### 2001/03/27 #####
- docs/userguide/ch8_graphics.py 1.8 andy_robinson
- Drawings and tables bug fixed.
- docs/tools/rltemplate.py 1.11 andy_robinson
- Drawings and tables bug fixed.
- docs/userguide/ch8_graphics.py 1.7 johnprecedo
- More markup. Added todo comments for missing images
- docs/userguide/genuserguide.py 1.42 johnprecedo
- Added Andy's changes to include illustrations (from code snippets).
- docs/userguide/ch8_graphics.py 1.6 johnprecedo
- Added Andy's changes to include illustrations (from code snippets).
- docs/userguide/ch8_graphics.py 1.5 johnprecedo
- More markup changes. Code snippets changed so that they match with current code.
- docs/userguide/ch8_graphics.py 1.4 johnprecedo
- Lots of small markup changes. Removed reference to paths - they aren't implemented yet in reportlab\graphics. changed references to 'widgets.py' to 'widgetbase.py'.
- docs/userguide/genuserguide.py 1.41 johnprecedo
- Moved chapter 8 to chapter 9 - new chapter 8 inserted for reportlab\graphics.
-##### 2001/03/26 #####
- docs/userguide/ch8_graphics.py 1.3 johnprecedo
- Finished markup of reportlab\graphics tutorial. Only one table inserted so far. Any markup other that split into headings/paragraphs/code examples is also missing.
- docs/userguide/ch8_graphics.py 1.2 johnprecedo
- First partial checkin on new chapter on "Platform Independent Graphics". Little markup done. Later part is still commented out (awaiting markup).
- utils/runtests.py 1.16 rgbecker
- Improved pattern searches and added better inhibiting
- test/unittest.py 1.3 rgbecker
- Added utils\runtests.py inhibitor comment
- test/test_pyfiles.py 1.4 rgbecker
- Added utils\runtests.py inhibitor comment
- test/test_platypus_toc.py 1.5 rgbecker
- Added utils\runtests.py inhibitor comment
- test/test_platypus_paragraphs.py 1.5 rgbecker
- Added utils\runtests.py inhibitor comment
- test/test_pdfgen_pagemodes.py 1.3 rgbecker
- Added utils\runtests.py inhibitor comment
- test/test_pdfbase_pdfutils.py 1.2 rgbecker
- Added utils\runtests.py inhibitor comment
- test/test_pdfbase_pdfmetrics.py 1.4 rgbecker
- Added utils\runtests.py inhibitor comment
- test/test_paragraphs.py 1.8 rgbecker
- Added utils\runtests.py inhibitor comment
- test/test_lib_sequencer.py 1.3 rgbecker
- Added utils\runtests.py inhibitor comment
- test/test_lib_colors.py 1.5 rgbecker
- Added utils\runtests.py inhibitor comment
- test/test_graphics_speed.py 1.6 rgbecker
- Added utils\runtests.py inhibitor comment
- test/test_graphics_charts_textlabels.py 1.2 rgbecker
- Added utils\runtests.py inhibitor comment
- test/test_graphics_charts.py 1.6 rgbecker
- Added utils\runtests.py inhibitor comment
- test/test_docstrings.py 1.3 rgbecker
- Added utils\runtests.py inhibitor comment
- test/runAll.py 1.3 rgbecker
- Added utils\runtests.py inhibitor comment
- docs/userguide/ch9_future.py 1.1 johnprecedo
- Existing chapter 8 renamed to chapter 9. Stub for new chapter 8 on graphics added.
- docs/userguide/ch8_graphics.py 1.1 johnprecedo
- Existing chapter 8 renamed to chapter 9. Stub for new chapter 8 on graphics added.
- docs/userguide/ch8_future.py 1.4 johnprecedo
- Existing chapter 8 renamed to chapter 9. Stub for new chapter 8 on graphics added.
- lib/utils.py 1.11 rgbecker
- Changed to prefer PIL as package
- platypus/flowables.py 1.18 rgbecker
- Changed to PIL_Image
- pdfgen/test/testpdfgen.py 1.17 rgbecker
- Changed to PIL_Image
- pdfgen/pdfimages.py 1.11 rgbecker
- Changed to PIL_Image
- pdfgen/canvas.py 1.72 rgbecker
- Changed to PIL_Image
- pdfbase/pdfutils.py 1.21 rgbecker
- Changed to PIL_Image
- lib/utils.py 1.10 rgbecker
- Changed to PIL_Image
- graphics/renderPS.py 1.5 rgbecker
- Changed to PIL_Image
-##### 2001/03/25 #####
- graphics/shapes.py 1.12 dinu_gherman
- Improved Auto class. Changed formatting slightly.
- test/test_graphics_charts.py 1.5 dinu_gherman
- Fixed a buglet with graphdocpy.py running over this file.
- lib/docpy.py 1.3 dinu_gherman
- Fixed argument bug for UmlPdfDocumentBuilder.begin(). Added bullets to 'imported modules' section. Added cosmetic changes to MyTemplate.afterFlowable().
-##### 2001/03/23 #####
- test/test_pyfiles.py 1.3 dinu_gherman
- Changed trailing digit test to really fail.
- graphics/widgets/flags0.py 1.5 dinu_gherman
- Replaced trailing digit filename.
- graphics/widgets/flags.py 1.1 dinu_gherman
- Replaced trailing digit filename.
- platypus/tableofcontents0.py 1.3 dinu_gherman
- Replaced trailing digit file.
- platypus/tableofcontents.py 1.1 dinu_gherman
- Replaced trailing digit file.
- test/test_platypus_toc.py 1.4 dinu_gherman
- Fixed imports for non-trailing digit modules.
- test/test_platypus_paragraphs.py 1.4 dinu_gherman
- Fixed imports for non-trailing digit modules.
- test/test_pyfiles.py 1.2 dinu_gherman
- Added test for trailing digits in filenames.
- lib/graphdocpy.py 1.2 dinu_gherman
- Fixed doc strings and imports.
- lib/docpy.py 1.2 dinu_gherman
- Fixed doc strings and imports.
- lib/graphdocpy.py 1.1 dinu_gherman
- Initial checkin of non-trailing digit files replacing previous ones.
- lib/docpy.py 1.1 dinu_gherman
- Initial checkin of non-trailing digit files replacing previous ones.
- lib/graphicsdoc0.py 1.12 dinu_gherman
- Removed trailing digit file to be replaced with others.
- lib/docpy1.py 1.2 dinu_gherman
- Removed trailing digit files to be replaced with others.
- lib/docpy0.py 1.8 dinu_gherman
- Removed trailing digit files to be replaced with others.
- graphics/shapes.py 1.11 dinu_gherman
- Added isNumberOrAuto() function.
- graphics/charts/axes.py 1.2 dinu_gherman
- Added missing attribute maps.
-##### 2001/03/22 #####
- lib/_rl_accel.c 1.12 rgbecker
- Fixed up a better lookup for _AttrDict
- platypus/paraparser.py 1.41 andy_robinson
- Accepts seqdefault/seqDefault and seqreset/seqReset
- lib/_rl_accel.c 1.11 rgbecker
- Renamed AttrDict to _AttrDict
-##### 2001/03/21 #####
- pdfbase/pdfdoc.py 1.43 aaron_watters
- fixed minor bug in forms handling
- lib/_rl_accel.c 1.10 rgbecker
- AttrDict improvements not yet primetime
- lib/setup.py 1.3 rgbecker
- avoid import errors for Dinu, no runtests for Robin
- lib/_rl_accel.c 1.9 rgbecker
- avoid import errors for Dinu, no runtests for Robin
- test/test_graphics_charts_textlabel0.py 1.4 dinu_gherman
- Removed trailing digit filename to be replaced.
- test/test_graphics_speed.py 1.5 dinu_gherman
- Replaced one file with a non-trailing digit filename. Modified files using previous trailing digit modules.
- test/test_graphics_charts_textlabels.py 1.1 dinu_gherman
- Replaced one file with a non-trailing digit filename. Modified files using previous trailing digit modules.
- test/test_graphics_charts.py 1.4 dinu_gherman
- Replaced one file with a non-trailing digit filename. Modified files using previous trailing digit modules.
- graphics/charts/textlabels.py 1.1 dinu_gherman
- Initial checkin, replacing previous trailing digit filenames.
- graphics/charts/piecharts.py 1.1 dinu_gherman
- Initial checkin, replacing previous trailing digit filenames.
- graphics/charts/lineplots.py 1.1 dinu_gherman
- Initial checkin, replacing previous trailing digit filenames.
- graphics/charts/linecharts.py 1.1 dinu_gherman
- Initial checkin, replacing previous trailing digit filenames.
- graphics/charts/legends.py 1.1 dinu_gherman
- Initial checkin, replacing previous trailing digit filenames.
- graphics/charts/barcharts.py 1.1 dinu_gherman
- Initial checkin, replacing previous trailing digit filenames.
- graphics/charts/axes.py 1.1 dinu_gherman
- Initial checkin, replacing previous trailing digit filenames.
- graphics/charts/textlabel0.py 1.7 dinu_gherman
- Removed file names to be replaced with non-trailing digit ones.
- graphics/charts/piechart0.py 1.6 dinu_gherman
- Removed file names to be replaced with non-trailing digit ones.
- graphics/charts/lineplot.py 1.2 dinu_gherman
- Removed file names to be replaced with non-trailing digit ones.
- graphics/charts/linechart0.py 1.3 dinu_gherman
- Removed file names to be replaced with non-trailing digit ones.
- graphics/charts/legends0.py 1.9 dinu_gherman
- Removed file names to be replaced with non-trailing digit ones.
- graphics/charts/barchart1.py 1.19 dinu_gherman
- Removed file names to be replaced with non-trailing digit ones.
- graphics/charts/axes0.py 1.18 dinu_gherman
- Removed file names to be replaced with non-trailing digit ones.
- rl_config.py 1.2 rgbecker
- Made imageCaching a positive quantity and proeprty of the canvas
- platypus/tables.py 1.37 rgbecker
- Made imageCaching a positive quantity and proeprty of the canvas
- pdfgen/pdfimages.py 1.10 rgbecker
- Made imageCaching a positive quantity and proeprty of the canvas
- pdfgen/canvas.py 1.71 rgbecker
- Made imageCaching a positive quantity and proeprty of the canvas
- docs/userguide/ch7_custom.py 1.7 rgbecker
- Made imageCaching a positive quantity and proeprty of the canvas
- docs/userguide/ch6_tables.py 1.17 rgbecker
- Made imageCaching a positive quantity and proeprty of the canvas
-##### 2001/03/20 #####
- graphics/charts/lineplot.py 1.1 dinu_gherman
- Initial checkin. Added new experimental time series x value axis.
- graphics/charts/axes0.py 1.17 dinu_gherman
- Initial checkin. Added new experimental time series x value axis.
- graphics/charts/legends0.py 1.8 dinu_gherman
- Fixed import buglet.
- graphics/charts/axes0.py 1.16 dinu_gherman
- Fixed buglet when used with bar charts.
- graphics/charts/barchart1.py 1.18 dinu_gherman
- Added horizontal bar charts plus samples.
-##### 2001/03/19 #####
- platypus/tables.py 1.36 aaron_watters
- changed handling of table element styles for better space/time. old code left commented
- test/test_paragraphs.py 1.7 andy_robinson
- Proving you get leading whitespace in print if you have leading whitespace inside the para tag.
-##### 2001/03/17 #####
- lib/styles.py 1.14 rgbecker
- Removed spurious CellStyle
- pdfbase/pdfmetrics.py 1.29 rgbecker
- Fixed up self test
-##### 2001/03/16 #####
- graphics/charts/barchart1.py 1.17 dinu_gherman
- Fixed bug for bar charts using attribute 'useAbsolute'.
- pdfbase/pdfmetrics.py 1.28 rgbecker
- Fix bad name error(s)
- pdfbase/_fontdata.py 1.4 rgbecker
- Fix bad name error(s)
- test/test_paragraphs.py 1.6 rgbecker
- Renamed config.py to rl_config.py
- test/test_graphics_speed.py 1.4 rgbecker
- Renamed config.py to rl_config.py
- platypus/test/testplatypus.py 1.23 rgbecker
- Renamed config.py to rl_config.py
- platypus/flowables.py 1.17 rgbecker
- Renamed config.py to rl_config.py
- platypus/doctemplate.py 1.39 rgbecker
- Renamed config.py to rl_config.py
- pdfgen/canvas.py 1.70 rgbecker
- Renamed config.py to rl_config.py
- pdfbase/pdfdoc.py 1.42 rgbecker
- Renamed config.py to rl_config.py
- lib/tocindex.py 1.7 rgbecker
- Renamed config.py to rl_config.py
- lib/fonts.py 1.6 rgbecker
- Renamed config.py to rl_config.py
- graphics/widgetbase.py 1.6 rgbecker
- Renamed config.py to rl_config.py
- graphics/shapes.py 1.10 rgbecker
- Renamed config.py to rl_config.py
- docs/userguide/genuserguide.py 1.40 rgbecker
- Renamed config.py to rl_config.py
- docs/userguide/examples.py 1.18 rgbecker
- Renamed config.py to rl_config.py
- docs/userguide/ch2_graphics.py 1.11 rgbecker
- Renamed config.py to rl_config.py
- docs/tools/rltemplate.py 1.10 rgbecker
- Renamed config.py to rl_config.py
- demos/pythonpoint/pythonpoint.py 1.31 rgbecker
- Renamed config.py to rl_config.py
- demos/gadflypaper/gfe.py 1.14 rgbecker
- Renamed config.py to rl_config.py
- utils/simpledoc.py 1.6 rgbecker
- Fixed typo added point 8 (upload to SF)
- utils/README 1.7 rgbecker
- Fixed typo added point 8 (upload to SF)
- pdfgen/pdfimages.py 1.9 rgbecker
- fixed noImageCaching
- pdfbase/_fontdata.py 1.3 rgbecker
- Changed in line with _rl_accel 0.3
- rl_config.py 1.1 rgbecker
- Renamed config.py to rl_config.py
- config.py 1.4 rgbecker
- Renamed config.py to rl_config.py
- pdfbase/pdfmetrics.py 1.27 rgbecker
- Added support for _rl_accel 0.3
- lib/_rl_accel.c 1.8 rgbecker
- Added _instanceStringWidth, imroved fontSize arg handling
-##### 2001/03/15 #####
- graphics/charts/barchart1.py 1.16 dinu_gherman
- Fixed baseline bug and added test sample.
- pdfbase/pdfmetrics.py 1.26 rgbecker
- addStandardFonts was spurious
- pdfgen/canvas.py 1.69 rgbecker
- pdfmetrics.addStandardFonts was spurious
- pdfbase/pdfmetrics.py 1.25 rgbecker
- Stuff for adding standardFonts
- pdfgen/canvas.py 1.68 rgbecker
- Use pdfmetrics addFonts
-##### 2001/03/14 #####
- graphics/charts/barchart1.py 1.15 dinu_gherman
- Added more samples.
-##### 2001/03/13 #####
- changes 1.7 dinu_gherman
- New release 1.05.
- __init__.py 1.11 dinu_gherman
- New release 1.05.
- test/test_graphics_charts.py 1.3 dinu_gherman
- Changed to use Legend0 instead of Swatches0.
- graphics/charts/legends0.py 1.7 dinu_gherman
- Renamed Swatches0 to Legend0. Stripped away horizontal bar charts temporyrily.
- graphics/charts/barchart1.py 1.14 dinu_gherman
- Renamed Swatches0 to Legend0. Stripped away horizontal bar charts temporyrily.
- graphics/charts/axes0.py 1.15 dinu_gherman
- Renamed Swatches0 to Legend0. Stripped away horizontal bar charts temporyrily.
- lib/setup.py 1.2 rgbecker
- Added sgmlop pyHnj extensions
- lib/_rl_accel.c 1.7 rgbecker
- Fixed up the defaultEncoding thing and added a version number
- lib/setup.py 1.1 rgbecker
- Initial version of distutils script
- lib/_rl_accel.c 1.6 rgbecker
- Initial version of distutils script
- graphics/charts/barchart1.py 1.13 dinu_gherman
- Enabled mono-bar charts and no-bar charts(!) plus more samples.
- graphics/charts/axes0.py 1.14 dinu_gherman
- Enabled mono-bar charts and no-bar charts(!) plus more samples.
- graphics/charts/barchart1.py 1.12 dinu_gherman
- Added new samples.
- graphics/charts/axes0.py 1.13 dinu_gherman
- Set minimum number of items for X/Y axes to 1 instead of 2.
- graphics/charts/axes0.py 1.12 dinu_gherman
- Fixed bug refusing exactly two data items.
- graphics/charts/axes0.py 1.11 dinu_gherman
- Improved axes.
- graphics/charts/axes0.py 1.10 dinu_gherman
- Improved X/Y axes.
- graphics/charts/axes0.py 1.9 dinu_gherman
- Improved YCategoryAxis slightly.
- test/test_graphics_charts.py 1.2 dinu_gherman
- Changed attribute postponed to _postponed in doctemplate.py. Added minor changes in shapes.py. Changed test_graphics_charts.py to no longer use page breaks.
- platypus/doctemplate.py 1.38 dinu_gherman
- Changed attribute postponed to _postponed in doctemplate.py. Added minor changes in shapes.py. Changed test_graphics_charts.py to no longer use page breaks.
- graphics/shapes.py 1.9 dinu_gherman
- Changed attribute postponed to _postponed in doctemplate.py. Added minor changes in shapes.py. Changed test_graphics_charts.py to no longer use page breaks.
- graphics/charts/legends0.py 1.6 andy_robinson
- Fixed broken cross reference to another example
- test/test_lib_colors.py 1.4 andy_robinson
- Added CMYK support to core
- pdfgen/canvas.py 1.67 andy_robinson
- Added CMYK support to core
- lib/colors.py 1.17 andy_robinson
- Added CMYK support to core
-##### 2001/03/12 #####
- test/test_lib_colors.py 1.3 andy_robinson
- Initial checkin of CMYKColor class
- lib/colors.py 1.16 andy_robinson
- Initial checkin of CMYKColor class
- graphics/charts/barchart1.py 1.11 dinu_gherman
- Added initial crude version of HorizontalBarChart class.
- graphics/charts/axes0.py 1.8 dinu_gherman
- Added dual versions for category and value axes. (not all tested)
- graphics/charts/piechart0.py 1.5 andy_robinson
- Fixed bug with defaultColors changes being erroneouslty banned
- graphics/charts/legends0.py 1.5 andy_robinson
- Fixed bug with defaultColors changes being erroneouslty banned
- test/test_graphics_charts.py 1.1 dinu_gherman
- Initial checkin.
- graphics/charts/legends0.py 1.4 dinu_gherman
- Fixed import error.
- test/test_pdfbase_pdfmetrics.py 1.3 rgbecker
- Changes to basic Font stuff, moved it to pdfmetrics
- test/test_paragraphs.py 1.5 rgbecker
- Changes to basic Font stuff, moved it to pdfmetrics
- pdfgen/canvas.py 1.66 rgbecker
- Changes to basic Font stuff, moved it to pdfmetrics
- pdfbase/pdfmetrics.py 1.24 rgbecker
- Changes to basic Font stuff, moved it to pdfmetrics
- pdfbase/pdfdoc.py 1.41 rgbecker
- Changes to basic Font stuff, moved it to pdfmetrics
- pdfbase/_fontdata.py 1.2 rgbecker
- Changes to basic Font stuff, moved it to pdfmetrics
- pdfgen/fonts0.py 1.4 rgbecker
- Removed fonts0 stuff to pdfbase.pdfmetrics
-##### 2001/03/08 #####
- test/test_pdfbase_pdfmetrics.py 1.2 rgbecker
- Initial split of pdfmetrics into code + database; some minor name adjustments
- pdfgen/fonts0.py 1.3 rgbecker
- Initial split of pdfmetrics into code + database; some minor name adjustments
- pdfgen/canvas.py 1.65 rgbecker
- Initial split of pdfmetrics into code + database; some minor name adjustments
- pdfbase/pdfmetrics.py 1.23 rgbecker
- Initial split of pdfmetrics into code + database; some minor name adjustments
- pdfbase/_fontdata.py 1.1 rgbecker
- Initial split of pdfmetrics into code + database; some minor name adjustments
- demos/stdfonts/stdfonts.py 1.10 rgbecker
- Initial split of pdfmetrics into code + database; some minor name adjustments
- test/test_platypus_paragraphs.py 1.3 dinu_gherman
- Added a multi-page paragraph test.
- docs/userguide/ch1_intro.py 1.12 rgbecker
- Changed bad character
-##### 2001/03/07 #####
- utils/simpledoc.py 1.5 rgbecker
- Changed things to use config.py for defaults
- test/test_paragraphs.py 1.4 rgbecker
- Changed things to use config.py for defaults
- platypus/test/testplatypus.py 1.22 rgbecker
- Changed things to use config.py for defaults
- platypus/tables.py 1.35 rgbecker
- Changed things to use config.py for defaults
- platypus/flowables.py 1.16 rgbecker
- Changed things to use config.py for defaults
- platypus/doctemplate.py 1.37 rgbecker
- Changed things to use config.py for defaults
- pdfgen/fonts0.py 1.2 rgbecker
- Changed things to use config.py for defaults
- pdfgen/canvas.py 1.64 rgbecker
- Changed things to use config.py for defaults
- pdfbase/pdfdoc.py 1.40 rgbecker
- Changed things to use config.py for defaults
- lib/tocindex.py 1.6 rgbecker
- Changed things to use config.py for defaults
- lib/pagesizes.py 1.6 rgbecker
- Changed things to use config.py for defaults
- lib/fonts.py 1.5 rgbecker
- Changed things to use config.py for defaults
- docs/userguide/genuserguide.py 1.39 rgbecker
- Changed things to use config.py for defaults
- docs/userguide/examples.py 1.17 rgbecker
- Changed things to use config.py for defaults
- docs/userguide/ch4_platypus_concepts.py 1.10 rgbecker
- Changed things to use config.py for defaults
- docs/userguide/ch2_graphics.py 1.10 rgbecker
- Changed things to use config.py for defaults
- docs/tools/rltemplate.py 1.9 rgbecker
- Changed things to use config.py for defaults
- demos/pythonpoint/pythonpoint.py 1.30 rgbecker
- Changed things to use config.py for defaults
- demos/odyssey/fodyssey.py 1.15 rgbecker
- Changed things to use config.py for defaults
- demos/gadflypaper/gfe.py 1.13 rgbecker
- Changed things to use config.py for defaults
- config.py 1.3 rgbecker
- Changed things to use config.py for defaults
- platypus/paragraph.py 1.51 rgbecker
- Added test 5
-##### 2001/03/06 #####
- lib/yaml.py 1.1 andy_robinson
- Added
- test/test_pdfbase_pdfmetrics.py 1.1 andy_robinson
- Added explicit font and encoding support
- platypus/paragraph.py 1.50 andy_robinson
- Added explicit font and encoding support
- platypus/doctemplate.py 1.36 andy_robinson
- Added explicit font and encoding support
- pdfgen/fonts0.py 1.1 andy_robinson
- Added explicit font and encoding support
- pdfgen/canvas.py 1.63 andy_robinson
- Added explicit font and encoding support
- pdfbase/pdfmetrics.py 1.22 andy_robinson
- Added explicit font and encoding support
- pdfbase/pdfdoc.py 1.39 andy_robinson
- Added explicit font and encoding support
- lib/graphicsdoc0.py 1.11 andy_robinson
- Added explicit font and encoding support
- demos/stdfonts/stdfonts.py 1.9 andy_robinson
- Added explicit font and encoding support
- config.py 1.2 andy_robinson
- Added explicit font and encoding support
- __init__.py 1.10 andy_robinson
- Added explicit font and encoding support
-##### 2001/03/02 #####
- lib/fonts.py 1.4 rgbecker
- Removed spurious import
- lib/fonts.py 1.3 rgbecker
- Added standard filename roots and findPFB
-##### 2001/03/01 #####
- pdfbase/pdfmetrics.py 1.21 rgbecker
- Fixed _rl_accel import
-##### 2001/02/28 #####
- platypus/paraparser.py 1.40 rgbecker
- Exception tests need str()
- pdfbase/pdfutils.py 1.20 rgbecker
- Exception tests need str()
- pdfbase/pdfmetrics.py 1.20 rgbecker
- Exception tests need str()
- lib/xmllib.py 1.6 rgbecker
- Exception tests need str()
- lib/utils.py 1.9 rgbecker
- Exception tests need str()
- lib/graphicsdoc0.py 1.10 rgbecker
- Exception tests need str()
- demos/odyssey/dodyssey.py 1.10 rgbecker
- slight twitch to onDraw test
- pdfbase/pdfutils.py 1.19 rgbecker
- Fixed typos
- graphics/renderPS.py 1.4 rgbecker
- Improved ImportError handling
- lib/xmllib.py 1.5 rgbecker
- Improved ImportError handling
- lib/utils.py 1.8 rgbecker
- Improved ImportError handling
- lib/graphicsdoc0.py 1.9 rgbecker
- Improved ImportError handling
- lib/_rl_accel.dsp 1.3 rgbecker
- Improved ImportError handling
- pdfbase/pdfutils.py 1.18 rgbecker
- Improved ImportError handling
- pdfbase/pdfmetrics.py 1.19 rgbecker
- Improved ImportError handling
- pdfbase/pdfdoc.py 1.38 rgbecker
- Improved ImportError handling
- pdfgen/pdfimages.py 1.8 rgbecker
- Imporved ImportError handling
- pdfgen/canvas.py 1.62 rgbecker
- Imporved ImportError handling
- platypus/paraparser.py 1.39 rgbecker
- Imporved ImportError handling
- graphics/charts/barchart1.py 1.10 dinu_gherman
- Changed bar chart labels to have always a boxAttribute of 'c'.
- test/test_graphics_charts_textlabel0.py 1.3 dinu_gherman
- Added meaningful tests for textAnchor attribute.
-##### 2001/02/27 #####
- graphics/charts/textlabel0.py 1.6 rgbecker
- Added auto height, width and leading
- test/test_graphics_charts_textlabel0.py 1.2 dinu_gherman
- Thoroughly changed test file.
- graphics/charts/barchart1.py 1.9 dinu_gherman
- Splitted function sample2 in sample2a and sample2b.
- test/test_graphics_charts_textlabel0.py 1.1 dinu_gherman
- Initial checkin.
- graphics/charts/textlabel0.py 1.5 dinu_gherman
- Removed commented test function.
-##### 2001/02/26 #####
- lib/docpy1.py 1.1 andy_robinson
- Initial checkin of new experiments
-##### 2001/02/24 #####
- graphics/widgets/signsandsymbols.py 1.7 dinu_gherman
- Added color attribute to SmileyFace0.
- graphics/charts/linechart0.py 1.2 dinu_gherman
- General improvements.
- graphics/charts/linechart0.py 1.1 dinu_gherman
- Initial checkin.
-##### 2001/02/23 #####
- test/test_pyfiles.py 1.1 dinu_gherman
- Initial checkin.
-##### 2001/02/22 #####
- pdfbase/pdfutils.py 1.17 dinu_gherman
- Removed commented encoding test functions.
- test/test_pdfbase_pdfutils.py 1.1 dinu_gherman
- Initial checkin.
- pdfbase/pdfutils.py 1.16 dinu_gherman
- Commented another test function.
- pdfbase/pdfutils.py 1.15 dinu_gherman
- Commented one test function.
- graphics/charts/textlabel0.py 1.4 dinu_gherman
- Minor corrections.
- graphics/charts/axes0.py 1.7 dinu_gherman
- Minor corrections.
-##### 2001/02/21 #####
- pdfgen/canvas.py 1.61 aaron_watters
- bugfix: code before of begin/end form should not appear in the form but in page
-##### 2001/02/19 #####
- graphics/charts/axes0.py 1.6 dinu_gherman
- Added different modes for joined x- and y-axes.
- graphics/charts/barchart1.py 1.8 dinu_gherman
- Added attribute mappings.
- graphics/charts/axes0.py 1.5 dinu_gherman
- Added attribute mappings.
- graphics/charts/axes0.py 1.4 dinu_gherman
- Changed test function to sample function.
- graphics/charts/legends0.py 1.3 dinu_gherman
- Added combined barchart sample.
- graphics/charts/legends0.py 1.2 dinu_gherman
- Minor changes.
- graphics/charts/legends0.py 1.1 dinu_gherman
- Initial checkin.
- test/test_pdfgen_pagemodes.py 1.2 dinu_gherman
- Added doc string.
- test/test_platypus_paragraphs.py 1.2 dinu_gherman
- Added doc strings.
- test/test_lib_sequencer.py 1.2 dinu_gherman
- Added doc strings.
- test/test_lib_colors.py 1.2 dinu_gherman
- Added doc strings.
- test/test_docstrings.py 1.2 dinu_gherman
- Fixed filename bug.
- test/test_docstrings.py 1.1 dinu_gherman
- Initial checkin.
-##### 2001/02/18 #####
- test/unittest.py 1.2 andy_robinson
- Resynched graphics test with Pie class; runAll now deletes previous PDF files incorporated latest unittest.py
- test/test_graphics_speed.py 1.3 andy_robinson
- Resynched graphics test with Pie class; runAll now deletes previous PDF files incorporated latest unittest.py
- test/runAll.py 1.2 andy_robinson
- Resynched graphics test with Pie class; runAll now deletes previous PDF files incorporated latest unittest.py
- test/00readme.txt 1.4 andy_robinson
- Resynched graphics test with Pie class; runAll now deletes previous PDF files incorporated latest unittest.py
-##### 2001/02/16 #####
- test/test_lib_colors.py 1.1 dinu_gherman
- Initil checkin.
- lib/colors.py 1.15 dinu_gherman
- Added color2bw function.
-##### 2001/02/15 #####
- graphics/charts/piechart0.py 1.4 andy_robinson
- Slimmed down and added demo methods
- graphics/charts/barchart1.py 1.7 andy_robinson
- Slimmed down and added demo methods
- graphics/charts/axes0.py 1.3 andy_robinson
- Slimmed down and added demo methods
- test/test_platypus_paragraphs.py 1.1 dinu_gherman
- Initial checkin.
-##### 2001/02/14 #####
- graphics/charts/barchart.py 1.4 dinu_gherman
- File has become obsolete. See barchart1.py.
- lib/graphicsdoc0.py 1.8 dinu_gherman
- Improved displaying widget properties (using pprint).
- pdfgen/test/testPageMode.py 1.3 dinu_gherman
- Moved to reportlab.test.
- test/test_pdfgen_pagemodes.py 1.1 dinu_gherman
- Initial checkin, moved from reportlab.pdfgen.test.
- test/test_lib_sequencer.py 1.1 dinu_gherman
- Initial checkin.
- test/runAll.py 1.1 dinu_gherman
- Initial checkin.
- test/test_platypus_toc.py 1.3 dinu_gherman
- Restructured entire test suite to make clean use of the unittest module.
- test/test_paragraphs.py 1.3 dinu_gherman
- Restructured entire test suite to make clean use of the unittest module.
- test/test_graphics_speed.py 1.2 dinu_gherman
- Restructured entire test suite to make clean use of the unittest module.
- test/00readme.txt 1.3 dinu_gherman
- Restructured entire test suite to make clean use of the unittest module.
-##### 2001/02/13 #####
- graphics/widgets/flags0.py 1.4 johnprecedo
- - Removed white borders from inside edges of flags. - added the word "sample" to the demo flag produced by Flag0 - dummy __init__ and demo methods added for Portugal0 - no example flag or properties are produced.
-##### 2001/03/13 #####
- test/test_graphics_charts.py 1.3 dinu_gherman
- Changed to use Legend0 instead of Swatches0.
- graphics/charts/legends0.py 1.7 dinu_gherman
- Renamed Swatches0 to Legend0. Stripped away horizontal bar charts temporyrily.
- graphics/charts/barchart1.py 1.14 dinu_gherman
- Renamed Swatches0 to Legend0. Stripped away horizontal bar charts temporyrily.
- graphics/charts/axes0.py 1.15 dinu_gherman
- Renamed Swatches0 to Legend0. Stripped away horizontal bar charts temporyrily.
- lib/setup.py 1.2 rgbecker
- Added sgmlop pyHnj extensions
- lib/_rl_accel.c 1.7 rgbecker
- Fixed up the defaultEncoding thing and added a version number
- lib/setup.py 1.1 rgbecker
- Initial version of distutils script
- lib/_rl_accel.c 1.6 rgbecker
- Initial version of distutils script
- graphics/charts/barchart1.py 1.13 dinu_gherman
- Enabled mono-bar charts and no-bar charts(!) plus more samples.
- graphics/charts/axes0.py 1.14 dinu_gherman
- Enabled mono-bar charts and no-bar charts(!) plus more samples.
- graphics/charts/barchart1.py 1.12 dinu_gherman
- Added new samples.
- graphics/charts/axes0.py 1.13 dinu_gherman
- Set minimum number of items for X/Y axes to 1 instead of 2.
- graphics/charts/axes0.py 1.12 dinu_gherman
- Fixed bug refusing exactly two data items.
- graphics/charts/axes0.py 1.11 dinu_gherman
- Improved axes.
- graphics/charts/axes0.py 1.10 dinu_gherman
- Improved X/Y axes.
- graphics/charts/axes0.py 1.9 dinu_gherman
- Improved YCategoryAxis slightly.
- test/test_graphics_charts.py 1.2 dinu_gherman
- Changed attribute postponed to _postponed in doctemplate.py. Added minor changes in shapes.py. Changed test_graphics_charts.py to no longer use page breaks.
- platypus/doctemplate.py 1.38 dinu_gherman
- Changed attribute postponed to _postponed in doctemplate.py. Added minor changes in shapes.py. Changed test_graphics_charts.py to no longer use page breaks.
- graphics/shapes.py 1.9 dinu_gherman
- Changed attribute postponed to _postponed in doctemplate.py. Added minor changes in shapes.py. Changed test_graphics_charts.py to no longer use page breaks.
- graphics/charts/legends0.py 1.6 andy_robinson
- Fixed broken cross reference to another example
- test/test_lib_colors.py 1.4 andy_robinson
- Added CMYK support to core
- pdfgen/canvas.py 1.67 andy_robinson
- Added CMYK support to core
- lib/colors.py 1.17 andy_robinson
- Added CMYK support to core
-##### 2001/03/12 #####
- test/test_lib_colors.py 1.3 andy_robinson
- Initial checkin of CMYKColor class
- lib/colors.py 1.16 andy_robinson
- Initial checkin of CMYKColor class
- graphics/charts/barchart1.py 1.11 dinu_gherman
- Added initial crude version of HorizontalBarChart class.
- graphics/charts/axes0.py 1.8 dinu_gherman
- Added dual versions for category and value axes. (not all tested)
- graphics/charts/piechart0.py 1.5 andy_robinson
- Fixed bug with defaultColors changes being erroneouslty banned
- graphics/charts/legends0.py 1.5 andy_robinson
- Fixed bug with defaultColors changes being erroneouslty banned
- test/test_graphics_charts.py 1.1 dinu_gherman
- Initial checkin.
- graphics/charts/legends0.py 1.4 dinu_gherman
- Fixed import error.
- test/test_pdfbase_pdfmetrics.py 1.3 rgbecker
- Changes to basic Font stuff, moved it to pdfmetrics
- test/test_paragraphs.py 1.5 rgbecker
- Changes to basic Font stuff, moved it to pdfmetrics
- pdfgen/canvas.py 1.66 rgbecker
- Changes to basic Font stuff, moved it to pdfmetrics
- pdfbase/pdfmetrics.py 1.24 rgbecker
- Changes to basic Font stuff, moved it to pdfmetrics
- pdfbase/pdfdoc.py 1.41 rgbecker
- Changes to basic Font stuff, moved it to pdfmetrics
- pdfbase/_fontdata.py 1.2 rgbecker
- Changes to basic Font stuff, moved it to pdfmetrics
- pdfgen/fonts0.py 1.4 rgbecker
- Removed fonts0 stuff to pdfbase.pdfmetrics
-##### 2001/03/08 #####
- test/test_pdfbase_pdfmetrics.py 1.2 rgbecker
- Initial split of pdfmetrics into code + database; some minor name adjustments
- pdfgen/fonts0.py 1.3 rgbecker
- Initial split of pdfmetrics into code + database; some minor name adjustments
- pdfgen/canvas.py 1.65 rgbecker
- Initial split of pdfmetrics into code + database; some minor name adjustments
- pdfbase/pdfmetrics.py 1.23 rgbecker
- Initial split of pdfmetrics into code + database; some minor name adjustments
- pdfbase/_fontdata.py 1.1 rgbecker
- Initial split of pdfmetrics into code + database; some minor name adjustments
- demos/stdfonts/stdfonts.py 1.10 rgbecker
- Initial split of pdfmetrics into code + database; some minor name adjustments
- test/test_platypus_paragraphs.py 1.3 dinu_gherman
- Added a multi-page paragraph test.
-##### 2001/03/07 #####
- test/test_paragraphs.py 1.4 rgbecker
- Changed things to use config.py for defaults
- platypus/test/testplatypus.py 1.22 rgbecker
- Changed things to use config.py for defaults
- platypus/tables.py 1.35 rgbecker
- Changed things to use config.py for defaults
- platypus/flowables.py 1.16 rgbecker
- Changed things to use config.py for defaults
- platypus/doctemplate.py 1.37 rgbecker
- Changed things to use config.py for defaults
- pdfgen/fonts0.py 1.2 rgbecker
- Changed things to use config.py for defaults
- pdfgen/canvas.py 1.64 rgbecker
- Changed things to use config.py for defaults
- pdfbase/pdfdoc.py 1.40 rgbecker
- Changed things to use config.py for defaults
- lib/tocindex.py 1.6 rgbecker
- Changed things to use config.py for defaults
- lib/pagesizes.py 1.6 rgbecker
- Changed things to use config.py for defaults
- lib/fonts.py 1.5 rgbecker
- Changed things to use config.py for defaults
- demos/pythonpoint/pythonpoint.py 1.30 rgbecker
- Changed things to use config.py for defaults
- demos/odyssey/fodyssey.py 1.15 rgbecker
- Changed things to use config.py for defaults
- demos/gadflypaper/gfe.py 1.13 rgbecker
- Changed things to use config.py for defaults
- config.py 1.3 rgbecker
- Changed things to use config.py for defaults
- platypus/paragraph.py 1.51 rgbecker
- Added test 5
-##### 2001/03/06 #####
- lib/yaml.py 1.1 andy_robinson
- Added
- test/test_pdfbase_pdfmetrics.py 1.1 andy_robinson
- Added explicit font and encoding support
- platypus/paragraph.py 1.50 andy_robinson
- Added explicit font and encoding support
- platypus/doctemplate.py 1.36 andy_robinson
- Added explicit font and encoding support
- pdfgen/fonts0.py 1.1 andy_robinson
- Added explicit font and encoding support
- pdfgen/canvas.py 1.63 andy_robinson
- Added explicit font and encoding support
- pdfbase/pdfmetrics.py 1.22 andy_robinson
- Added explicit font and encoding support
- pdfbase/pdfdoc.py 1.39 andy_robinson
- Added explicit font and encoding support
- lib/graphicsdoc0.py 1.11 andy_robinson
- Added explicit font and encoding support
- demos/stdfonts/stdfonts.py 1.9 andy_robinson
- Added explicit font and encoding support
- config.py 1.2 andy_robinson
- Added explicit font and encoding support
- __init__.py 1.10 andy_robinson
- Added explicit font and encoding support
-##### 2001/feb/09 release 1.03
-##### 2001/02/09 #####
- platypus/tableofcontents0.py 1.2 dinu_gherman
- Fixed wrapped line indentation.
- lib/graphicsdoc0.py 1.7 dinu_gherman
- Entirely reworked PDF and HTML doc builders.
- lib/docpy0.py 1.7 dinu_gherman
- Entirely reworked PDF and HTML doc builders.
- graphics/widgetbase.py 1.5 dinu_gherman
- Shortened two lines that might appear in doc tools.
- platypus/tableofcontents0.py 1.1 dinu_gherman
- Initial checkin.
-##### 2001/02/08 #####
- platypus/doctemplate.py 1.35 dinu_gherman
- Commented some disturbing print statements.
- lib/graphicsdoc0.py 1.6 dinu_gherman
- UmlPdfDocBuilder moved to docpy0.py. Changed some defaults and variable names. Fixed handling of packages with dotted names. Changed output of GraphPdfDocBuilder0.
- lib/docpy0.py 1.6 dinu_gherman
- UmlPdfDocBuilder moved here from graphicsdoc0.py. Changed some defaults and variable names. Fixed handling of packages with dotted names.
- graphics/charts/barchart1.py 1.6 dinu_gherman
- One long line reduced in length.
-##### 2001/02/07 #####
- lib/randomtext.py 1.6 johnprecedo
- fixed a typo
- lib/randomtext.py 1.5 johnprecedo
- Added a PYTHON theme (it had to be done...).
- lib/graphicsdoc0.py 1.5 dinu_gherman
- Added displaying drawings returned by functions.
- graphics/widgets/signsandsymbols.py 1.5 johnprecedo
- Corrected mistake in the doctsring for flags0.py and signsandsymbols.py.
- graphics/widgets/flags0.py 1.3 johnprecedo
- Corrected mistake in the doctsring for flags0.py and signsandsymbols.py.
- lib/graphicsdoc0.py 1.4 dinu_gherman
- Fixed import error.
- lib/graphicsdoc0.py 1.3 dinu_gherman
- Added an experimental PlatypusDocBuilder0. Uncommented UmlPdfDocBuilder0.
- lib/graphicsdoc0.py 1.2 dinu_gherman
- Moved utility functions from docpy0.py to graphicsdoc0.py.
- lib/docpy0.py 1.5 dinu_gherman
- Moved utility functions from docpy0.py to graphicsdoc0.py.
-##### 2001/02/06 #####
- lib/graphicsdoc0.py 1.1 dinu_gherman
- Initial checkin.
- lib/docpy0.py 1.4 dinu_gherman
- Stripped-off everything widget/graphics-specific.
- graphics/charts/barchart1.py 1.5 andy_robinson
- Added barLabelBudge property to support a customer
- graphics/renderbase.py 1.8 andy_robinson
- Fixes for QIR barchart presentation
- graphics/renderPS.py 1.3 andy_robinson
- Fixes for QIR barchart presentation
- graphics/charts/barchart1.py 1.4 andy_robinson
- Fixes for QIR barchart presentation
-##### 2001/02/05 #####
- pdfbase/pdfdoc.py 1.36 aaron_watters
- forms in forms now work
- graphics/widgets/signsandsymbols.py 1.4 johnprecedo
- bugfixes for the various demo() methods for widgets.
- lib/docpy0.py 1.3 dinu_gherman
- Fixed string joining for base class names.
- graphics/widgets/signsandsymbols.py 1.3 johnprecedo
- changes all demo() methods to centre graphics in boxes 200x100 boxes..
- lib/docpy0.py 1.2 dinu_gherman
- Modified inspect import.
- lib/docpy0.py 1.1 dinu_gherman
- Initial checkin.
- graphics/widgets/flags0.py 1.2 johnprecedo
- tightened up code for stripes in US and Greek flags.
- graphics/widgets/flags0.py 1.1 johnprecedo
- First checkin of file that used to be users/john/fwidgets.py. 20 flags as widgets - inlcuding UK, US, most EU members and a few non-EU European countries.
- pdfbase/pdfdoc.py 1.35 aaron_watters
- pdfdictionary has no has_key method bugfix. sorry.
-##### 2001/02/04 #####
- graphics/renderbase.py 1.7 andy_robinson
- Continued work on bar charts and support
- graphics/charts/textlabel0.py 1.3 andy_robinson
- Continued work on bar charts and support
- graphics/charts/barchart1.py 1.3 andy_robinson
- Continued work on bar charts and support
- graphics/charts/axes0.py 1.2 andy_robinson
- Continued work on bar charts and support
- graphics/charts/axes0.py 1.1 andy_robinson
- Broke out axes to separate module
- graphics/widgetbase.py 1.4 andy_robinson
- Fixed user node rendering bug, added barchart1
- graphics/shapes.py 1.8 andy_robinson
- Fixed user node rendering bug, added barchart1
- graphics/renderbase.py 1.6 andy_robinson
- Fixed user node rendering bug, added barchart1
- graphics/charts/textlabel0.py 1.2 andy_robinson
- Fixed user node rendering bug, added barchart1
- graphics/charts/barchart1.py 1.2 andy_robinson
- Fixed user node rendering bug, added barchart1
-##### 2001/02/02 #####
- pdfbase/pdfdoc.py 1.34 aaron_watters
- minor changes to support pdfparse
-##### 2001/02/01 #####
- graphics/testshapes.py 1.8 andy_robinson
- Working on chart framework
- graphics/shapes.py 1.7 andy_robinson
- Working on chart framework
- graphics/renderbase.py 1.5 andy_robinson
- Working on chart framework
- graphics/charts/textlabel0.py 1.1 andy_robinson
- Working on chart framework
- graphics/charts/barchart1.py 1.1 andy_robinson
- Working on chart framework
-##### 2001/01/30 #####
- lib/inspect.py 1.1 dinu_gherman
- Initial checkin.
- graphics/charts/barchart.py 1.3 aaron_watters
- more stuff, bug fixes etcetera....
- graphics/testshapes.py 1.7 andy_robinson
- Fixed group transform bug and added tests
- graphics/renderbase.py 1.4 andy_robinson
- Fixed group transform bug and added tests
- graphics/renderPS.py 1.2 andy_robinson
- Fixed group transform bug and added tests
- graphics/renderPDF.py 1.4 andy_robinson
- Fixed group transform bug and added tests
-##### 2001/01/29 #####
- graphics/widgets/signsandsymbols.py 1.2 johnprecedo
- Changed classnames to use the '0' convention for experimental. Changed way test print out is carried out. (all calls to classes wrapped up in a new function 'test()') some tidying up.
-##### 2001/01/28 #####
- graphics/testshapes.py 1.6 andy_robinson
- Fixes to CTM to support bitmap renderer; extra string rotation and group tests.
- graphics/renderbase.py 1.3 andy_robinson
- Fixes to CTM to support bitmap renderer; extra string rotation and group tests.
-##### 2001/01/26 #####
- graphics/widgetbase.py 1.3 andy_robinson
- Added barchart compatibility
- graphics/shapes.py 1.6 andy_robinson
- Added barchart compatibility
- graphics/charts/piechart0.py 1.3 andy_robinson
- Added barchart compatibility
- graphics/charts/barchart.py 1.2 aaron_watters
- added scales
-##### 2001/01/25 #####
- graphics/widgets/signsandsymbols.py 1.1 johnprecedo
- First checkin of file that used to be users/john/jwidgets.py. 12 new widgets.
- graphics/charts/barchart.py 1.1 aaron_watters
- A initial go at Aarons last rewrite of chart widgets :)
- graphics/testshapes.py 1.5 andy_robinson
- Added postscript renderer and tests, fixed renderer bugs
- graphics/shapes.py 1.5 andy_robinson
- Added postscript renderer and tests, fixed renderer bugs
- graphics/renderbase.py 1.2 andy_robinson
- Added postscript renderer and tests, fixed renderer bugs
- graphics/renderPS.py 1.1 andy_robinson
- Added postscript renderer and tests, fixed renderer bugs
- test/test_graphics_speed.py 1.1 andy_robinson
- added a crude benchmarking script
-##### 2001/01/24 #####
- graphics/testshapes.py 1.4 andy_robinson
- Added group tests, fixed font bug, resynched with Dinu
- graphics/shapes.py 1.4 andy_robinson
- Added group tests, fixed font bug, resynched with Dinu
- graphics/renderPDF.py 1.3 andy_robinson
- Added group tests, fixed font bug, resynched with Dinu
- graphics/testshapes.py 1.3 dinu_gherman
- Added unit testing plus error drawing.
- graphics/testshapes.py 1.2 dinu_gherman
- Added some String shapes.
- graphics/testshapes.py 1.1 dinu_gherman
- Initial checkin.
- graphics/widgetbase.py 1.2 andy_robinson
- Collection based piechart amd support for it.
- graphics/shapes.py 1.3 andy_robinson
- Collection based piechart amd support for it.
- graphics/renderPDF.py 1.2 andy_robinson
- Collection based piechart amd support for it.
- graphics/charts/piechart0.py 1.2 andy_robinson
- Collection based piechart amd support for it.
-##### 2001/01/23 #####
- config.py 1.1 johnprecedo
- Whoops, forgot
- graphics/shapes.py 1.2 johnprecedo
- typos fixed
-##### 2001/01/22 #####
- graphics/charts/piechart0.py 1.1 andy_robinson
- Experimental pie module
- graphics/widgets/__init__.py 1.1 andy_robinson
- Added widgets subpackage
- graphics/charts/__init__.py 1.1 andy_robinson
- Added charts package
- graphics/widgetbase.py 1.1 andy_robinson
- Added graphics module
- graphics/testdrawings.py 1.1 andy_robinson
- Added graphics module
- graphics/shapes.py 1.1 andy_robinson
- Added graphics module
- graphics/renderbase.py 1.1 andy_robinson
- Added graphics module
- graphics/renderPDF.py 1.1 andy_robinson
- Added graphics module
- graphics/__init__.py 1.1 andy_robinson
- Added graphics module
- pdfbase/pdfutils.py 1.14 dinu_gherman
- Modified docstrings.
-##### 2001/01/19 #####
- lib/abag.py 1.4 rgbecker
- Changed comment to be slightly more meaningful
- platypus/frames.py 1.12 dinu_gherman
- Minor changes.
- platypus/doctemplate.py 1.34 dinu_gherman
- Minor changes.
- lib/randomtext.py 1.4 dinu_gherman
- Minor changes.
-##### 2001/01/18 #####
- lib/colors.py 1.14 rgbecker
- Syncing with pingo
-##### 2001/01/12 #####
- pdfgen/textobject.py 1.22 dinu_gherman
- Minor neglectable changes.
- pdfgen/pdfimages.py 1.7 dinu_gherman
- Minor neglectable changes.
- pdfgen/pdfgeom.py 1.7 dinu_gherman
- Minor neglectable changes.
- pdfgen/pathobject.py 1.8 dinu_gherman
- Minor neglectable changes.
- pdfgen/canvas.py 1.60 dinu_gherman
- Minor neglectable changes.
- lib/utils.py 1.7 dinu_gherman
- Minor neglectable changes.
- lib/sequencer.py 1.10 dinu_gherman
- Minor neglectable changes.
-##### 2001/01/10 #####
- lib/abag.py 1.3 dinu_gherman
- Docstring modified.
-##### 2001/01/02 #####
- lib/randomtext.py 1.3 johnprecedo
- Minor tweaks (removing unneccesary capital letters etc).
- lib/randomtext.py 1.2 johnprecedo
- Added 5 new themes.
-##### 2000/12/29 #####
- test/test_paragraphs.py 1.2 andy_robinson
- Added a random text module
- platypus/flowables.py 1.15 andy_robinson
- Added a random text module
- lib/randomtext.py 1.1 andy_robinson
- Added a random text module
-##### 2000/12/25 #####
- platypus/flowables.py 1.14 rgbecker
- Allow for non string file names in Image.__init__
-##### 2000/12/20 #####
- pdfgen/pdfimages.py 1.6 andy_robinson
- death to two tabs!
-##### 2000/12/19 #####
- pdfgen/pdfimages.py 1.5 rgbecker
- Fix typo
- pdfgen/pdfimages.py 1.4 rgbecker
- Fix to PIL_image, changed to warnOnce
-##### 2000/12/18 #####
- platypus/paragraph.py 1.49 rgbecker
- More Dinu related fixes/edits
- pdfgen/canvas.py 1.59 andy_robinson
- Stripped a couple of tabs in an otherwise-space-delimited module
-##### 2000/12/17 #####
- platypus/paragraph.py 1.48 rgbecker
- Hack to fix Dinu's problem
- platypus/doctemplate.py 1.33 rgbecker
- Hack to fix Dinu's problem
-##### 2000/12/15 #####
- platypus/doctemplate.py 1.32 rgbecker
- Better error message
- platypus/paragraph.py 1.47 rgbecker
- Start on new simpler line splitter
- lib/abag.py 1.2 aaron_watters
- added a __repr__ for debug purposes
- platypus/paragraph.py 1.46 rgbecker
- Further Dinuistic fixes for rare cbDefn bugs
-##### 2000/12/14 #####
- platypus/test/testplatypus.py 1.21 rgbecker
- relativisation of firstLineIndent related code
- lib/tocindex.py 1.5 rgbecker
- relativisation of firstLineIndent related code
- lib/styles.py 1.13 rgbecker
- relativisation of firstLineIndent related code
- demos/pythonpoint/styles_modern.py 1.8 rgbecker
- relativisation of firstLineIndent related code
- demos/pythonpoint/styles_horrible.py 1.7 rgbecker
- relativisation of firstLineIndent related code
- demos/pythonpoint/pythonpoint.py 1.29 rgbecker
- relativisation of firstLineIndent related code
- lib/__init__.py 1.3 rgbecker
- Added RL_DEBUG environ flag
- lib/__BUILD.dsw 1.3 rgbecker
- Added RL_DEBUG environ flag
- pdfbase/pdfmetrics.py 1.18 rgbecker
- Added extension debug code
- platypus/paragraph.py 1.45 rgbecker
- Delete fix
- platypus/paragraph.py 1.44 rgbecker
- Fixed Dinu's tagmadness4 problem
-##### 2000/12/13 #####
- platypus/tables.py 1.34 aaron_watters
- added __repr__s and enhanced exception messages for debugging
- platypus/paragraph.py 1.43 aaron_watters
- added __repr__s and enhanced exception messages for debugging
- platypus/frames.py 1.11 aaron_watters
- added __repr__s and enhanced exception messages for debugging
- platypus/flowables.py 1.13 aaron_watters
- added __repr__s and enhanced exception messages for debugging
- platypus/test/testplatypus.py 1.20 rgbecker
- Try harder than ever for line cleaning and add bg alias
- platypus/paraparser.py 1.38 rgbecker
- Try harder than ever for line cleaning and add bg alias
- platypus/paragraph.py 1.42 rgbecker
- Try harder than ever for line cleaning and add bg alias
- platypus/paragraph.py 1.41 rgbecker
- Layout fixes; the text objects needed moves before & after and the bullet width was calculated after maxWidth was set. Try harder for space/tab removal.
- pdfgen/textobject.py 1.21 rgbecker
- Layout fixes; Td was absolute not relative to the beginning of the line
- platypus/tables.py 1.33 rgbecker
- Fixed confusing error message
-########### 1.02 Released 2000/12/11
-##### 2000/12/11 #####
- utils/README 1.5 rgbecker
- z7-->z9
- platypus/paraparser.py 1.37 rgbecker
- Comments and cosmetic changes
- platypus/paragraph.py 1.40 rgbecker
- Comments and cosmetic changes
-##### 2000/12/10 #####
- pdfgen/textobject.py 1.20 andy_robinson
- Fixed obscure stringwidth bugs in textobject and bullets
- pdfgen/canvas.py 1.58 andy_robinson
- Fixed obscure stringwidth bugs in textobject and bullets
- pdfbase/pdfmetrics.py 1.17 andy_robinson
- Fixed obscure stringwidth bugs in textobject and bullets
- lib/styles.py 1.12 andy_robinson
- Fixed obscure stringwidth bugs in textobject and bullets
- platypus/paraparser.py 1.36 andy_robinson
- Added a text background color attribute
- platypus/paragraph.py 1.39 andy_robinson
- Added a text background color attribute
- lib/styles.py 1.11 andy_robinson
- Added a text background color attribute
- test/test_paragraphs.py 1.1 andy_robinson
- Added some paragraph style tests
- lib/styles.py 1.10 andy_robinson
- Added a title style to support rml2pdf
-##### 2000/12/08 #####
- platypus/paragraph.py 1.38 rgbecker
- Clean up one word justified paragraph fix.
-##### 2000/12/07 #####
- platypus/paragraph.py 1.37 aaron_watters
- divide by zero problem for one word paragraphs
-##### 2000/12/06 #####
- docs/userguide/ch4_platypus_concepts.py 1.9 aaron_watters
- less than should be less than or equal in example
- platypus/paragraph.py 1.36 rgbecker
- Fixed line wrap problem
-##### 2000/12/05 #####
- demos/pythonpoint/pythonpoint.xml 1.12 andy_robinson
- Changed link to Michael Wiedmann's DTD
- platypus/paraparser.py 1.35 rgbecker
- Fixed typo
-##### 2000/12/04 #####
- extensions/README 1.2 rgbecker
- Spelling corrections
- platypus/paraparser.py 1.34 rgbecker
- More cosmetic changes
- platypus/paragraph.py 1.35 rgbecker
- Cosmetic changes
- lib/tocindex.py 1.4 rgbecker
- Minor fixes to appends
-##### 2000/12/01 #####
- platypus/paragraph.py 1.34 aaron_watters
- mods permitting late string conversions
- pdfgen/canvas.py 1.57 aaron_watters
- mods permitting late string conversions
- lib/utils.py 1.6 aaron_watters
- mods permitting late string conversions
-##### 2000/11/29 #####
- platypus/xpreformatted.py 1.12 rgbecker
- Semantic Name changes
- platypus/paraparser.py 1.33 rgbecker
- Semantic Name changes
- platypus/paragraph.py 1.33 rgbecker
- Semantic Name changes
- platypus/__init__.py 1.12 rgbecker
- Semantic Name changes
- lib/abag.py 1.1 rgbecker
- Initial version split from paraparser.py
-##### 2000/11/24 #####
- platypus/paragraph.py 1.32 rgbecker
- Fixed missing linefeed bug for cbDefn frag at end of line
- lib/_rl_accel.c 1.5 rgbecker
- Fixed non-working cast, added getInfo
-##### 2000/11/23 #####
- platypus/paraparser.py 1.32 rgbecker
- Slight optimisation in handle_data for cbdefn frags
- platypus/paragraph.py 1.31 rgbecker
- Force cbDefn frags to be not Same
- platypus/flowables.py 1.12 andy_robinson
- Added working table of contents framework
- platypus/doctemplate.py 1.31 andy_robinson
- Added working table of contents framework
- lib/tocindex.py 1.3 andy_robinson
- Added working table of contents framework
- lib/styles.py 1.9 andy_robinson
- Added working table of contents framework
-##### 2000/11/21 #####
- platypus/paragraph.py 1.30 rgbecker
- Fixed call back handling in _getFragWords
- lib/tocindex.py 1.2 andy_robinson
- Now formats correctly, no dynamic build stuff yet.
- lib/tocindex.py 1.1 andy_robinson
- Initial checkin
-##### 2000/11/13 #####
- platypus/paraparser.py 1.31 rgbecker
- More hacks
- platypus/paragraph.py 1.29 rgbecker
- More hacks
- platypus/paraparser.py 1.30 rgbecker
- Fixes to stupid parser
- platypus/paraparser.py 1.29 rgbecker
- Added onDraw tag to paragraphs
- platypus/paragraph.py 1.28 rgbecker
- Added onDraw tag to paragraphs
- pdfbase/pdfmetrics.py 1.16 rgbecker
- Added onDraw tag to paragraphs
- demos/odyssey/dodyssey.py 1.9 rgbecker
- Added onDraw tag to paragraphs
-##### 2000/11/08 #####
- test/unittest.py 1.1 andy_robinson
- Added unittest.py and packagized
- test/__init__.py 1.1 andy_robinson
- Added unittest.py and packagized
- pdfbase/pdfdoc.py 1.33 andy_robinson
- Changes to fix font encodings
- demos/stdfonts/stdfonts.py 1.8 andy_robinson
- Changes to fix font encodings
- utils/runtests.py 1.15 andy_robinson
- Added an exclusion for 'test/unittest.py' in the test suite.
- test/00readme.txt 1.2 andy_robinson
- Fixed font encoding lookup, metrics for JPython, created test directory
- pdfbase/pdfmetrics.py 1.15 andy_robinson
- Fixed font encoding lookup, metrics for JPython, created test directory
- pdfbase/pdfdoc.py 1.32 andy_robinson
- Fixed font encoding lookup, metrics for JPython, created test directory
-##### 2000/11/06 #####
- demos/pythonpoint/pythonpoint.xml 1.11 andy_robinson
- compression on by default.
- demos/pythonpoint/pythonpoint.py 1.28 andy_robinson
- compression on by default.
-##### 2000/11/05 #####
- platypus/doctemplate.py 1.30 andy_robinson
- Fixed page transitions; extended Pythonpoint
- pdfgen/canvas.py 1.56 andy_robinson
- Fixed page transitions; extended Pythonpoint
- pdfbase/pdfdoc.py 1.31 andy_robinson
- Fixed page transitions; extended Pythonpoint
- demos/pythonpoint/stdparser.py 1.13 andy_robinson
- Fixed page transitions; extended Pythonpoint
- demos/pythonpoint/pythonpoint.xml 1.10 andy_robinson
- Fixed page transitions; extended Pythonpoint
- demos/pythonpoint/pythonpoint.py 1.27 andy_robinson
- Fixed page transitions; extended Pythonpoint
- test/00readme.txt 1.1 andy_robinson
- initial checkin
- docs/userguide/genuserguide.py 1.38 andy_robinson
- UserGuide now resizes template header to fit page size
- docs/tools/rltemplate.py 1.8 andy_robinson
- UserGuide now resizes template header to fit page size
-##### 2000/11/01 #####
- platypus/paragraph.py 1.27 andy_robinson
- Added experimental method getActualLineWidths0
-##### 2000/10/26 #####
- platypus/tables.py 1.32 rgbecker
- Layout error fixes
- platypus/paragraph.py 1.26 rgbecker
- Layout error fixes
- platypus/flowables.py 1.11 rgbecker
- Layout error fixes
- docs/userguide/genuserguide.py 1.37 rgbecker
- Make page size an optional argument
-##### 2000/10/25 #####
- utils/simpledoc.py 1.4 rgbecker
- Changed to indirect copyright
- utils/runtests.py 1.14 rgbecker
- Changed to indirect copyright
- utils/license.py 1.4 rgbecker
- Changed to indirect copyright
- utils/license.c 1.4 rgbecker
- Changed to indirect copyright
- utils/daily.py 1.38 rgbecker
- Changed to indirect copyright
- utils/cvslh.py 1.4 rgbecker
- Changed to indirect copyright
- utils/cvs_check.py 1.7 rgbecker
- Changed to indirect copyright
- utils/compress_images.py 1.2 rgbecker
- Changed to indirect copyright
- platypus/test/testtables.py 1.12 rgbecker
- Changed to indirect copyright
- platypus/xpreformatted.py 1.11 rgbecker
- Changed to indirect copyright
- platypus/test/testplatypus.py 1.19 rgbecker
- Changed to indirect copyright
- platypus/tables.py 1.31 rgbecker
- Changed to indirect copyright
- platypus/paraparser.py 1.28 rgbecker
- Changed to indirect copyright
- platypus/paragraph.py 1.25 rgbecker
- Changed to indirect copyright
- platypus/frames.py 1.10 rgbecker
- Changed to indirect copyright
- platypus/flowables.py 1.10 rgbecker
- Changed to indirect copyright
- platypus/doctemplate.py 1.29 rgbecker
- Changed to indirect copyright
- platypus/__init__.py 1.11 rgbecker
- Changed to indirect copyright
- pdfgen/textobject.py 1.19 rgbecker
- Changed to indirect copyright
- pdfgen/test/testpdfgen.py 1.16 rgbecker
- Changed to indirect copyright
- pdfgen/test/testPageMode.py 1.2 rgbecker
- Changed to indirect copyright
- pdfgen/pdfimages.py 1.3 rgbecker
- Changed to indirect copyright
- pdfgen/pdfgeom.py 1.6 rgbecker
- Changed to indirect copyright
- pdfgen/pathobject.py 1.7 rgbecker
- Changed to indirect copyright
- pdfgen/canvas.py 1.55 rgbecker
- Changed to indirect copyright
- pdfgen/__init__.py 1.5 rgbecker
- Changed to indirect copyright
- pdfbase/pdfutils.py 1.13 rgbecker
- Changed to indirect copyright
- pdfbase/pdfmetrics.py 1.14 rgbecker
- Changed to indirect copyright
- pdfbase/pdfdoc.py 1.30 rgbecker
- Changed to indirect copyright
- pdfbase/__init__.py 1.5 rgbecker
- Changed to indirect copyright
- lib/utils.py 1.5 rgbecker
- Changed to indirect copyright
- lib/units.py 1.2 rgbecker
- Changed to indirect copyright
- lib/styles.py 1.8 rgbecker
- Changed to indirect copyright
- lib/sequencer.py 1.9 rgbecker
- Changed to indirect copyright
- lib/pagesizes.py 1.5 rgbecker
- Changed to indirect copyright
- lib/logger.py 1.2 rgbecker
- Changed to indirect copyright
- lib/fonts.py 1.2 rgbecker
- Changed to indirect copyright
- lib/enums.py 1.2 rgbecker
- Changed to indirect copyright
- lib/corp.py 1.2 rgbecker
- Changed to indirect copyright
- lib/colors.py 1.13 rgbecker
- Changed to indirect copyright
- lib/_rl_accel.c 1.4 rgbecker
- Changed to indirect copyright
- lib/__init__.py 1.2 rgbecker
- Changed to indirect copyright
- extensions/__init__.py 1.2 rgbecker
- Changed to indirect copyright
- docs/userguide/t_parse.py 1.2 rgbecker
- Changed to indirect copyright
- docs/userguide/platdemos.py 1.4 rgbecker
- Changed to indirect copyright
- docs/userguide/genuserguide.py 1.36 rgbecker
- Changed to indirect copyright
- docs/userguide/examples.py 1.16 rgbecker
- Changed to indirect copyright
- docs/userguide/ch8_future.py 1.3 rgbecker
- Changed to indirect copyright
- docs/userguide/ch7_custom.py 1.6 rgbecker
- Changed to indirect copyright
- docs/userguide/ch6_tables.py 1.16 rgbecker
- Changed to indirect copyright
- docs/userguide/ch5_paragraphs.py 1.6 rgbecker
- Changed to indirect copyright
- docs/userguide/ch4_platypus_concepts.py 1.8 rgbecker
- Changed to indirect copyright
- docs/userguide/ch3_pdffeatures.py 1.7 rgbecker
- Changed to indirect copyright
- docs/userguide/ch2_graphics.py 1.9 rgbecker
- Changed to indirect copyright
- docs/userguide/ch1_intro.py 1.11 rgbecker
- Changed to indirect copyright
- docs/userguide/app_demos.py 1.7 rgbecker
- Changed to indirect copyright
- docs/tools/yaml2pdf.py 1.8 rgbecker
- Changed to indirect copyright
- docs/tools/yaml.py 1.9 rgbecker
- Changed to indirect copyright
- docs/tools/stylesheet.py 1.7 rgbecker
- Changed to indirect copyright
- docs/tools/rltemplate.py 1.7 rgbecker
- Changed to indirect copyright
- docs/tools/codegrab.py 1.5 rgbecker
- Changed to indirect copyright
- demos/tests/testdemos.py 1.5 rgbecker
- Changed to indirect copyright
- demos/stdfonts/stdfonts.py 1.7 rgbecker
- Changed to indirect copyright
- demos/pythonpoint/styles_modern.py 1.7 rgbecker
- Changed to indirect copyright
- demos/pythonpoint/styles_horrible.py 1.6 rgbecker
- Changed to indirect copyright
- demos/pythonpoint/stdparser.py 1.12 rgbecker
- Changed to indirect copyright
- demos/pythonpoint/pythonpoint.py 1.26 rgbecker
- Changed to indirect copyright
- demos/pythonpoint/customshapes.py 1.3 rgbecker
- Changed to indirect copyright
- demos/py2pdf/idle_print.py 1.7 rgbecker
- Changed to indirect copyright
- demos/odyssey/odyssey.py 1.9 rgbecker
- Changed to indirect copyright
- demos/odyssey/fodyssey.py 1.14 rgbecker
- Changed to indirect copyright
- demos/odyssey/dodyssey.py 1.8 rgbecker
- Changed to indirect copyright
- demos/gadflypaper/gfe.py 1.12 rgbecker
- Changed to indirect copyright
- demos/colors/colortest.py 1.2 rgbecker
- Changed to indirect copyright
- __init__.py 1.7 rgbecker
- Changed to indirect copyright
- README 1.2 rgbecker
- Changed to indirect copyright
-##### 2000/10/24 #####
- license.txt 1.1 rgbecker
- Initial separate license file
- utils/copyrite.py 1.1 rgbecker
- Copyright changes
- utils/copyr.txt 1.1 rgbecker
- Copyright changes
- pdfgen/pdfimages.py 1.2 rgbecker
- Fix zlib import bug
- pdfgen/pdfimages.py 1.1 aaron_watters
- image functionality factored out of canvas.py initial checkin. tests pass
- pdfgen/canvas.py 1.54 aaron_watters
- sliced out image functionality (oops adding in pdfimages.py next) tests pass
-##### 2000/10/23 #####
- platypus/paragraph.py 1.24 rgbecker
- Added J Alet's bug case
- demos/pythonpoint/pythonpoint.xml 1.9 andy_robinson
- Corrected bad end tags and added links to Michael Wiedmann's DTD
-##### 2000/10/22 #####
- demos/pythonpoint/pythonpoint.xml 1.8 andy_robinson
- Modified the documentation to correct Michael Wiedmann's error reports.
-##### 2000/10/21 #####
- lib/sgmlop.dsp 1.2 rgbecker
- hyphen.c includes substrings.pl in comment
- lib/pyHnj.dsp 1.2 rgbecker
- hyphen.c includes substrings.pl in comment
- lib/hyphen.c 1.2 rgbecker
- hyphen.c includes substrings.pl in comment
- lib/_rl_accel.dsp 1.2 rgbecker
- hyphen.c includes substrings.pl in comment
- lib/README.extensions 1.2 rgbecker
- hyphen.c includes substrings.pl in comment
-##### 2000/10/19 #####
- pdfbase/pdfdoc.py 1.29 rgbecker
- Aaron's latest update from the newslist
-##### 2000/10/18 #####
- pdfbase/pdfdoc.py 1.28 aaron_watters
- undid last checkin and added an option for a default outline (different fix)
- pdfbase/pdfdoc.py 1.27 aaron_watters
- moved the outline preprocessing step into the format method (fixes testing error)
- pdfgen/canvas.py 1.53 aaron_watters
- complete revision of pdfdoc. Not finished (compression missing, testing needed) I got Robin's last change in at the last moment :)
- pdfbase/pdfdoc.py 1.26 aaron_watters
- complete revision of pdfdoc. Not finished (compression missing, testing needed) I got Robin's last change in at the last moment :)
-##### 2000/10/15 #####
- pdfgen/test/testPageMode.py 1.1 andy_robinson
- Test of pageMode functions.
- pdfgen/canvas.py 1.52 andy_robinson
- Added showFullScreen0
- pdfbase/pdfdoc.py 1.25 andy_robinson
- Added showFullScreen0
-########### 1.01 Released 2000/10/10
-##### 2000/10/05 #####
- pdfbase/pdfutils.py 1.12 rgbecker
- Fix indentation
- pdfbase/pdfutils.py 1.11 rgbecker
- Changes to make freezing easier
- pdfbase/pdfmetrics.py 1.13 rgbecker
- Changes to make freezing easier
- lib/xmllib.py 1.4 rgbecker
- Changes to make freezing easier
- lib/utils.py 1.4 rgbecker
- Changes to make freezing easier
-##### 2000/10/04 #####
- platypus/xpreformatted.py 1.10 rgbecker
- Fixed copying bug
-##### 2000/10/03 #####
- lib/styles.py 1.7 rgbecker
- Code needs a firstLineIndent same as normal lineIndent
- platypus/paragraph.py 1.23 rgbecker
- Justified XPreformatteds are OK
-##### 2000/10/02 #####
- platypus/frames.py 1.9 rgbecker
- Fixed the atTop test again
- platypus/frames.py 1.8 rgbecker
- Fixed the atTop test
- platypus/xpreformatted.py 1.9 rgbecker
- Added license
- platypus/xpreformatted.py 1.8 rgbecker
- Splitting fixes. Mostly caused by XPreformatted not doing it right.
- platypus/paragraph.py 1.22 rgbecker
- Splitting fixes. Mostly caused by XPreformatted not doing it right.
-##### 2000/10/01 #####
- platypus/frames.py 1.7 rgbecker
- Fixed atTop bugs thanks to the effbot
- platypus/xpreformatted.py 1.7 rgbecker
- Cleaning up XPreformatted
- platypus/xpreformatted.py 1.6 rgbecker
- Removed space split and readding
-##### 2000/09/27 #####
- pdfbase/pdfmetrics.py 1.12 andy_robinson
- more work on metrics and encodings for custom fonts
- pdfbase/pdfmetrics.py 1.11 andy_robinson
- Begun work on loading new AFM files
- lib/colors.py 1.12 rgbecker
- Fix for sun compiler
- lib/_rl_accel.c 1.3 rgbecker
- Fix for sun compiler
-##### 2000/09/25 #####
- lib/styles.py 1.6 andy_robinson
- added has_key method to stylesheet1
- demos/stdfonts/stdfonts.py 1.6 andy_robinson
- Allows you to generate hex, decimal or octal labels
-##### 2000/09/08 #####
- pdfbase/pdfdoc.py 1.24 rgbecker
- Paul Eddington's unix tell() returns a LongIntType bugfix
-##### 2000/09/04 #####
- pdfgen/canvas.py 1.51 rgbecker
- Fix spurious comment reference to layout
-##### 2000/09/01 #####
- docs/userguide/ch2_graphics.py 1.8 rgbecker
- Correct size setting thanks to Werner Louche
- pdfgen/textobject.py 1.18 rgbecker
- Improved optimisation checks
- pdfgen/canvas.py 1.50 rgbecker
- Improved optimisation checks
- pdfgen/textobject.py 1.17 rgbecker
- Fixed potential 'Td' bug
-##### 2000/08/31 #####
- pdfgen/canvas.py 1.49 rgbecker
- Fix transform optimisation
-##### 2000/08/29 #####
- lib/pyHnj.dsp 1.1 rgbecker
- Initial version of D Yoo's pyHnj
- lib/utils.py 1.3 rgbecker
- Initial version of D Yoo's pyHnj
- lib/pyHnjmodule.c 1.1 rgbecker
- Initial version of D Yoo's pyHnj
- lib/hyphen.mashed 1.1 rgbecker
- Initial version of D Yoo's pyHnj
- lib/hyphen.h 1.1 rgbecker
- Initial version of D Yoo's pyHnj
- lib/hyphen.c 1.1 rgbecker
- Initial version of D Yoo's pyHnj
- lib/hnjalloc.h 1.1 rgbecker
- Initial version of D Yoo's pyHnj
- lib/hnjalloc.c 1.1 rgbecker
- Initial version of D Yoo's pyHnj
- lib/__BUILD.dsw 1.2 rgbecker
- Initial version of D Yoo's pyHnj
- lib/Setup.in 1.2 rgbecker
- Initial version of D Yoo's pyHnj
- lib/Makefile.pre.in 1.3 rgbecker
- Initial version of D Yoo's pyHnj
- extensions/__init__.py 1.1 rgbecker
- Initial version
- extensions/README 1.1 rgbecker
- Initial version
-##### 2000/08/25 #####
- platypus/xpreformatted.py 1.5 rgbecker
- Further tweaks of XPreformatted
- platypus/paragraph.py 1.21 rgbecker
- Further tweaks of XPreformatted
- docs/userguide/ch6_tables.py 1.15 rgbecker
- Further tweaks of XPreformatted
-##### 2000/08/24 #####
- platypus/xpreformatted.py 1.4 rgbecker
- XPreformatted fixed empty lines and leading space
- platypus/paragraph.py 1.20 rgbecker
- XPreformatted fixed empty lines and leading space
- lib/utils.py 1.2 rgbecker
- Added _className func
- docs/userguide/ch6_tables.py 1.14 rgbecker
- harder test of XPreformatted
- docs/userguide/ch6_tables.py 1.13 rgbecker
- Added blank lines to XPreformatted sample
- platypus/xpreformatted.py 1.3 rgbecker
- Fixes to _dedenter
- platypus/flowables.py 1.9 rgbecker
- Fixes to _dedenter
- docs/userguide/genuserguide.py 1.35 rgbecker
- Added Mac Intro
- docs/userguide/ch1_intro.py 1.10 rgbecker
- Added Mac Intro
- docs/images/Python_1.6a2_HINT.gif 1.1 rgbecker
- Initial versions for Mac intro
- docs/images/Python_1.6a2.gif 1.1 rgbecker
- Initial versions for Mac intro
- docs/images/Edit_Prefs.gif 1.1 rgbecker
- Initial versions for Mac intro
- platypus/xpreformatted.py 1.2 rgbecker
- XPreformatted first fixes; now runs
- platypus/flowables.py 1.8 rgbecker
- XPreformatted first fixes; now runs
- platypus/__init__.py 1.10 rgbecker
- XPreformatted first fixes; now runs
- docs/userguide/genuserguide.py 1.34 rgbecker
- Preformatted docco added
- docs/userguide/ch6_tables.py 1.12 rgbecker
- Preformatted docco added
- pdfbase/pdfdoc.py 1.23 aaron_watters
- change to PDFLiteral to support "lazy string conversions" (to support lazy crosslinks)
-##### 2000/08/23 #####
- platypus/xpreformatted.py 1.1 rgbecker
- Initial semi working version
- platypus/paragraph.py 1.19 rgbecker
- Preparing for cleanup
-##### 2000/08/20 #####
- pdfgen/canvas.py 1.48 andy_robinson
- Changed an argument syntax for clarity
- demos/pythonpoint/leftlogo.a85 1.3 andy_robinson
- Added as binary file
- demos/pythonpoint/leftlogo.a85 1.2 andy_robinson
- Removed ASCII file as Mac was corrupting it
-##### 2000/08/17 #####
- platypus/paragraph.py 1.18 rgbecker
- Various brutal changes to paragraph, canvas and textobject for speed/size
- pdfgen/textobject.py 1.16 rgbecker
- Various brutal changes to paragraph, canvas and textobject for speed/size
- pdfgen/canvas.py 1.47 rgbecker
- Various brutal changes to paragraph, canvas and textobject for speed/size
- demos/odyssey/odyssey.txt 1.8 rgbecker
- Various brutal changes to paragraph, canvas and textobject for speed/size
- platypus/paraparser.py 1.27 rgbecker
- Changed test formatting
-##### 2000/08/16 #####
- pdfbase/pdfmetrics.py 1.10 rgbecker
- Start using _rl_accel
-##### 2000/08/12 #####
- lib/colors.py 1.11 rgbecker
- Fix missing parens
-##### 2000/08/11 #####
- lib/colors.py 1.10 rgbecker
- added rgb2cmyk
- docs/userguide/ch7_custom.py 1.5 rgbecker
- Added rotated image derived class example
-##### 2000/08/09 #####
- pdfbase/pdfdoc.py 1.22 rgbecker
- Andy's Symbol/Zapf font fix
-##### 2000/08/03 #####
- pdfbase/pdfutils.py 1.10 rgbecker
- Robin's take on Bernhard Herzog's fix to A85 decode
- platypus/frames.py 1.6 rgbecker
- Changing to packer led positioning
- platypus/flowables.py 1.7 rgbecker
- Changing to packer led positioning
- lib/_rl_accel.c 1.2 rgbecker
- Linux/GnuC fixes
- lib/Makefile.pre.in 1.2 rgbecker
- Linux/GnuC fixes
-##### 2000/08/02 #####
- docs/userguide/genuserguide.py 1.33 rgbecker
- Table cell updates
- docs/userguide/ch6_tables.py 1.11 rgbecker
- Table cell updates
- docs/images/replogo.gif 1.3 rgbecker
- Readded with -kb flag
- docs/images/replogo.gif 1.2 rgbecker
- Removed bad replogo.gif
- platypus/tables.py 1.30 rgbecker
- Flowable cell fixes/changes
-##### 2000/08/01 #####
- platypus/tables.py 1.29 rgbecker
- Fixed flowable valign bottom/top middle maybe
- platypus/tables.py 1.28 rgbecker
- Additions/Improvements to LINE CMD Splitting
- pdfgen/textobject.py 1.15 rgbecker
- Converted to using fp_str
- pdfgen/canvas.py 1.46 rgbecker
- Converted to using fp_str
- utils/runtests.py 1.13 rgbecker
- Added -time flag
- lib/README.extensions 1.1 rgbecker
- Initial version
- lib/Makefile.pre.in 1.1 rgbecker
- Initial version
- pdfbase/pdfutils.py 1.9 rgbecker
- moved accelerators to lib
- pdfbase/pdfmetrics.py 1.9 rgbecker
- moved accelerators to lib
- pdfbase/_streams.c 1.2 rgbecker
- moved accelerators to lib
- pdfbase/_pdfmetrics.c 1.3 rgbecker
- moved accelerators to lib
- pdfbase/Setup.in 1.2 rgbecker
- moved accelerators to lib
- lib/Setup.in 1.1 rgbecker
- Initial version
- lib/utils.py 1.1 rgbecker
- Initial version
- lib/sgmlop.dsp 1.1 rgbecker
- Initial version
- lib/sgmlop.c 1.1 rgbecker
- Initial version
- lib/_rl_accel.dsp 1.1 rgbecker
- Initial version
- lib/_rl_accel.c 1.1 rgbecker
- Initial version
- lib/__BUILD.dsw 1.1 rgbecker
- Initial version
- pdfgen/textobject.py 1.14 andy_robinson
- Updated old doc string
-##### 2000/07/31 #####
- pdfgen/canvas.py 1.45 rgbecker
- B Herzog fix to dimension formats
-##### 2000/07/30 #####
- platypus/frames.py 1.5 rgbecker
- geometry changing attributes now work
-##### 2000/07/28 #####
- pdfgen/textobject.py 1.13 rgbecker
- Bernhard herzog inspired fixes
- pdfgen/canvas.py 1.44 rgbecker
- Bernhard herzog inspired fixes
-##### 2000/07/26 #####
- pdfbase/pdfmetrics.py 1.8 rgbecker
- Accelerator rearrangements
- pdfbase/_pdfmetrics.c 1.2 rgbecker
- Accelerator rearrangements
- lib/logger.py 1.1 rgbecker
- Initial version
-##### 2000/07/25 #####
- docs/userguide/ch3_pdffeatures.py 1.6 rgbecker
- Bruce Eckel spotted these typos.
- docs/userguide/ch2_graphics.py 1.7 rgbecker
- Bruce Eckel spotted these typos.
- docs/userguide/ch1_intro.py 1.9 rgbecker
- Bruce Eckel spotted these typos.
-##### 2000/07/20 #####
- platypus/doctemplate.py 1.28 rgbecker
- Added pagesize to canvasmaker call
- README.pdfgen.txt 1.8 rgbecker
- Release 1.00 Administration
- README 1.1 rgbecker
- Release 1.00 Administration
-########### 1.00 Released 2000/07/20
-demos/pythonpoint/pythonpoint.py
- 1.25 2000/07/15 21:13:29 Minor additions to styles etc. andy_robinson
-docs/userguide/app_demos.py
- 1.6 2000/07/18 13:27:47 fixed typos. dinu_gherman
- 1.5 2000/07/18 10:03:45 fixed typos, minimal changes to py2pdf. dinu_gherman
-docs/userguide/ch1_intro.py
- 1.8 2000/07/18 09:58:11 fixed typos. dinu_gherman
-docs/userguide/ch2_graphics.py
- 1.6 2000/07/18 09:59:25 fixed typos. dinu_gherman
-docs/userguide/ch3_pdffeatures.py
- 1.5 2000/07/18 10:00:43 fixed typos. dinu_gherman
-docs/userguide/ch4_platypus_concepts.py
- 1.7 2000/07/18 10:02:06 fixed typos. dinu_gherman
-docs/userguide/ch5_paragraphs.py
- 1.5 2000/07/18 13:24:38 fixed typos. dinu_gherman
-docs/userguide/ch5_tables.py
- 1.2 2000/07/16 14:01:44 ch5_tables.py was a hangover and should have been deleted before. Note to AR if and when we do this again never give the chapters numbers as that is extremely confusing. rgbecker
-docs/userguide/ch6_tables.py
- 1.10 2000/07/18 13:25:38 fixed typos. dinu_gherman
- 1.9 2000/07/14 14:07:48 Image probs again rgbecker
-docs/userguide/ch7_custom.py
- 1.4 2000/07/18 13:26:17 fixed typos. dinu_gherman
- 1.3 2000/07/16 14:07:56 most_chapters.py was also irrelevant rgbecker
-docs/userguide/genuserguide.py
- 1.32 2000/07/18 13:29:19 removed header dashes. dinu_gherman
-docs/userguide/lj8100.jpg
- 1.2 2000/07/14 14:07:48 Image probs again rgbecker
-docs/userguide/most_chapters.py
- 1.6 2000/07/16 14:07:56 most_chapters.py was also irrelevant rgbecker
- 1.5 2000/07/16 14:01:44 ch5_tables.py was a hangover and should have been deleted before. Note to AR if and when we do this again never give the chapters numbers as that is extremely confusing. rgbecker
-lib/xmllib.py
- 1.3 2000/07/18 09:31:53 Uncommented methods in fast parser rgbecker
-pdfbase/Setup.in
- 1.1 2000/07/19 19:06:39 Added _pdfmetrics.c rgbecker
-pdfbase/_pdfmetrics.c
- 1.1 2000/07/19 19:06:39 Added _pdfmetrics.c rgbecker
-pdfbase/pdfmetrics.py
- 1.7 2000/07/19 19:06:39 Added _pdfmetrics.c rgbecker
-platypus/tables.py
- 1.27 2000/07/20 13:32:33 Started debugging Table split rgbecker
-utils/daily.py
- 1.37 2000/07/14 14:27:26 Wasn't doing docs for releases rgbecker
-utils/runtests.py
- 1.12 2000/07/19 13:44:54 Added -prof option rgbecker
-########### 0.95 Released 2000/07/14
-demos/py2pdf/demo.py
- 1.5 2000/06/27 08:58:19 Try to ensure test file removal rgbecker
-demos/py2pdf/py2pdf.py
- 1.10 2000/06/28 11:12:40 Stop auto testing rgbecker
-demos/pythonpoint/pythonpoint.py
- 1.24 2000/07/12 14:23:12 Table argument order changed rgbecker
- 1.23 2000/07/12 06:33:43 Added Speaker Notes facility andy_robinson
- 1.22 2000/07/10 15:25:47 Added tables to PythonPoint andy_robinson
-demos/pythonpoint/pythonpoint.xml
- 1.7 2000/07/12 06:33:43 Added Speaker Notes facility andy_robinson
- 1.6 2000/07/10 15:25:47 Added tables to PythonPoint andy_robinson
-demos/pythonpoint/stdparser.py
- 1.10 2000/07/11 15:00:39 Added end_spacer rgbecker
- 1.9 2000/07/10 15:25:47 Added tables to PythonPoint andy_robinson
-lib/sequencer.py
- 1.8 2000/07/10 11:58:35 Pre-incrementing bug fixed andy_robinson
- 1.7 2000/07/08 07:11:21 Changed to pre-increment andy_robinson
- 1.6 2000/06/21 19:46:43 Added Roman formatters rgbecker
-pdfbase/_streams.c
- 1.1 2000/07/05 12:20:27 Ascii85 fixes/additions rgbecker
-pdfbase/pdfdoc.py
- 1.21 2000/06/26 15:58:22 Simple fix to widths problem rgbecker
- 1.20 2000/06/23 17:51:22 /Producer (ReportLab http://www.reportlab.com) in document aaron_watters
-pdfbase/pdfmetrics.py
- 1.6 2000/06/26 15:58:22 Simple fix to widths problem rgbecker
-pdfbase/pdfutils.py
- 1.8 2000/07/05 12:20:27 Ascii85 fixes/additions rgbecker
- 1.7 2000/06/30 15:29:59 Allow for non-caching of images rgbecker
-pdfgen/canvas.py
- 1.43 2000/06/30 15:27:55 Allow for non-caching of images rgbecker
- 1.42 2000/06/26 15:58:22 Simple fix to widths problem rgbecker
-pdfgen/pathobject.py
- 1.6 2000/07/12 16:07:09 fixed nameerror and path.circle bug aaron_watters
-platypus/__init__.py
- 1.9 2000/07/13 11:41:00 Added KeepTogether rgbecker
- 1.8 2000/06/27 10:07:55 Added CondPageBreak rgbecker
- 1.7 2000/06/21 12:27:42 remove UserDocTemplate, but add Andy's hook methods rgbecker
-platypus/doctemplate.py
- 1.27 2000/07/10 11:58:35 Pre-incrementing bug fixed andy_robinson
- 1.26 2000/07/07 16:21:12 Cosmetics rgbecker
- 1.25 2000/07/06 12:40:37 Push canvas into flowables during wrap/split rgbecker
- 1.24 2000/07/05 12:22:21 Force _calc in SimpleDocTemplae.build rgbecker
- 1.23 2000/07/03 15:39:51 Documentation fixes rgbecker
- 1.22 2000/06/28 14:52:43 Documentation changes rgbecker
- 1.21 2000/06/26 15:58:22 Simple fix to widths problem rgbecker
- 1.20 2000/06/21 12:27:42 remove UserDocTemplate, but add Andy's hook methods rgbecker
- 1.19 2000/06/20 21:56:17 re-synching after sourceforge went weird andy_robinson
-platypus/flowables.py
- 1.6 2000/07/13 11:42:10 removed debug prints rgbecker
- 1.5 2000/07/13 11:41:00 Added KeepTogether rgbecker
- 1.4 2000/06/27 10:07:55 Added CondPageBreak rgbecker
-platypus/frames.py
- 1.4 2000/07/07 16:21:12 Cosmetics rgbecker
- 1.3 2000/07/06 12:40:38 Push canvas into flowables during wrap/split rgbecker
-platypus/paragraph.py
- 1.17 2000/07/14 10:29:50 The Paragraph.split method was wrongly assuming that the firstLineIndent should reset to zero. It should always reset to leftIndent! rgbecker
- 1.16 2000/07/03 15:39:51 Documentation fixes rgbecker
- 1.15 2000/06/23 13:13:54 Fixes to splitting code rgbecker
-platypus/paraparser.py
- 1.26 2000/07/10 23:53:46 Changed base of seqdefault tag to 0 andy_robinson
- 1.25 2000/07/04 10:50:33 Sequencer fixes rgbecker
-platypus/tables.py
- 1.26 2000/07/12 15:36:56 Allow automatic leading in FONT command rgbecker
- 1.25 2000/07/12 15:26:46 INNERGRID was dumb rgbecker
- 1.24 2000/07/12 15:25:42 INNERGRID was dumb rgbecker
- 1.23 2000/07/12 15:18:16 Leading changes fixed rgbecker
- 1.22 2000/07/12 14:23:12 Table argument order changed rgbecker
- 1.21 2000/07/12 09:05:17 Fixed tuple size bug rgbecker
- 1.20 2000/07/11 14:29:45 Table splitting start rgbecker
- 1.19 2000/07/10 15:25:47 Added tables to PythonPoint andy_robinson
- 1.18 2000/07/08 15:30:04 Cosmetics and error testing rgbecker
- 1.17 2000/07/07 16:22:10 Fix auto hieght stuff rgbecker
- 1.16 2000/07/07 10:23:36 First attempt at VALIGN rgbecker
- 1.15 2000/07/06 14:05:55 Adjusted doc string rgbecker
- 1.14 2000/07/06 12:41:47 First try at auto sizing rgbecker
- 1.13 2000/06/29 17:55:19 support explicit \n line splitting in cells aaron_watters
-platypus/test/testplatypus.py
- 1.18 2000/07/12 14:23:12 Table argument order changed rgbecker
-platypus/test/testtables.py
- 1.11 2000/07/12 14:23:12 Table argument order changed rgbecker
-utils/README
- 1.2 2000/07/13 14:55:30 Added detailed release rgbecker
-########### 0.94 Released 2000/06/20
-demos/gadflypaper/gfe.py
- 1.11 2000/06/01 16:27:56 pageSize is wrong at present rgbecker
- 1.10 2000/06/01 15:23:06 Platypus re-organisation rgbecker
-demos/odyssey/dodyssey.py
- 1.7 2000/06/01 15:23:06 Platypus re-organisation rgbecker
- 1.6 2000/06/01 09:41:11 test filename case fix rgbecker
-demos/odyssey/fodyssey.py
- 1.13 2000/06/01 16:27:56 pageSize is wrong at present rgbecker
- 1.12 2000/06/01 15:23:06 Platypus re-organisation rgbecker
- 1.11 2000/06/01 09:41:12 test filename case fix rgbecker
-demos/odyssey/odyssey.py
- 1.8 2000/06/01 09:41:12 test filename case fix rgbecker
-demos/odyssey/odyssey.txt
- 1.7 2000/05/31 10:12:45 xml tag added rgbecker
-demos/py2pdf/demo.py
- 1.4 2000/06/19 11:14:03 Global sequencer put in the 'story builder'. andy_robinson
-demos/py2pdf/py2pdf.py
- 1.9 2000/06/19 11:14:03 Global sequencer put in the 'story builder'. andy_robinson
-demos/pythonpoint/pythonpoint.py
- 1.21 2000/06/01 15:23:06 Platypus re-organisation rgbecker
- 1.20 2000/05/23 14:06:45 Preformatted objects now know how to split themselves. andy_robinson
-demos/pythonpoint/stdparser.py
- 1.8 2000/06/01 15:23:06 Platypus re-organisation rgbecker
-demos/pythonpoint/styles_horrible.py
- 1.5 2000/06/01 15:23:06 Platypus re-organisation rgbecker
-demos/pythonpoint/styles_modern.py
- 1.6 2000/06/01 15:23:06 Platypus re-organisation rgbecker
-docs/00readme.txt
- 1.1 2000/06/05 16:38:54 Initial revision andy_robinson
- 1.1.1.1 2000/06/05 16:38:54 initial import andy_robinson
-docs/images/replogo.a85
- 1.1 2000/06/05 16:39:04 Initial revision andy_robinson
- 1.1.1.1 2000/06/05 16:39:04 initial import andy_robinson
-docs/images/replogo.gif
- 1.1 2000/06/05 16:39:04 Initial revision andy_robinson
- 1.1.1.1 2000/06/05 16:39:04 initial import andy_robinson
-docs/reference/build.bat
- 1.4 2000/06/19 23:52:31 rltemplate now simple, based on UserDocTemplate andy_robinson
- 1.3 2000/06/17 07:46:45 Small text changes andy_robinson
- 1.2 2000/06/12 11:13:09 Added sequencer tags to paragraph parser andy_robinson
- 1.1 2000/06/07 13:39:22 Added some text to the first page of reference, and a build batch file andy_robinson
-docs/reference/reference.yml
- 1.8 2000/06/19 23:52:31 rltemplate now simple, based on UserDocTemplate andy_robinson
- 1.7 2000/06/17 07:46:45 Small text changes andy_robinson
- 1.6 2000/06/14 21:22:52 Added docs for library andy_robinson
- 1.5 2000/06/12 11:26:34 Numbered list added andy_robinson
- 1.4 2000/06/12 11:13:09 Added sequencer tags to paragraph parser andy_robinson
- 1.3 2000/06/09 01:44:24 added automatic generation for pathobject and textobject modules. aaron_watters
- 1.2 2000/06/07 13:39:22 Added some text to the first page of reference, and a build batch file andy_robinson
- 1.1 2000/06/05 16:39:04 Initial revision andy_robinson
- 1.1.1.1 2000/06/05 16:39:04 initial import andy_robinson
-docs/tools/codegrab.py
- 1.3 2000/06/20 11:35:08 Python 1.5.1 compatibility fixes rgbecker
- 1.2 2000/06/14 21:22:52 Added docs for library andy_robinson
- 1.1 2000/06/05 16:38:57 Initial revision andy_robinson
- 1.1.1.1 2000/06/05 16:38:57 initial import andy_robinson
-docs/tools/rltemplate.py
- 1.2 2000/06/19 23:52:31 rltemplate now simple, based on UserDocTemplate andy_robinson
- 1.1 2000/06/17 07:48:41 Added a separate rltemplate.py file to contain our standard document template. andy_robinson
-docs/tools/stylesheet.py
- 1.2 2000/06/14 21:22:52 Added docs for library andy_robinson
- 1.1 2000/06/13 20:03:30 Docs is now a package; stylesheet separated out andy_robinson
-docs/tools/yaml.py
- 1.5 2000/06/20 11:34:47 Python 1.5.1 compatibility fixes rgbecker
- 1.4 2000/06/19 15:54:21 Changes to imports again sigh mumble rgbecker
- 1.3 2000/06/14 21:22:52 Added docs for library andy_robinson
- 1.2 2000/06/13 20:03:30 Docs is now a package; stylesheet separated out andy_robinson
- 1.1 2000/06/05 16:38:56 Initial revision andy_robinson
- 1.1.1.1 2000/06/05 16:38:56 initial import andy_robinson
-docs/tools/yaml2pdf.py
- 1.6 2000/06/19 15:54:21 Changes to imports again sigh mumble rgbecker
- 1.5 2000/06/17 07:47:20 Factored out rltemplate andy_robinson
- 1.4 2000/06/13 20:03:30 Docs is now a package; stylesheet separated out andy_robinson
- 1.3 2000/06/12 11:26:34 Numbered list added andy_robinson
- 1.2 2000/06/07 21:08:12 Change to style for definition lists andy_robinson
- 1.1 2000/06/05 16:38:55 Initial revision andy_robinson
- 1.1.1.1 2000/06/05 16:38:55 initial import andy_robinson
-docs/userguide/examples.py
- 1.3 2000/06/19 21:13:02 2nd try. more text aaron_watters
- 1.2 2000/06/17 06:54:54 Example had a reference to layout.py, removed andy_robinson
- 1.1 2000/06/17 02:59:05 initial checkin. examples file for userguide generation aaron_watters
-docs/userguide/genuserguide.py
- 1.2 2000/06/19 21:13:02 2nd try. more text aaron_watters
- 1.1 2000/06/17 02:57:56 initial checkin. user guide generation framework. aaron_watters
-docs/userguide/platdemos.py
- 1.1 2000/06/05 16:39:04 Initial revision andy_robinson
- 1.1.1.1 2000/06/05 16:39:04 initial import andy_robinson
-lib/colors.py
- 1.9 2000/06/14 21:17:30 Some relative imports fixed andy_robinson
- 1.8 2000/05/26 09:43:44 stringToColor-->toColor rgbecker
-lib/pagesizes.py
- 1.4 2000/06/14 21:17:30 Some relative imports fixed andy_robinson
-lib/sequencer.py
- 1.5 2000/06/19 11:14:03 Global sequencer put in the 'story builder'. andy_robinson
- 1.4 2000/06/12 11:27:17 Added Sequencer and associated XML tags andy_robinson
- 1.3 2000/06/11 21:34:01 Largely complete class for numbering lists, figures and chapters andy_robinson
- 1.2 2000/06/09 16:18:19 Doc strings, sequencer andy_robinson
- 1.1 2000/06/01 15:23:06 Platypus re-organisation rgbecker
-pdfbase/pdfdoc.py
- 1.19 2000/06/01 09:44:26 SaveToFile: only close the file if we opened it. Aggregated from types imports to module level. rgbecker
-pdfgen/canvas.py
- 1.41 2000/06/09 16:18:19 Doc strings, sequencer andy_robinson
- 1.40 2000/06/09 01:45:22 Lots of documentation additions and changes. aaron_watters
- 1.39 2000/06/01 15:23:06 Platypus re-organisation rgbecker
- 1.38 2000/05/26 09:44:40 generalised colors slightly rgbecker
- 1.37 2000/05/23 14:06:45 Preformatted objects now know how to split themselves. andy_robinson
-pdfgen/pathobject.py
- 1.5 2000/06/09 08:17:43 Full qualified a local import in pdfgen package andy_robinson
-platypus/__init__.py
- 1.6 2000/06/19 23:51:23 Added UserDocTemplate class, and paragraph.getPlainText() andy_robinson
- 1.5 2000/06/01 15:23:06 Platypus re-organisation rgbecker
-platypus/doctemplate.py
- 1.18 2000/06/19 23:51:23 Added UserDocTemplate class, and paragraph.getPlainText() andy_robinson
- 1.17 2000/06/19 11:14:03 Global sequencer put in the 'story builder'. andy_robinson
- 1.16 2000/06/16 13:49:20 new build parameters to allow alternate filename and canvas implementation (in order to support slideshow summary mode, for example, or embedding one document in another). aaron_watters
- 1.15 2000/06/13 13:03:31 more documentation changes aaron_watters
- 1.14 2000/06/01 16:27:56 pageSize is wrong at present rgbecker
- 1.13 2000/06/01 15:23:06 Platypus re-organisation rgbecker
- 1.12 2000/05/26 10:27:37 Fixed infinite recursion bug rgbecker
-platypus/flowables.py
- 1.3 2000/06/13 13:03:31 more documentation changes aaron_watters
- 1.2 2000/06/01 16:27:56 pageSize is wrong at present rgbecker
- 1.1 2000/06/01 15:23:06 Platypus re-organisation rgbecker
-platypus/frames.py
- 1.2 2000/06/13 13:03:31 more documentation changes aaron_watters
- 1.1 2000/06/01 15:23:06 Platypus re-organisation rgbecker
-platypus/layout.py
- 1.31 2000/06/01 15:23:06 Platypus re-organisation rgbecker
- 1.30 2000/05/23 14:08:02 Preformatted objects now splitting andy_robinson
-platypus/paragraph.py
- 1.14 2000/06/19 23:51:23 Added UserDocTemplate class, and paragraph.getPlainText() andy_robinson
- 1.13 2000/06/19 11:14:03 Global sequencer put in the 'story builder'. andy_robinson
- 1.12 2000/06/13 13:03:31 more documentation changes aaron_watters
- 1.11 2000/06/01 15:23:06 Platypus re-organisation rgbecker
- 1.10 2000/05/31 10:12:20 xml tag added rgbecker
-platypus/paraparser.py
- 1.24 2000/06/19 11:14:03 Global sequencer put in the 'story builder'. andy_robinson
- 1.23 2000/06/13 04:11:49 noted replication of XML markup comment between paraparser.py and paragraph.py aaron_watters
- 1.22 2000/06/12 11:27:17 Added Sequencer and associated XML tags andy_robinson
- 1.21 2000/06/01 15:23:06 Platypus re-organisation rgbecker
- 1.20 2000/05/31 10:12:20 xml tag added rgbecker
- 1.19 2000/05/26 09:49:23 Color fixes; thanks to J Alet rgbecker
- 1.18 2000/05/20 15:36:42 Removed 1.5.2-style getattr call andy_robinson
-platypus/tables.py
- 1.12 2000/06/13 13:03:31 more documentation changes aaron_watters
- 1.11 2000/06/01 15:23:06 Platypus re-organisation rgbecker
- 1.10 2000/05/26 09:49:23 Color fixes; thanks to J Alet rgbecker
-platypus/test/testplatypus.py
- 1.17 2000/06/01 15:23:06 Platypus re-organisation rgbecker
-platypus/test/testtables.py
- 1.10 2000/06/01 16:27:56 pageSize is wrong at present rgbecker
- 1.9 2000/06/01 15:23:06 Platypus re-organisation rgbecker
diff --git a/bin/reportlab/demos/colors/colortest.py b/bin/reportlab/demos/colors/colortest.py
deleted file mode 100644
index 7845c2cd620..00000000000
--- a/bin/reportlab/demos/colors/colortest.py
+++ /dev/null
@@ -1,105 +0,0 @@
-#Copyright ReportLab Europe Ltd. 2000-2004
-#see license.txt for license details
-#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/demos/colors/colortest.py
-import reportlab.pdfgen.canvas
-from reportlab.lib import colors
-from reportlab.lib.units import inch
-
-
-def run():
- c = reportlab.pdfgen.canvas.Canvas('colortest.pdf')
-
- #do a test of CMYK interspersed with RGB
-
- #first do RGB values
- framePage(c, 'Color Demo - RGB Space and CMYK spaces interspersed' )
-
- y = 700
-
- c.setFillColorRGB(0,0,0)
- c.drawString(100, y, 'cyan')
- c.setFillColorCMYK(1,0,0,0)
- c.rect(200, y, 300, 30, fill=1)
- y = y - 40
-
- c.setFillColorRGB(0,0,0)
- c.drawString(100, y, 'red')
- c.setFillColorRGB(1,0,0)
- c.rect(200, y, 300, 30, fill=1)
- y = y - 40
-
- c.setFillColorRGB(0,0,0)
- c.drawString(100, y, 'magenta')
- c.setFillColorCMYK(0,1,0,0)
- c.rect(200, y, 300, 30, fill=1)
- y = y - 40
-
- c.setFillColorRGB(0,0,0)
- c.drawString(100, y, 'green')
- c.setFillColorRGB(0,1,0)
- c.rect(200, y, 300, 30, fill=1)
- y = y - 40
-
- c.setFillColorRGB(0,0,0)
- c.drawString(100, y, 'yellow')
- c.setFillColorCMYK(0,0,1,0)
- c.rect(200, y, 300, 30, fill=1)
- y = y - 40
-
- c.setFillColorRGB(0,0,0)
- c.drawString(100, y, 'blue')
- c.setFillColorRGB(0,0,1)
- c.rect(200, y, 300, 30, fill=1)
- y = y - 40
-
- c.setFillColorRGB(0,0,0)
- c.drawString(100, y, 'black')
- c.setFillColorCMYK(0,0,0,1)
- c.rect(200, y, 300, 30, fill=1)
- y = y - 40
-
-
- c.showPage()
-
- #do all named colors
- framePage(c, 'Color Demo - RGB Space - page %d' % c.getPageNumber())
-
- all_colors = reportlab.lib.colors.getAllNamedColors().items()
- all_colors.sort() # alpha order by name
- c.setFont('Times-Roman', 12)
- c.drawString(72,730, 'This shows all the named colors in the HTML standard.')
- y = 700
- for (name, color) in all_colors:
- c.setFillColor(colors.black)
- c.drawString(100, y, name)
- c.setFillColor(color)
- c.rect(200, y-10, 300, 30, fill=1)
- y = y - 40
- if y < 100:
- c.showPage()
- framePage(c, 'Color Demo - RGB Space - page %d' % c.getPageNumber())
- y = 700
-
-
-
-
- c.save()
-
-def framePage(canvas, title):
- canvas.setFont('Times-BoldItalic',20)
- canvas.drawString(inch, 10.5 * inch, title)
-
- canvas.setFont('Times-Roman',10)
- canvas.drawCentredString(4.135 * inch, 0.75 * inch,
- 'Page %d' % canvas.getPageNumber())
-
- #draw a border
- canvas.setStrokeColorRGB(1,0,0)
- canvas.setLineWidth(5)
- canvas.line(0.8 * inch, inch, 0.8 * inch, 10.75 * inch)
- #reset carefully afterwards
- canvas.setLineWidth(1)
- canvas.setStrokeColorRGB(0,0,0)
-
-if __name__ == '__main__':
- run()
diff --git a/bin/reportlab/demos/gadflypaper/00readme.txt b/bin/reportlab/demos/gadflypaper/00readme.txt
deleted file mode 100644
index f50a9966846..00000000000
--- a/bin/reportlab/demos/gadflypaper/00readme.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-This is Aaron Watters' first script;
-it renders his paper for IPC8 into
-PDF. A fascinating read, as well.
\ No newline at end of file
diff --git a/bin/reportlab/demos/gadflypaper/gfe.py b/bin/reportlab/demos/gadflypaper/gfe.py
deleted file mode 100644
index dfc1259d5a8..00000000000
--- a/bin/reportlab/demos/gadflypaper/gfe.py
+++ /dev/null
@@ -1,903 +0,0 @@
-#Copyright ReportLab Europe Ltd. 2000-2004
-#see license.txt for license details
-#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/demos/gadflypaper/gfe.py
-__version__=''' $Id: gfe.py 2385 2004-06-17 15:26:05Z rgbecker $ '''
-__doc__=''
-
-#REPORTLAB_TEST_SCRIPT
-import sys
-from reportlab.platypus import *
-from reportlab.lib.styles import getSampleStyleSheet
-from reportlab.rl_config import defaultPageSize
-PAGE_HEIGHT=defaultPageSize[1]
-
-styles = getSampleStyleSheet()
-
-Title = "Integrating Diverse Data Sources with Gadfly 2"
-
-Author = "Aaron Watters"
-
-URL = "http://www.chordate.com/"
-
-email = "arw@ifu.net"
-
-Abstract = """This paper describes the primative methods underlying the implementation
-of SQL query evaluation in Gadfly 2, a database management system implemented
-in Python [Van Rossum]. The major design goals behind
-the architecture described here are to simplify the implementation
-and to permit flexible and efficient extensions to the gadfly
-engine. Using this architecture and its interfaces programmers
-can add functionality to the engine such as alternative disk based
-indexed table implementations, dynamic interfaces to remote data
-bases or or other data sources, and user defined computations."""
-
-from reportlab.lib.units import inch
-
-pageinfo = "%s / %s / %s" % (Author, email, Title)
-
-def myFirstPage(canvas, doc):
- canvas.saveState()
- #canvas.setStrokeColorRGB(1,0,0)
- #canvas.setLineWidth(5)
- #canvas.line(66,72,66,PAGE_HEIGHT-72)
- canvas.setFont('Times-Bold',16)
- canvas.drawString(108, PAGE_HEIGHT-108, Title)
- canvas.setFont('Times-Roman',9)
- canvas.drawString(inch, 0.75 * inch, "First Page / %s" % pageinfo)
- canvas.restoreState()
-
-def myLaterPages(canvas, doc):
- #canvas.drawImage("snkanim.gif", 36, 36)
- canvas.saveState()
- #canvas.setStrokeColorRGB(1,0,0)
- #canvas.setLineWidth(5)
- #canvas.line(66,72,66,PAGE_HEIGHT-72)
- canvas.setFont('Times-Roman',9)
- canvas.drawString(inch, 0.75 * inch, "Page %d %s" % (doc.page, pageinfo))
- canvas.restoreState()
-
-def go():
- Elements.insert(0,Spacer(0,inch))
- doc = SimpleDocTemplate('gfe.pdf')
- doc.build(Elements,onFirstPage=myFirstPage, onLaterPages=myLaterPages)
-
-Elements = []
-
-HeaderStyle = styles["Heading1"] # XXXX
-
-def header(txt, style=HeaderStyle, klass=Paragraph, sep=0.3):
- s = Spacer(0.2*inch, sep*inch)
- Elements.append(s)
- para = klass(txt, style)
- Elements.append(para)
-
-ParaStyle = styles["Normal"]
-
-def p(txt):
- return header(txt, style=ParaStyle, sep=0.1)
-
-#pre = p # XXX
-
-PreStyle = styles["Code"]
-
-def pre(txt):
- s = Spacer(0.1*inch, 0.1*inch)
- Elements.append(s)
- p = Preformatted(txt, PreStyle)
- Elements.append(p)
-
-#header(Title, sep=0.1. style=ParaStyle)
-header(Author, sep=0.1, style=ParaStyle)
-header(URL, sep=0.1, style=ParaStyle)
-header(email, sep=0.1, style=ParaStyle)
-header("ABSTRACT")
-p(Abstract)
-
-header("Backgrounder")
-
-p("""\
-The term "database" usually refers to a persistent
-collection of data. Data is persistent if it continues
-to exist whether or not it is associated with a running
-process on the computer, or even if the computer is
-shut down and restarted at some future time. Database
-management systems provide support for constructing databases,
-maintaining databases, and extracting information from databases.""")
-p("""\
-Relational databases manipulate and store persistent
-table structures called relations, such as the following
-three tables""")
-
-pre("""\
- -- drinkers who frequent bars (this is a comment)
- select * from frequents
-
- DRINKER | PERWEEK | BAR
- ============================
- adam | 1 | lolas
- woody | 5 | cheers
- sam | 5 | cheers
- norm | 3 | cheers
- wilt | 2 | joes
- norm | 1 | joes
- lola | 6 | lolas
- norm | 2 | lolas
- woody | 1 | lolas
- pierre | 0 | frankies
-)
-""")
-pre("""\
- -- drinkers who like beers
- select * from likes
-
- DRINKER | PERDAY | BEER
- ===============================
- adam | 2 | bud
- wilt | 1 | rollingrock
- sam | 2 | bud
- norm | 3 | rollingrock
- norm | 2 | bud
- nan | 1 | sierranevada
- woody | 2 | pabst
- lola | 5 | mickies
-
-""")
-pre("""\
- -- beers served from bars
- select * from serves
-
- BAR | QUANTITY | BEER
- =================================
- cheers | 500 | bud
- cheers | 255 | samadams
- joes | 217 | bud
- joes | 13 | samadams
- joes | 2222 | mickies
- lolas | 1515 | mickies
- lolas | 333 | pabst
- winkos | 432 | rollingrock
- frankies | 5 | snafu
-""")
-p("""
-The relational model for database structures makes
-the simplifying assumption that all data in a database
-can be represented in simple table structures
-such as these. Although this assumption seems extreme
-it provides a good foundation for defining solid and
-well defined database management systems and some
-of the most successful software companies in the
-world, such as Oracle, Sybase, IBM, and Microsoft,
-have marketed database management systems based on
-the relational model quite successfully.
-""")
-p("""
-SQL stands for Structured Query Language.
-The SQL language defines industry standard
-mechanisms for creating, querying, and modified
-relational tables. Several years ago SQL was one
-of many Relational Database Management System
-(RDBMS) query languages in use, and many would
-argue not the best on. Now, largely due
-to standardization efforts and the
-backing of IBM, SQL is THE standard way to talk
-to database systems.
-""")
-p("""
-There are many advantages SQL offers over other
-database query languages and alternative paradigms
-at this time (please see [O'Neill] or [Korth and Silberschatz]
-for more extensive discussions and comparisons between the
-SQL/relational approach and others.)
-""")
-p("""
-The chief advantage over all contenders at this time
-is that SQL and the relational model are now widely
-used as interfaces and back end data stores to many
-different products with different performance characteristics,
-user interfaces, and other qualities: Oracle, Sybase,
-Ingres, SQL Server, Access, Outlook,
-Excel, IBM DB2, Paradox, MySQL, MSQL, POSTgres, and many
-others. For this reason a program designed to use
-an SQL database as its data storage mechanism can
-easily be ported from one SQL data manager to another,
-possibly on different platforms. In fact the same
-program can seamlessly use several backends and/or
-import/export data between different data base platforms
-with trivial ease.
-No other paradigm offers such flexibility at the moment.
-""")
-p("""
-Another advantage which is not as immediately
-obvious is that the relational model and the SQL
-query language are easily understood by semi-technical
-and non-technical professionals, such as business
-people and accountants. Human resources managers
-who would be terrified by an object model diagram
-or a snippet of code that resembles a conventional
-programming language will frequently feel quite at
-ease with a relational model which resembles the
-sort of tabular data they deal with on paper in
-reports and forms on a daily basis. With a little training the
-same HR managers may be able to translate the request
-"Who are the drinkers who like bud and frequent cheers?"
-into the SQL query
-""")
-pre("""
- select drinker
- from frequents
- where bar='cheers'
- and drinker in (
- select drinker
- from likes
- where beer='bud')
-""")
-p("""
-(or at least they have some hope of understanding
-the query once it is written by a technical person
-or generated by a GUI interface tool). Thus the use
-of SQL and the relational model enables communication
-between different communities which must understand
-and interact with stored information. In contrast
-many other approaches cannot be understood easily
-by people without extensive programming experience.
-""")
-p("""
-Furthermore the declarative nature of SQL
-lends itself to automatic query optimization,
-and engines such as Gadfly can automatically translate a user query
-into an optimized query plan which takes
-advantage of available indices and other data characteristics.
-In contrast more navigational techniques require the application
-program itself to optimize the accesses to the database and
-explicitly make use of indices.
-""")
-
-# HACK
-Elements.append(PageBreak())
-
-p("""
-While it must be admitted that there are application
-domains such as computer aided engineering design where
-the relational model is unnatural, it is also important
-to recognize that for many application domains (such
-as scheduling, accounting, inventory, finance, personal
-information management, electronic mail) the relational
-model is a very natural fit and the SQL query language
-make most accesses to the underlying data (even sophisticated
-ones) straightforward. """)
-
-p("""For an example of a moderately
-sophisticated query using the tables given above,
-the following query lists the drinkers who frequent lolas bar
-and like at least two beers not served by lolas
-""")
-
-if 0:
- go()
- sys.exit(1)
-
-pre("""
- select f.drinker
- from frequents f, likes l
- where f.drinker=l.drinker and f.bar='lolas'
- and l.beer not in
- (select beer from serves where bar='lolas')
- group by f.drinker
- having count(distinct beer)>=2
-""")
-p("""
-yielding the result
-""")
-pre("""
- DRINKER
- =======
- norm
-""")
-p("""
-Experience shows that queries of this sort are actually
-quite common in many applications, and are often much more
-difficult to formulate using some navigational database
-organizations, such as some "object oriented" database
-paradigms.
-""")
-p("""
-Certainly,
-SQL does not provide all you need to interact with
-databases -- in order to do "real work" with SQL you
-need to use SQL and at least one other language
-(such as C, Pascal, C++, Perl, Python, TCL, Visual Basic
-or others) to do work (such as readable formatting a report
-from raw data) that SQL was not designed to do.
-""")
-
-header("Why Gadfly 1?")
-
-p("""Gadfly 1.0 is an SQL based relational database implementation
-implemented entirely in the Python programming language, with
-optional fast data structure accellerators implemented in the
-C programming language. Gadfly is relatively small, highly portable,
-very easy to use (especially for programmers with previous experience
-with SQL databases such as MS Access or Oracle), and reasonably
-fast (especially when the kjbuckets C accellerators are used).
-For moderate sized problems Gadfly offers a fairly complete
-set of features such as transaction semantics, failure recovery,
-and a TCP/IP based client/server mode (Please see [Gadfly] for
-detailed discussion).""")
-
-
-header("Why Gadfly 2?")
-
-p("""Gadfly 1.0 also has significant limitations. An active Gadfly
-1.0 database keeps all data in (virtual) memory, and hence a Gadfly
-1.0 database is limited in size to available virtual memory. Important
-features such as date/time/interval operations, regular expression
-matching and other standard SQL features are not implemented in
-Gadfly 1.0. The optimizer and the query evaluator perform optimizations
-using properties of the equality predicate but do not optimize
-using properties of inequalities such as BETWEEN or less-than.
-It is possible to add "extension views" to a Gadfly
-1.0 database, but the mechanism is somewhat clumsy and indices
-over extension views are not well supported. The features of Gadfly
-2.0 discussed here attempt to address these deficiencies by providing
-a uniform extension model that permits addition of alternate table,
-function, and predicate implementations.""")
-
-p("""Other deficiencies, such as missing constructs like "ALTER
-TABLE" and the lack of outer joins and NULL values are not
-addressed here, although they may be addressed in Gadfly 2.0 or
-a later release. This paper also does not intend to explain
-the complete operations of the internals; it is intended to provide
-at least enough information to understand the basic mechanisms
-for extending gadfly.""")
-
-
-
-
-p("""Some concepts and definitions provided next help with the description
-of the gadfly interfaces. [Note: due to the terseness of this
-format the ensuing is not a highly formal presentation, but attempts
-to approach precision where precision is important.]""")
-
-header("The semilattice of substitutions")
-
-p("""Underlying the gadfly implementation are the basic concepts
-associated with substitutions. A substitution is a mapping
-of attribute names to values (implemented in gadfly using kjbuckets.kjDict
-objects). Here an attribute refers to some sort of "descriptive
-variable", such as NAME and a value is an assignment for that variable,
-like "Dave Ascher". In Gadfly a table is implemented as a sequence
-of substitutions, and substitutions are used in many other ways as well.
-""")
-p("""
-For example consider the substitutions""")
-
-pre("""
- A = [DRINKER=>'sam']
- B = [DRINKER=>'sam', BAR=>'cheers']
- C = [DRINKER=>'woody', BEER=>'bud']
- D = [DRINKER=>'sam', BEER=>'mickies']
- E = [DRINKER=>'sam', BAR=>'cheers', BEER=>'mickies']
- F = [DRINKER=>'sam', BEER=>'mickies']
- G = [BEER=>'bud', BAR=>'lolas']
- H = [] # the empty substitution
- I = [BAR=>'cheers', CAPACITY=>300]""")
-
-p("""A trivial but important observation is that since substitutions
-are mappings, no attribute can assume more than one value in a
-substitution. In the operations described below whenever an operator
-"tries" to assign more than one value to an attribute
-the operator yields an "overdefined" or "inconsistent"
-result.""")
-
-header("Information Semi-order:")
-
-p("""Substitution B is said to be
-more informative than A because B agrees with all assignments
-in A (in addition to providing more information as well). Similarly
-we say that E is more informative than A, B, D, F. and H but E
-is not more informative than the others since, for example G disagrees
-with E on the value assigned to the BEER attribute and I provides
-additional CAPACITY information not provided in E.""")
-
-header("Joins and Inconsistency:")
-
-p("""A join of two substitutions
-X and Y is the least informative substitution Z such that Z is
-more informative (or equally informative) than both X and Y. For
-example B is the join of B with A, E is the join of B with D and""")
-
-pre("""
- E join I =
- [DRINKER=>'sam', BAR=>'cheers', BEER=>'mickies', CAPACITY=>300]""")
-
-p("""For any two substitutions either (1) they disagree on the value
-assigned to some attribute and have no join or (2) they agree
-on all common attributes (if there are any) and their join is
-the union of all (name, value) assignments in both substitutions.
-Written in terms of kjbucket.kjDict operations two kjDicts X and
-Y have a join Z = (X+Y) if and only if Z.Clean() is not None.
-Two substitutions that have no join are said to be inconsistent.
-For example I and G are inconsistent since they disagree on
-the value assigned to the BAR attribute and therefore have no
-join. The algebra of substitutions with joins technically defines
-an abstract algebraic structure called a semilattice.""")
-
-header("Name space remapping")
-
-p("""Another primitive operation over substitutions is the remap
-operation S2 = S.remap(R) where S is a substitution and R is a
-graph of attribute names and S2 is a substitution. This operation
-is defined to produce the substitution S2 such that""")
-
-pre("""
- Name=>Value in S2 if and only if
- Name1=>Value in S and Name<=Name1 in R
-""")
-
-p("""or if there is no such substitution S2 the remap value is said
-to be overdefined.""")
-
-p("""For example the remap operation may be used to eliminate attributes
-from a substitution. For example""")
-
-pre("""
- E.remap([DRINKER<=DRINKER, BAR<=BAR])
- = [DRINKER=>'sam', BAR=>'cheers']
-""")
-
-p("""Illustrating that remapping using the [DRINKER<=DRINKER,
-BAR<=BAR] graph eliminates all attributes except DRINKER and
-BAR, such as BEER. More generally remap can be used in this way
-to implement the classical relational projection operation. (See [Korth and Silberschatz]
-for a detailed discussion of the projection operator and other relational
-algebra operators such as selection, rename, difference and joins.)""")
-
-p("""The remap operation can also be used to implement "selection
-on attribute equality". For example if we are interested
-in the employee names of employees who are their own bosses we
-can use the remapping graph""")
-
-pre("""
- R1 = [NAME<=NAME, NAME<=BOSS]
-""")
-
-p("""and reject substitutions where remapping using R1 is overdefined.
-For example""")
-
-pre("""
- S1 = [NAME=>'joe', BOSS=>'joe']
- S1.remap(R1) = [NAME=>'joe']
- S2 = [NAME=>'fred', BOSS=>'joe']
- S2.remap(R1) is overdefined.
-""")
-
-p("""The last remap is overdefined because the NAME attribute cannot
-assume both the values 'fred' and 'joe' in a substitution.""")
-
-p("""Furthermore, of course, the remap operation can be used to
-"rename attributes" or "copy attribute values"
-in substitutions. Note below that the missing attribute CAPACITY
-in B is effectively ignored in the remapping operation.""")
-
-pre("""
- B.remap([D<=DRINKER, B<=BAR, B2<=BAR, C<=CAPACITY])
- = [D=>'sam', B=>'cheers', B2=>'cheers']
-""")
-
-p("""More interestingly, a single remap operation can be used to
-perform a combination of renaming, projection, value copying,
-and attribute equality selection as one operation. In kjbuckets the remapper
-graph is implemented using a kjbuckets.kjGraph and the remap operation
-is an intrinsic method of kjbuckets.kjDict objects.""")
-
-header("Generalized Table Joins and the Evaluator Mainloop""")
-
-p("""Strictly speaking the Gadfly 2.0 query evaluator only uses
-the join and remap operations as its "basic assembly language"
--- all other computations, including inequality comparisons and
-arithmetic, are implemented externally to the evaluator as "generalized
-table joins." """)
-
-p("""A table is a sequence of substitutions (which in keeping with
-SQL semantics may contain redundant entries). The join between
-two tables T1 and T2 is the sequence of all possible defined joins
-between pairs of elements from the two tables. Procedurally we
-might compute the join as""")
-
-pre("""
- T1JoinT2 = empty
- for t1 in T1:
- for t2 in T2:
- if t1 join t2 is defined:
- add t1 join t2 to T1joinT2""")
-
-p("""In general circumstances this intuitive implementation is a
-very inefficient way to compute the join, and Gadfly almost always
-uses other methods, particularly since, as described below, a
-"generalized table" can have an "infinite"
-number of entries.""")
-
-p("""For an example of a table join consider the EMPLOYEES table
-containing""")
-
-pre("""
- [NAME=>'john', JOB=>'executive']
- [NAME=>'sue', JOB=>'programmer']
- [NAME=>'eric', JOB=>'peon']
- [NAME=>'bill', JOB=>'peon']
-""")
-
-p("""and the ACTIVITIES table containing""")
-
-pre("""
- [JOB=>'peon', DOES=>'windows']
- [JOB=>'peon', DOES=>'floors']
- [JOB=>'programmer', DOES=>'coding']
- [JOB=>'secretary', DOES=>'phone']""")
-
-p("""then the join between EMPLOYEES and ACTIVITIES must containining""")
-
-pre("""
- [NAME=>'sue', JOB=>'programmer', DOES=>'coding']
- [NAME=>'eric', JOB=>'peon', DOES=>'windows']
- [NAME=>'bill', JOB=>'peon', DOES=>'windows']
- [NAME=>'eric', JOB=>'peon', DOES=>'floors']
- [NAME=>'bill', JOB=>'peon', DOES=>'floors']""")
-
-p("""A compiled gadfly subquery ultimately appears to the evaluator
-as a sequence of generalized tables that must be joined (in combination
-with certain remapping operations that are beyond the scope of
-this discussion). The Gadfly mainloop proceeds following the very
-loose pseudocode:""")
-
-pre("""
- Subs = [ [] ] # the unary sequence containing "true"
- While some table hasn't been chosen yet:
- Choose an unchosen table with the least cost join estimate.
- Subs = Subs joined with the chosen table
- return Subs""")
-
-p("""[Note that it is a property of the join operation that the
-order in which the joins are carried out will not affect the result,
-so the greedy strategy of evaluating the "cheapest join next"
-will not effect the result. Also note that the treatment of logical
-OR and NOT as well as EXIST, IN, UNION, and aggregation and so
-forth are not discussed here, even though they do fit into this
-approach.]""")
-
-p("""The actual implementation is a bit more complex than this,
-but the above outline may provide some useful intuition. The "cost
-estimation" step and the implementation of the join operation
-itself are left up to the generalized table object implementation.
-A table implementation has the ability to give an "infinite"
-cost estimate, which essentially means "don't join me in
-yet under any circumstances." """)
-
-header("Implementing Functions")
-
-p("""As mentioned above operations such as arithmetic are implemented
-using generalized tables. For example the arithmetic Add operation
-is implemented in Gadfly internally as an "infinite generalized
-table" containing all possible substitutions""")
-
-pre("""
- ARG0=>a, ARG1=>b, RESULT=>a+b]
-""")
-
-p("""Where a and b are all possible values which can be summed.
-Clearly, it is not possible to enumerate this table, but given
-a sequence of substitutions with defined values for ARG0 and ARG1
-such as""")
-
-pre("""
- [ARG0=>1, ARG1=-4]
- [ARG0=>2.6, ARG1=50]
- [ARG0=>99, ARG1=1]
-""")
-
-p("""it is possible to implement a "join operation" against
-this sequence that performs the same augmentation as a join with
-the infinite table defined above:""")
-
-pre("""
- [ARG0=>1, ARG1=-4, RESULT=-3]
- [ARG0=>2.6, ARG1=50, RESULT=52.6]
- [ARG0=>99, ARG1=1, RESULT=100]
-""")
-
-p("""Furthermore by giving an "infinite estimate" for
-all attempts to evaluate the join where ARG0 and ARG1 are not
-available the generalized table implementation for the addition
-operation can refuse to compute an "infinite join." """)
-
-p("""More generally all functions f(a,b,c,d) are represented in
-gadfly as generalized tables containing all possible relevant
-entries""")
-
-pre("""
- [ARG0=>a, ARG1=>b, ARG2=>c, ARG3=>d, RESULT=>f(a,b,c,d)]""")
-
-p("""and the join estimation function refuses all attempts to perform
-a join unless all the arguments are provided by the input substitution
-sequence.""")
-
-header("Implementing Predicates")
-
-p("""Similarly to functions, predicates such as less-than and BETWEEN
-and LIKE are implemented using the generalized table mechanism.
-For example the "x BETWEEN y AND z" predicate is implemented
-as a generalized table "containing" all possible""")
-
-pre("""
- [ARG0=>a, ARG1=>b, ARG2=>c]""")
-
-p("""where b<a<c. Furthermore joins with this table are not
-permitted unless all three arguments are available in the sequence
-of input substitutions.""")
-
-header("Some Gadfly extension interfaces")
-
-p("""A gadfly database engine may be extended with user defined
-functions, predicates, and alternative table and index implementations.
-This section snapshots several Gadfly 2.0 interfaces, currently under
-development and likely to change before the package is released.""")
-
-p("""The basic interface for adding functions and predicates (logical tests)
-to a gadfly engine are relatively straightforward. For example to add the
-ability to match a regular expression within a gadfly query use the
-following implementation.""")
-
-pre("""
- from re import match
-
- def addrematch(gadflyinstance):
- gadflyinstance.add_predicate("rematch", match)
-""")
-p("""
-Then upon connecting to the database execute
-""")
-pre("""
- g = gadfly(...)
- ...
- addrematch(g)
-""")
-p("""
-In this case the "semijoin operation" associated with the new predicate
-"rematch" is automatically generated, and after the add_predicate
-binding operation the gadfly instance supports queries such as""")
-pre("""
- select drinker, beer
- from likes
- where rematch('b*', beer) and drinker not in
- (select drinker from frequents where rematch('c*', bar))
-""")
-p("""
-By embedding the "rematch" operation within the query the SQL
-engine can do "more work" for the programmer and reduce or eliminate the
-need to process the query result externally to the engine.
-""")
-p("""
-In a similar manner functions may be added to a gadfly instance,""")
-pre("""
- def modulo(x,y):
- return x % y
-
- def addmodulo(gadflyinstance):
- gadflyinstance.add_function("modulo", modulo)
-
- ...
- g = gadfly(...)
- ...
- addmodulo(g)
-""")
-p("""
-Then after the binding the modulo function can be used whereever
-an SQL expression can occur.
-""")
-p("""
-Adding alternative table implementations to a Gadfly instance
-is more interesting and more difficult. An "extension table" implementation
-must conform to the following interface:""")
-
-pre("""
- # get the kjbuckets.kjSet set of attribute names for this table
- names = table.attributes()
-
- # estimate the difficulty of evaluating a join given known attributes
- # return None for "impossible" or n>=0 otherwise with larger values
- # indicating greater difficulty or expense
- estimate = table.estimate(known_attributes)
-
- # return the join of the rows of the table with
- # the list of kjbuckets.kjDict mappings as a list of mappings.
- resultmappings = table.join(listofmappings)
-""")
-p("""
-In this case add the table to a gadfly instance using""")
-pre("""
- gadflyinstance.add_table("table_name", table)
-""")
-p("""
-For example to add a table which automatically queries filenames
-in the filesystems of the host computer a gadfly instance could
-be augmented with a GLOB table implemented using the standard
-library function glob.glob as follows:""")
-pre("""
- import kjbuckets
-
- class GlobTable:
- def __init__(self): pass
-
- def attributes(self):
- return kjbuckets.kjSet("PATTERN", "NAME")
-
- def estimate(self, known_attributes):
- if known_attributes.member("PATTERN"):
- return 66 # join not too difficult
- else:
- return None # join is impossible (must have PATTERN)
-
- def join(self, listofmappings):
- from glob import glob
- result = []
- for m in listofmappings:
- pattern = m["PATTERN"]
- for name in glob(pattern):
- newmapping = kjbuckets.kjDict(m)
- newmapping["NAME"] = name
- if newmapping.Clean():
- result.append(newmapping)
- return result
-
- ...
- gadfly_instance.add_table("GLOB", GlobTable())
-""")
-p("""
-Then one could formulate queries such as "list the files in directories
-associated with packages installed by guido"
-""")
-pre("""
- select g.name as filename
- from packages p, glob g
- where p.installer = 'guido' and g.pattern=p.root_directory
-""")
-p("""
-Note that conceptually the GLOB table is an infinite table including
-all filenames on the current computer in the "NAME" column, paired with
-a potentially infinite number of patterns.
-""")
-p("""
-More interesting examples would allow queries to remotely access
-data served by an HTTP server, or from any other resource.
-""")
-p("""
-Furthermore an extension table can be augmented with update methods
-""")
-pre("""
- table.insert_rows(listofmappings)
- table.update_rows(oldlist, newlist)
- table.delete_rows(oldlist)
-""")
-p("""
-Note: at present the implementation does not enforce recovery or
-transaction semantics for updates to extension tables, although this
-may change in the final release.
-""")
-p("""
-The table implementation is free to provide its own implementations of
-indices which take advantage of data provided by the join argument.
-""")
-
-header("Efficiency Notes")
-
-p("""The following thought experiment attempts to explain why the
-Gadfly implementation is surprisingly fast considering that it
-is almost entirely implemented in Python (an interpreted programming
-language which is not especially fast when compared to alternatives).
-Although Gadfly is quite complex, at an abstract level the process
-of query evaluation boils down to a series of embedded loops.
-Consider the following nested loops:""")
-
-pre("""
- iterate 1000:
- f(...) # fixed cost of outer loop
- iterate 10:
- g(...) # fixed cost of middle loop
- iterate 10:
- # the real work (string parse, matrix mul, query eval...)
- h(...)""")
-
-p("""In my experience many computations follow this pattern where
-f, g, are complex, dynamic, special purpose and h is simple, general
-purpose, static. Some example computations that follow this pattern
-include: file massaging (perl), matrix manipulation (python, tcl),
-database/cgi page generation, and vector graphics/imaging.""")
-
-p("""Suppose implementing f, g, h in python is easy but result in
-execution times10 times slower than a much harder implementation
-in C, choosing arbitrary and debatable numbers assume each function
-call consumes 1 tick in C, 5 ticks in java, 10 ticks in python
-for a straightforward implementation of each function f, g, and
-h. Under these conditions we get the following cost analysis,
-eliminating some uninteresting combinations, of implementing the
-function f, g, and h in combinations of Python, C and java:""")
-
-pre("""
-COST | FLANG | GLANG | HLANG
-==================================
-111000 | C | C | C
-115000 | java | C | C
-120000 | python | C | C
-155000 | java | java | C
-210000 | python | python | C
-555000 | java | java | java
-560000 | python | java | java
-610000 | python | python | java
-1110000 | python | python | python
-""")
-
-p("""Note that moving only the innermost loop to C (python/python/C)
-speeds up the calculation by half an order of magnitude compared
-to the python-only implementation and brings the speed to within
-a factor of 2 of an implementation done entirely in C.""")
-
-p("""Although this artificial and contrived thought experiment is
-far from conclusive, we may be tempted to draw the conclusion
-that generally programmers should focus first on obtaining a working
-implementation (because as John Ousterhout is reported to have
-said "the biggest performance improvement is the transition
-from non-working to working") using the methodology that
-is most likely to obtain a working solution the quickest (Python). Only then if the performance
-is inadequate should the programmer focus on optimizing
-the inner most loops, perhaps moving them to a very efficient
-implementation (C). Optimizing the outer loops will buy little
-improvement, and should be done later, if ever.""")
-
-p("""This was precisely the strategy behind the gadfly implementations,
-where most of the inner loops are implemented in the kjbuckets
-C extension module and the higher level logic is all in Python.
-This also explains why gadfly appears to be "slower"
-for simple queries over small data sets, but seems to be relatively
-"faster" for more complex queries over larger data sets,
-since larger queries and data sets take better advantage of the
-optimized inner loops.""")
-
-header("A Gadfly variant for OLAP?")
-
-p("""In private correspondence Andy Robinson points out that the
-basic logical design underlying Gadfly could be adapted to provide
-Online Analytical Processing (OLAP) and other forms of data warehousing
-and data mining. Since SQL is not particularly well suited for
-the kinds of requests common in these domains the higher level
-interfaces would require modification, but the underlying logic
-of substitutions and name mappings seems to be appropriate.""")
-
-header("Conclusion")
-
-p("""The revamped query engine design in Gadfly 2 supports
-a flexible and general extension methodology that permits programmers
-to extend the gadfly engine to include additional computations
-and access to remote data sources. Among other possibilities this
-will permit the gadfly engine to make use of disk based indexed
-tables and to dynamically retrieve information from remote data
-sources (such as an Excel spreadsheet or an Oracle database).
-These features will make gadfly a very useful tool for data manipulation
-and integration.""")
-
-header("References")
-
-p("""[Van Rossum] Van Rossum, Python Reference Manual, Tutorial, and Library Manuals,
-please look to http://www.python.org
-for the latest versions, downloads and links to printed versions.""")
-
-p("""[O'Neill] O'Neill, P., Data Base Principles, Programming, Performance,
-Morgan Kaufmann Publishers, San Francisco, 1994.""")
-
-p("""[Korth and Silberschatz] Korth, H. and Silberschatz, A. and Sudarshan, S.
-Data Base System Concepts, McGraw-Hill Series in Computer Science, Boston,
-1997""")
-
-p("""[Gadfly]Gadfly: SQL Relational Database in Python,
-http://www.chordate.com/kwParsing/gadfly.html""")
-
-go()
\ No newline at end of file
diff --git a/bin/reportlab/demos/odyssey/00readme.txt b/bin/reportlab/demos/odyssey/00readme.txt
deleted file mode 100644
index 95c622ac279..00000000000
--- a/bin/reportlab/demos/odyssey/00readme.txt
+++ /dev/null
@@ -1,56 +0,0 @@
-This contains a number of benchmarks and demos
-based on Homer's Odyssey (which is widely available
-in plain, line-oriented text format). There are a large
-selection of online books at:
- http://classics.mit.edu/
-
-
-Our distribution ships with just the first chapter
-in odyssey.txt. For a more meaningful speed test,
-download the full copy from
- http://www.reportlab.com/ftp/odyssey.full.zip
-or
- ftp://ftp.reportlab.com/odyssey.full.zip
-and unzip to extract odyssey.full.txt (608kb).
-
-Benchmark speed depends quite critically
-on the presence of our accelerator module,
-_rl_accel, which is a C (or Java) extension.
-Serious users ought to compile or download this!
-
-The times quoted are from one machine (Andy Robinson's
-home PC, approx 1.2Ghz 128Mb Ram, Win2k in Sep 2003)
-in order to give a rough idea of what features cost
-what performance.
-
-
-The tests are as follows:
-
-(1) odyssey.py (produces odyssey.pdf)
-This demo takes a large volume of text and prints it
-in the simplest way possible. It is a demo of the
-basic technique of looping down a page manually and
-breaking at the bottom. On my 1.2 Ghz machine this takes
-1.91 seconds (124 pages per second)
-
-(2) fodyssey.py (produces fodyssey.pdf)
-This is a 'flowing document' we parse the file and
-throw away line breaks to make proper paragraphs.
-The Platypus framework renders these. This necessitates
-measuring the width of every word in every paragraph
-for wrapping purposes.
-
-This takes 3.27 seconds on the same machine. Paragraph
-wrapping basically doubles the work. The text is more
-compact with about 50% more words per page. Very roughly,
-we can wrap 40 pages of ten-point text per second and save
-to PDF.
-
-(3) dodyssey.py (produced dodyssey.pdf)
-This is a slightly fancier version which uses different
-page templates (one column for first page in a chapter,
-two column for body poages). The additional layout logic
-adds about 15%, going up to 3.8 seconds. This is probably
-a realistic benchmark for a simple long text document
-with a single pass. Documents doing cross-references
-and a table of contents might need twice as long.
diff --git a/bin/reportlab/demos/odyssey/dodyssey.py b/bin/reportlab/demos/odyssey/dodyssey.py
deleted file mode 100644
index edc24354eca..00000000000
--- a/bin/reportlab/demos/odyssey/dodyssey.py
+++ /dev/null
@@ -1,254 +0,0 @@
-#Copyright ReportLab Europe Ltd. 2000-2004
-#see license.txt for license details
-#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/demos/odyssey/dodyssey.py
-__version__=''' $Id: dodyssey.py 2856 2006-05-11 09:48:13Z rgbecker $ '''
-__doc__=''
-
-#REPORTLAB_TEST_SCRIPT
-import sys, copy, string, os
-from reportlab.platypus import *
-_NEW_PARA=os.environ.get('NEW_PARA','0')[0] in ('y','Y','1')
-_REDCAP=int(os.environ.get('REDCAP','0'))
-_CALLBACK=os.environ.get('CALLBACK','0')[0] in ('y','Y','1')
-if _NEW_PARA:
- def Paragraph(s,style):
- from rlextra.radxml.para import Paragraph as PPPP
- return PPPP(s,style)
-
-from reportlab.lib.units import inch
-from reportlab.lib.styles import getSampleStyleSheet
-from reportlab.lib.enums import TA_LEFT, TA_RIGHT, TA_CENTER, TA_JUSTIFY
-
-import reportlab.rl_config
-reportlab.rl_config.invariant = 1
-
-styles = getSampleStyleSheet()
-
-Title = "The Odyssey"
-Author = "Homer"
-
-def myTitlePage(canvas, doc):
- canvas.saveState()
- canvas.restoreState()
-
-def myLaterPages(canvas, doc):
- canvas.saveState()
- canvas.setFont('Times-Roman',9)
- canvas.drawString(inch, 0.75 * inch, "Page %d" % doc.page)
- canvas.restoreState()
-
-def go():
- def myCanvasMaker(fn,**kw):
- from reportlab.pdfgen.canvas import Canvas
- canv = apply(Canvas,(fn,),kw)
- # attach our callback to the canvas
- canv.myOnDrawCB = myOnDrawCB
- return canv
-
- doc = BaseDocTemplate('dodyssey.pdf',showBoundary=0)
-
- #normal frame as for SimpleFlowDocument
- frameT = Frame(doc.leftMargin, doc.bottomMargin, doc.width, doc.height, id='normal')
-
- #Two Columns
- frame1 = Frame(doc.leftMargin, doc.bottomMargin, doc.width/2-6, doc.height, id='col1')
- frame2 = Frame(doc.leftMargin+doc.width/2+6, doc.bottomMargin, doc.width/2-6,
- doc.height, id='col2')
- doc.addPageTemplates([PageTemplate(id='First',frames=frameT, onPage=myTitlePage),
- PageTemplate(id='OneCol',frames=frameT, onPage=myLaterPages),
- PageTemplate(id='TwoCol',frames=[frame1,frame2], onPage=myLaterPages),
- ])
- doc.build(Elements,canvasmaker=myCanvasMaker)
-
-Elements = []
-
-ChapterStyle = copy.deepcopy(styles["Heading1"])
-ChapterStyle.alignment = TA_CENTER
-ChapterStyle.fontsize = 14
-InitialStyle = copy.deepcopy(ChapterStyle)
-InitialStyle.fontsize = 16
-InitialStyle.leading = 20
-PreStyle = styles["Code"]
-
-def newPage():
- Elements.append(PageBreak())
-
-chNum = 0
-def myOnDrawCB(canv,kind,label):
- print 'myOnDrawCB(%s)'%kind, 'Page number=', canv.getPageNumber(), 'label value=', label
-
-def chapter(txt, style=ChapterStyle):
- global chNum
- Elements.append(NextPageTemplate('OneCol'))
- newPage()
- chNum = chNum + 1
- if _NEW_PARA or not _CALLBACK:
- Elements.append(Paragraph(('chap %d'%chNum)+txt, style))
- else:
- Elements.append(Paragraph(('foo '%chNum)+txt, style))
- Elements.append(Spacer(0.2*inch, 0.3*inch))
- if useTwoCol:
- Elements.append(NextPageTemplate('TwoCol'))
-
-def fTitle(txt,style=InitialStyle):
- Elements.append(Paragraph(txt, style))
-
-ParaStyle = copy.deepcopy(styles["Normal"])
-ParaStyle.spaceBefore = 0.1*inch
-if 'right' in sys.argv:
- ParaStyle.alignment = TA_RIGHT
-elif 'left' in sys.argv:
- ParaStyle.alignment = TA_LEFT
-elif 'justify' in sys.argv:
- ParaStyle.alignment = TA_JUSTIFY
-elif 'center' in sys.argv or 'centre' in sys.argv:
- ParaStyle.alignment = TA_CENTER
-else:
- ParaStyle.alignment = TA_JUSTIFY
-
-useTwoCol = 'notwocol' not in sys.argv
-
-def spacer(inches):
- Elements.append(Spacer(0.1*inch, inches*inch))
-
-def p(txt, style=ParaStyle):
- if _REDCAP:
- fs, fe = '', ' '
- n = len(txt)
- for i in xrange(n):
- if 'a'<=txt[i]<='z' or 'A'<=txt[i]<='Z':
- txt = (txt[:i]+(fs+txt[i]+fe))+txt[i+1:]
- break
- if _REDCAP>=2 and n>20:
- j = i+len(fs)+len(fe)+1+int((n-1)/2)
- while not ('a'<=txt[j]<='z' or 'A'<=txt[j]<='Z'): j += 1
- txt = (txt[:j]+(''+txt[j]+' '))+txt[j+1:]
-
- if _REDCAP==3 and n>20:
- n = len(txt)
- fs = ''
- for i in xrange(n-1,-1,-1):
- if 'a'<=txt[i]<='z' or 'A'<=txt[i]<='Z':
- txt = txt[:i]+((fs+txt[i]+fe)+txt[i+1:])
- break
-
- Elements.append(Paragraph(txt, style))
-
-firstPre = 1
-def pre(txt, style=PreStyle):
- global firstPre
- if firstPre:
- Elements.append(NextPageTemplate('OneCol'))
- newPage()
- firstPre = 0
-
- spacer(0.1)
- p = Preformatted(txt, style)
- Elements.append(p)
-
-def parseOdyssey(fn):
- from time import time
- E = []
- t0=time()
- L = open(fn,'r').readlines()
- t1 = time()
- print "open(%s,'r').readlines() took %.4f seconds" %(fn,t1-t0)
- for i in xrange(len(L)):
- if L[i][-1]=='\012':
- L[i] = L[i][:-1]
- t2 = time()
- print "Removing all linefeeds took %.4f seconds" %(t2-t1)
- L.append('')
- L.append('-----')
-
- def findNext(L, i):
- while 1:
- if string.strip(L[i])=='':
- del L[i]
- kind = 1
- if i%s ' % Title, InitialStyle])
- E.append([fTitle,'by %s ' % Author, InitialStyle])
-
- while 1:
- if f>=len(L): break
-
- if string.upper(L[f][0:5])=='BOOK ':
- E.append([chapter,L[f]])
- f=f+1
- while string.strip(L[f])=='': del L[f]
- style = ParaStyle
- func = p
- else:
- style = PreStyle
- func = pre
-
- while 1:
- s=f
- f, k=findNext(L,s)
- sep= (func is pre) and '\012' or ' '
- E.append([func,string.join(L[s:f],sep),style])
- if k: break
- t3 = time()
- print "Parsing into memory took %.4f seconds" %(t3-t2)
- del L
- t4 = time()
- print "Deleting list of lines took %.4f seconds" %(t4-t3)
- for i in xrange(len(E)):
- apply(E[i][0],E[i][1:])
- t5 = time()
- print "Moving into platypus took %.4f seconds" %(t5-t4)
- del E
- t6 = time()
- print "Deleting list of actions took %.4f seconds" %(t6-t5)
- go()
- t7 = time()
- print "saving to PDF took %.4f seconds" %(t7-t6)
- print "Total run took %.4f seconds"%(t7-t0)
-
- import md5
- print 'file digest: %s' % md5.md5(open('dodyssey.pdf','rb').read()).hexdigest()
-
-def run():
- for fn in ('odyssey.full.txt','odyssey.txt'):
- if os.path.isfile(fn):
- parseOdyssey(fn)
- break
-
-def doProf(profname,func,*args,**kwd):
- import hotshot, hotshot.stats
- prof = hotshot.Profile(profname)
- prof.runcall(func)
- prof.close()
- stats = hotshot.stats.load(profname)
- stats.strip_dirs()
- stats.sort_stats('time', 'calls')
- stats.print_stats(20)
-
-if __name__=='__main__':
- if '--prof' in sys.argv:
- doProf('dodyssey.prof',run)
- else:
- run()
diff --git a/bin/reportlab/demos/odyssey/fodyssey.py b/bin/reportlab/demos/odyssey/fodyssey.py
deleted file mode 100644
index bbb6797e7a7..00000000000
--- a/bin/reportlab/demos/odyssey/fodyssey.py
+++ /dev/null
@@ -1,165 +0,0 @@
-#Copyright ReportLab Europe Ltd. 2000-2004
-#see license.txt for license details
-#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/demos/odyssey/fodyssey.py
-__version__=''' $Id: fodyssey.py 2385 2004-06-17 15:26:05Z rgbecker $ '''
-__doc__=''
-
-#REPORTLAB_TEST_SCRIPT
-import sys, copy, string, os
-from reportlab.platypus import *
-from reportlab.lib.units import inch
-from reportlab.lib.styles import getSampleStyleSheet
-from reportlab.lib.enums import TA_LEFT, TA_RIGHT, TA_CENTER, TA_JUSTIFY
-
-styles = getSampleStyleSheet()
-
-Title = "The Odyssey"
-Author = "Homer"
-
-def myFirstPage(canvas, doc):
- canvas.saveState()
- canvas.restoreState()
-
-def myLaterPages(canvas, doc):
- canvas.saveState()
- canvas.setFont('Times-Roman',9)
- canvas.drawString(inch, 0.75 * inch, "Page %d" % doc.page)
- canvas.restoreState()
-
-def go():
- doc = SimpleDocTemplate('fodyssey.pdf',showBoundary='showboundary' in sys.argv)
- doc.allowSplitting = not 'nosplitting' in sys.argv
- doc.build(Elements,myFirstPage,myLaterPages)
-
-Elements = []
-
-ChapterStyle = copy.copy(styles["Heading1"])
-ChapterStyle.alignment = TA_CENTER
-ChapterStyle.fontsize = 16
-InitialStyle = copy.deepcopy(ChapterStyle)
-InitialStyle.fontsize = 16
-InitialStyle.leading = 20
-PreStyle = styles["Code"]
-
-def newPage():
- Elements.append(PageBreak())
-
-def chapter(txt, style=ChapterStyle):
- newPage()
- Elements.append(Paragraph(txt, style))
- Elements.append(Spacer(0.2*inch, 0.3*inch))
-
-def fTitle(txt,style=InitialStyle):
- Elements.append(Paragraph(txt, style))
-
-ParaStyle = copy.deepcopy(styles["Normal"])
-ParaStyle.spaceBefore = 0.1*inch
-if 'right' in sys.argv:
- ParaStyle.alignment = TA_RIGHT
-elif 'left' in sys.argv:
- ParaStyle.alignment = TA_LEFT
-elif 'justify' in sys.argv:
- ParaStyle.alignment = TA_JUSTIFY
-elif 'center' in sys.argv or 'centre' in sys.argv:
- ParaStyle.alignment = TA_CENTER
-else:
- ParaStyle.alignment = TA_JUSTIFY
-
-def spacer(inches):
- Elements.append(Spacer(0.1*inch, inches*inch))
-
-def p(txt, style=ParaStyle):
- Elements.append(Paragraph(txt, style))
-
-def pre(txt, style=PreStyle):
- spacer(0.1)
- p = Preformatted(txt, style)
- Elements.append(p)
-
-def parseOdyssey(fn):
- from time import time
- E = []
- t0=time()
- L = open(fn,'r').readlines()
- t1 = time()
- print "open(%s,'r').readlines() took %.4f seconds" %(fn,t1-t0)
- for i in xrange(len(L)):
- if L[i][-1]=='\012':
- L[i] = L[i][:-1]
- t2 = time()
- print "Removing all linefeeds took %.4f seconds" %(t2-t1)
- L.append('')
- L.append('-----')
-
- def findNext(L, i):
- while 1:
- if string.strip(L[i])=='':
- del L[i]
- kind = 1
- if i%s ' % Title, InitialStyle])
- E.append([fTitle,'by %s ' % Author, InitialStyle])
-
- while 1:
- if f>=len(L): break
-
- if string.upper(L[f][0:5])=='BOOK ':
- E.append([chapter,L[f]])
- f=f+1
- while string.strip(L[f])=='': del L[f]
- style = ParaStyle
- func = p
- else:
- style = PreStyle
- func = pre
-
- while 1:
- s=f
- f, k=findNext(L,s)
- sep= (func is pre) and '\012' or ' '
- E.append([func,string.join(L[s:f],sep),style])
- if k: break
- t3 = time()
- print "Parsing into memory took %.4f seconds" %(t3-t2)
- del L
- t4 = time()
- print "Deleting list of lines took %.4f seconds" %(t4-t3)
- for i in xrange(len(E)):
- apply(E[i][0],E[i][1:])
- t5 = time()
- print "Moving into platypus took %.4f seconds" %(t5-t4)
- del E
- t6 = time()
- print "Deleting list of actions took %.4f seconds" %(t6-t5)
- go()
- t7 = time()
- print "saving to PDF took %.4f seconds" %(t7-t6)
- print "Total run took %.4f seconds"%(t7-t0)
-
-for fn in ('odyssey.full.txt','odyssey.txt'):
- if os.path.isfile(fn):
- break
-if __name__=='__main__':
- parseOdyssey(fn)
\ No newline at end of file
diff --git a/bin/reportlab/demos/odyssey/odyssey.py b/bin/reportlab/demos/odyssey/odyssey.py
deleted file mode 100644
index ae8d9d6188c..00000000000
--- a/bin/reportlab/demos/odyssey/odyssey.py
+++ /dev/null
@@ -1,151 +0,0 @@
-#Copyright ReportLab Europe Ltd. 2000-2004
-#see license.txt for license details
-#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/demos/odyssey/odyssey.py
-__version__=''' $Id: odyssey.py 2385 2004-06-17 15:26:05Z rgbecker $ '''
-___doc__=''
-#odyssey.py
-#
-#Demo/benchmark of PDFgen rendering Homer's Odyssey.
-
-
-
-#results on my humble P266 with 64MB:
-# Without page compression:
-# 239 pages in 3.76 seconds = 77 pages per second
-
-# With textOut rather than textLine, i.e. computing width
-# of every word as we would for wrapping:
-# 239 pages in 10.83 seconds = 22 pages per second
-
-# With page compression and textLine():
-# 239 pages in 39.39 seconds = 6 pages per second
-
-from reportlab.pdfgen import canvas
-import time, os, sys
-
-#find out what platform we are on and whether accelerator is
-#present, in order to print this as part of benchmark info.
-try:
- import _rl_accel
- ACCEL = 1
-except ImportError:
- ACCEL = 0
-
-
-
-
-from reportlab.lib.units import inch, cm
-from reportlab.lib.pagesizes import A4
-
-#precalculate some basics
-top_margin = A4[1] - inch
-bottom_margin = inch
-left_margin = inch
-right_margin = A4[0] - inch
-frame_width = right_margin - left_margin
-
-
-def drawPageFrame(canv):
- canv.line(left_margin, top_margin, right_margin, top_margin)
- canv.setFont('Times-Italic',12)
- canv.drawString(left_margin, top_margin + 2, "Homer's Odyssey")
- canv.line(left_margin, top_margin, right_margin, top_margin)
-
-
- canv.line(left_margin, bottom_margin, right_margin, bottom_margin)
- canv.drawCentredString(0.5*A4[0], 0.5 * inch,
- "Page %d" % canv.getPageNumber())
-
-
-
-def run(verbose=1):
- if sys.platform[0:4] == 'java':
- impl = 'Jython'
- else:
- impl = 'Python'
- verStr = '%d.%d' % (sys.version_info[0:2])
- if ACCEL:
- accelStr = 'with _rl_accel'
- else:
- accelStr = 'without _rl_accel'
- print 'Benchmark of %s %s %s' % (impl, verStr, accelStr)
-
- started = time.time()
- canv = canvas.Canvas('odyssey.pdf', invariant=1)
- canv.setPageCompression(1)
- drawPageFrame(canv)
-
- #do some title page stuff
- canv.setFont("Times-Bold", 36)
- canv.drawCentredString(0.5 * A4[0], 7 * inch, "Homer's Odyssey")
-
- canv.setFont("Times-Bold", 18)
- canv.drawCentredString(0.5 * A4[0], 5 * inch, "Translated by Samuel Burton")
-
- canv.setFont("Times-Bold", 12)
- tx = canv.beginText(left_margin, 3 * inch)
- tx.textLine("This is a demo-cum-benchmark for PDFgen. It renders the complete text of Homer's Odyssey")
- tx.textLine("from a text file. On my humble P266, it does 77 pages per secondwhile creating a 238 page")
- tx.textLine("document. If it is asked to computer text metrics, measuring the width of each word as ")
- tx.textLine("one would for paragraph wrapping, it still manages 22 pages per second.")
- tx.textLine("")
- tx.textLine("Andy Robinson, Robinson Analytics Ltd.")
- canv.drawText(tx)
-
- canv.showPage()
- #on with the text...
- drawPageFrame(canv)
-
- canv.setFont('Times-Roman', 12)
- tx = canv.beginText(left_margin, top_margin - 0.5*inch)
-
- for fn in ('odyssey.full.txt','odyssey.txt'):
- if os.path.isfile(fn):
- break
-
- data = open(fn,'r').readlines()
- for line in data:
- #this just does it the fast way...
- tx.textLine(line)
- #this forces it to do text metrics, which would be the slow
- #part if we were wrappng paragraphs.
- #canv.textOut(line)
- #canv.textLine('')
-
- #page breaking
- y = tx.getY() #get y coordinate
- if y < bottom_margin + 0.5*inch:
- canv.drawText(tx)
- canv.showPage()
- drawPageFrame(canv)
- canv.setFont('Times-Roman', 12)
- tx = canv.beginText(left_margin, top_margin - 0.5*inch)
-
- #page
- pg = canv.getPageNumber()
- if verbose and pg % 10 == 0:
- print 'formatted page %d' % canv.getPageNumber()
-
- if tx:
- canv.drawText(tx)
- canv.showPage()
- drawPageFrame(canv)
-
- if verbose:
- print 'about to write to disk...'
-
- canv.save()
-
- finished = time.time()
- elapsed = finished - started
- pages = canv.getPageNumber()-1
- speed = pages / elapsed
- fileSize = os.stat('odyssey.pdf')[6] / 1024
- print '%d pages in %0.2f seconds = %0.2f pages per second, file size %d kb' % (
- pages, elapsed, speed, fileSize)
- import md5
- print 'file digest: %s' % md5.md5(open('odyssey.pdf','rb').read()).hexdigest()
-
-if __name__=='__main__':
- quiet = ('-q' in sys.argv)
- run(verbose = not quiet)
\ No newline at end of file
diff --git a/bin/reportlab/demos/odyssey/odyssey.txt b/bin/reportlab/demos/odyssey/odyssey.txt
deleted file mode 100644
index f5e4b7f9d60..00000000000
--- a/bin/reportlab/demos/odyssey/odyssey.txt
+++ /dev/null
@@ -1,207 +0,0 @@
-Provided by The Internet Classics Archive.
-See bottom for copyright. Available online at
- http://classics.mit.edu//Homer/odyssey.html
-
-The Odyssey
-By Homer
-
-
-Translated by Samuel Butler
-
-----------------------------------------------------------------------
-
-BOOK I
-I Tell me, O muse, of that ingenious hero who travelled far and wide
- a b c &| & | A ' A ' after he had sacked the famous town of Troy . Many cities did he visit,
-and many were the nations with whose manners and customs he was acquainted;
-moreover he suffered much by sea while trying to save his own life
-and bring his men safely home; but do what he might he could not
-save1
-his men, for they perished through their own sheer folly in eating
-the cattle of the Sun-god Hyperion; so the god prevented them from
-ever reaching home. Tell me, too, about all these things, O daughter
-of Jove, from whatsoever source you may know them.
-
-So now all who escaped death in battle or by shipwreck had got safely
-home except Ulysses, and he, though he was longing to return to his
-wife and country, was detained by the goddess Calypso, who had got
-him into a large cave and wanted to marry him. But as years went by,
-there came a time when the gods settled that he should go back to
-Ithaca; even then, however, when he was among his own people, his
-troubles were not yet over; nevertheless all the gods had now begun
-to pity him except Neptune, who still persecuted him without ceasing
-and would not let him get home.
-
-Now Neptune had gone off to the Ethiopians, who are at the world's
-end, and lie in two halves, the one looking West and the other East.
-He had gone there to accept a hecatomb of sheep and oxen, and was
-enjoying himself at his festival; but the other gods met in the house
-of Olympian Jove, and the sire of gods and men spoke first. At that
-moment he was thinking of Aegisthus, who had been killed by Agamemnon's
-son Orestes; so he said to the other gods:
-
-"See now, how men lay blame upon us gods for what is after all nothing
-but their own folly. Look at Aegisthus; he must needs make love to
-Agamemnon's wife unrighteously and then kill Agamemnon, though he
-knew it would be the death of him; for I sent Mercury to warn him
-not to do either of these things, inasmuch as Orestes would be sure
-to take his revenge when he grew up and wanted to return home. Mercury
-told him this in all good will but he would not listen, and now he
-has paid for everything in full."
-
-Then Minerva said, "Father, son of Saturn, King of kings, it served
-Aegisthus right, and so it would any one else who does as he did;
-but Aegisthus is neither here nor there; it is for Ulysses that my
-heart bleeds, when I think of his sufferings in that lonely sea-girt
-island, far away, poor man, from all his friends. It is an island
-covered with forest, in the very middle of the sea, and a goddess
-lives there, daughter of the magician Atlas, who looks after the bottom
-of the ocean, and carries the great columns that keep heaven and earth
-asunder. This daughter of Atlas has got hold of poor unhappy Ulysses,
-and keeps trying by every kind of blandishment to make him forget
-his home, so that he is tired of life, and thinks of nothing but how
-he may once more see the smoke of his own chimneys. You, sir, take
-no heed of this, and yet when Ulysses was before Troy did he not propitiate
-you with many a burnt sacrifice? Why then should you keep on being
-so angry with him?"
-
-And Jove said, "My child, what are you talking about? How can I forget
-Ulysses than whom there is no more capable man on earth, nor more
-liberal in his offerings to the immortal gods that live in heaven?
-Bear in mind, however, that Neptune is still furious with Ulysses
-for having blinded an eye of Polyphemus king of the Cyclopes. Polyphemus
-is son to Neptune by the nymph Thoosa, daughter to the sea-king Phorcys;
-therefore though he will not kill Ulysses outright, he torments him
-by preventing him from getting home. Still, let us lay our heads together
-and see how we can help him to return; Neptune will then be pacified,
-for if we are all of a mind he can hardly stand out against us."
-
-And Minerva said, "Father, son of Saturn, King of kings, if, then,
-the gods now mean that Ulysses should get home, we should first send
-Mercury to the Ogygian island to tell Calypso that we have made up
-our minds and that he is to return. In the meantime I will go to Ithaca,
-to put heart into Ulysses' son Telemachus; I will embolden him to
-call the Achaeans in assembly, and speak out to the suitors of his
-mother Penelope, who persist in eating up any number of his sheep
-and oxen; I will also conduct him to Sparta and to Pylos, to see if
-he can hear anything about the return of his dear father- for this
-will make people speak well of him."
-
-Ellipsis ellipsis ellipsis ellipsis ellipsis ellipsis ellipsis ellipsis.
-Ellipsis ellipsis ellipsis ellipsis ellipsis ellipsis ellipsis ellipsis.
-Ellipsis ellipsis ellipsis ellipsis ellipsis ellipsis ellipsis ellipsis.
-Ellipsis ellipsis ellipsis ellipsis ellipsis ellipsis ellipsis ellipsis.
-Ellipsis ellipsis ellipsis ellipsis ellipsis ellipsis ellipsis ellipsis.
-Ellipsis ellipsis ellipsis ellipsis ellipsis ellipsis ellipsis ellipsis.
-Ellipsis ellipsis ellipsis ellipsis ellipsis ellipsis ellipsis ellipsis.
-Ellipsis ellipsis ellipsis ellipsis ellipsis ellipsis ellipsis ellipsis.
-Ellipsis ellipsis ellipsis ellipsis ellipsis ellipsis ellipsis ellipsis.
-
-"Men of Ithaca, it is all your own fault that things have turned out
-as they have; you would not listen to me, nor yet to Mentor, when
-we bade you check the folly of your sons who were doing much wrong
-in the wantonness of their hearts- wasting the substance and dishonouring
-the wife of a chieftain who they thought would not return. Now, however,
-let it be as I say, and do as I tell you. Do not go out against Ulysses,
-or you may find that you have been drawing down evil on your own heads."
-
-This was what he said, and more than half raised a loud shout, and
-at once left the assembly. But the rest stayed where they were, for
-the speech of Halitherses displeased them, and they sided with Eupeithes;
-they therefore hurried off for their armour, and when they had armed
-themselves, they met together in front of the city, and Eupeithes
-led them on in their folly. He thought he was going to avenge the
-murder of his son, whereas in truth he was never to return, but was
-himself to perish in his attempt.
-
-Then Minerva said to Jove, "Father, son of Saturn, king of kings,
-answer me this question- What do you propose to do? Will you set them
-fighting still further, or will you make peace between them?"
-
-And Jove answered, "My child, why should you ask me? Was it not by
-your own arrangement that Ulysses came home and took his revenge upon
-the suitors? Do whatever you like, but I will tell you what I think
-will be most reasonable arrangement. Now that Ulysses is revenged,
-let them swear to a solemn covenant, in virtue of which he shall continue
-to rule, while we cause the others to forgive and forget the massacre
-of their sons and brothers. Let them then all become friends as heretofore,
-and let peace and plenty reign."
-
-This was what Minerva was already eager to bring about, so down she
-darted from off the topmost summits of Olympus.
-
-Now when Laertes and the others had done dinner, Ulysses began by
-saying, "Some of you go out and see if they are not getting close
-up to us." So one of Dolius's sons went as he was bid. Standing on
-the threshold he could see them all quite near, and said to Ulysses,
-"Here they are, let us put on our armour at once."
-
-They put on their armour as fast as they could- that is to say Ulysses,
-his three men, and the six sons of Dolius. Laertes also and Dolius
-did the same- warriors by necessity in spite of their grey hair. When
-they had all put on their armour, they opened the gate and sallied
-forth, Ulysses leading the way.
-
-Then Jove's daughter Minerva came up to them, having assumed the form
-and voice of Mentor. Ulysses was glad when he saw her, and said to
-his son Telemachus, "Telemachus, now that are about to fight in an
-engagement, which will show every man's mettle, be sure not to disgrace
-your ancestors, who were eminent for their strength and courage all
-the world over."
-
-"You say truly, my dear father," answered Telemachus, "and you shall
-see, if you will, that I am in no mind to disgrace your family."
-
-Laertes was delighted when he heard this. "Good heavens, he exclaimed,
-"what a day I am enjoying: I do indeed rejoice at it. My son and grandson
-are vying with one another in the matter of valour."
-
-On this Minerva came close up to him and said, "Son of Arceisius-
-best friend I have in the world- pray to the blue-eyed damsel, and
-to Jove her father; then poise your spear and hurl it."
-
-As she spoke she infused fresh vigour into him, and when he had prayed
-to her he poised his spear and hurled it. He hit Eupeithes' helmet,
-and the spear went right through it, for the helmet stayed it not,
-and his armour rang rattling round him as he fell heavily to the ground.
-Meantime Ulysses and his son fell the front line of the foe and smote
-them with their swords and spears; indeed, they would have killed
-every one of them, and prevented them from ever getting home again,
-only Minerva raised her voice aloud, and made every one pause. "Men
-of Ithaca," she cried, cease this dreadful war, and settle the matter
-at once without further bloodshed."
-
-On this pale fear seized every one; they were so frightened that their
-arms dropped from their hands and fell upon the ground at the sound
-of the goddess's voice, and they fled back to the city for their lives.
-But Ulysses gave a great cry, and gathering himself together swooped
-down like a soaring eagle. Then the son of Saturn sent a thunderbolt
-of fire that fell just in front of Minerva, so she said to Ulysses,
-"Ulysses, noble son of Laertes, stop this warful strife, or Jove will
-be angry with you."
-
-Thus spoke Minerva, and Ulysses obeyed her gladly. Then Minerva assumed
-the form and voice of Mentor, and presently made a covenant of peace
-between the two contending parties.
-
-THE END
-
-----------------------------------------------------------------------
-
-Copyright statement:
-The Internet Classics Archive by Daniel C. Stevenson, Web Atomics.
-World Wide Web presentation is copyright (C) 1994-1998, Daniel
-C. Stevenson, Web Atomics.
-All rights reserved under international and pan-American copyright
-conventions, including the right of reproduction in whole or in part
-in any form. Direct permission requests to classics@classics.mit.edu.
-Translation of "The Deeds of the Divine Augustus" by Augustus is
-copyright (C) Thomas Bushnell, BSG.
-
-
-To really test that reportlab can produce pages quickly download the
-complete version of the test from http://classics.mit.edu//Homer/odyssey.html
-and copy it to this directory as odyssey.full.txt.
-
-A zipped version of the full text is available for download at
-ftp://ftp.reportlab.com/odyssey.full.zip
diff --git a/bin/reportlab/demos/rlzope/readme.txt b/bin/reportlab/demos/rlzope/readme.txt
deleted file mode 100644
index 4bd60a5bb64..00000000000
--- a/bin/reportlab/demos/rlzope/readme.txt
+++ /dev/null
@@ -1,73 +0,0 @@
-# rlzope : an external Zope method to show people how to use
-# the ReportLab toolkit from within Zope.
-#
-# this method searches an image named 'logo' in the
-# ZODB then prints it at the top of a simple PDF
-# document made with ReportLab
-#
-# the resulting PDF document is returned to the
-# user's web browser and, if possible, it is
-# simultaneously saved into the ZODB.
-#
-# this method illustrates how to use both the platypus
-# and canvas frameworks.
-#
-# License : The ReportLab Toolkit's license (similar to BSD)
-#
-# Author : Jerome Alet - alet@unice.fr
-#
-
-Installation instructions :
-===========================
-
- 0 - If not installed then install Zope.
-
- 1 - Install reportlab in the Zope/lib/python/Shared directory by unpacking
- the tarball and putting a reportlabs.pth file in site-packages for the Zope
- used with Python. The path value in the reportlabs.pth file must be
- relative. For a typical Zope installation, the path is "../../python/Shared".
- Remember to restart Zope so the new path is instantiated.
-
- 2 - Install PIL in the Zope/lib/python/Shared directory. You need to
- ensure that the _imaging.so or .pyd is also installed appropriately.
- It should be compatible with the python running the zope site.
-
- 3 - Copy rlzope.py to your Zope installation's "Extensions"
- subdirectory, e.g. /var/lib/zope/Extensions/ under Debian GNU/Linux.
-
- 4 - From within Zope's management interface, add an External Method with
- these parameters :
-
- Id : rlzope
- Title : rlzope
- Module Name : rlzope
- Function Name : rlzope
-
- 5 - From within Zope's management interface, add an image called "logo"
- in the same Folder than rlzope, or somewhere above in the Folder
- hierarchy. For example you can use ReportLab's logo which you
- can find in reportlab/docs/images/replogo.gif
-
- 6 - Point your web browser to rlzope, e.g. on my laptop under
- Debian GNU/Linux :
-
- http://localhost:9673/rlzope
-
- This will send a simple PDF document named 'dummy.pdf' to your
- web browser, and if possible save it as a File object in the
- Zope Object DataBase, with this name. Note, however, that if
- an object with the same name already exists then it won't
- be replaced for security reasons.
-
- You can optionally add a parameter called 'name' with
- a filename as the value, to specify another filename,
- e.g. :
-logo
- http://localhost:9673/rlzope?name=sample.pdf
-
- 7 - Adapt it to your own needs.
-
- 8 - Enjoy !
-
-Send comments or bug reports at : alet@unice.fr
-
diff --git a/bin/reportlab/demos/rlzope/rlzope.py b/bin/reportlab/demos/rlzope/rlzope.py
deleted file mode 100644
index 867d8466759..00000000000
--- a/bin/reportlab/demos/rlzope/rlzope.py
+++ /dev/null
@@ -1,169 +0,0 @@
-#
-# Using the ReportLab toolkit from within Zope
-#
-# WARNING : The MyPDFDoc class deals with ReportLab's platypus framework,
-# while the MyPageTemplate class directly deals with ReportLab's
-# canvas, this way you know how to do with both...
-#
-# License : the ReportLab Toolkit's one
-# see : http://www.reportlab.com
-#
-# Author : Jerome Alet - alet@unice.fr
-#
-#
-
-import string, cStringIO
-try :
- from Shared.reportlab.platypus.paragraph import Paragraph
- from Shared.reportlab.platypus.doctemplate import *
- from Shared.reportlab.lib.units import inch
- from Shared.reportlab.lib import styles
- from Shared.reportlab.lib.utils import ImageReader
-except ImportError :
- from reportlab.platypus.paragraph import Paragraph
- from reportlab.platypus.doctemplate import *
- from reportlab.lib.units import inch
- from reportlab.lib import styles
- from reportlab.lib.utils import ImageReader
-
-class MyPDFDoc :
- class MyPageTemplate(PageTemplate) :
- """Our own page template."""
- def __init__(self, parent) :
- """Initialise our page template."""
- #
- # we must save a pointer to our parent somewhere
- self.parent = parent
-
- # Our doc is made of a single frame
- content = Frame(0.75 * inch, 0.5 * inch, parent.document.pagesize[0] - 1.25 * inch, parent.document.pagesize[1] - (1.5 * inch))
- PageTemplate.__init__(self, "MyTemplate", [content])
-
- # get all the images we need now, in case we've got
- # several pages this will save some CPU
- self.logo = self.getImageFromZODB("logo")
-
- def getImageFromZODB(self, name) :
- """Retrieves an Image from the ZODB, converts it to PIL,
- and makes it 0.75 inch high.
- """
- try :
- # try to get it from ZODB
- logo = getattr(self.parent.context, name)
- except AttributeError :
- # not found !
- return None
-
- # Convert it to PIL
- image = ImageReader(cStringIO.StringIO(str(logo.data)))
- (width, height) = image.getSize()
-
- # scale it to be 0.75 inch high
- multi = ((height + 0.0) / (0.75 * inch))
- width = int(width / multi)
- height = int(height / multi)
-
- return ((width, height), image)
-
- def beforeDrawPage(self, canvas, doc) :
- """Draws a logo and an contribution message on each page."""
- canvas.saveState()
- if self.logo is not None :
- # draws the logo if it exists
- ((width, height), image) = self.logo
- canvas.drawImage(image, inch, doc.pagesize[1] - inch, width, height)
- canvas.setFont('Times-Roman', 10)
- canvas.drawCentredString(inch + (doc.pagesize[0] - (1.5 * inch)) / 2, 0.25 * inch, "Contributed by Jerome Alet - alet@unice.fr")
- canvas.restoreState()
-
- def __init__(self, context, filename) :
- # save some datas
- self.context = context
- self.built = 0
- self.objects = []
-
- # we will build an in-memory document
- # instead of creating an on-disk file.
- self.report = cStringIO.StringIO()
-
- # initialise a PDF document using ReportLab's platypus
- self.document = BaseDocTemplate(self.report)
-
- # add our page template
- # (we could add more than one, but I prefer to keep it simple)
- self.document.addPageTemplates(self.MyPageTemplate(self))
-
- # get the default style sheets
- self.StyleSheet = styles.getSampleStyleSheet()
-
- # then build a simple doc with ReportLab's platypus
- sometext = "A sample script to show how to use ReportLab from within Zope"
- url = self.escapexml(context.absolute_url())
- urlfilename = self.escapexml(context.absolute_url() + '/%s' % filename)
- self.append(Paragraph("Using ReportLab from within Zope", self.StyleSheet["Heading3"]))
- self.append(Spacer(0, 10))
- self.append(Paragraph("You launched it from : %s" % url, self.StyleSheet['Normal']))
- self.append(Spacer(0, 40))
- self.append(Paragraph("If possible, this report will be automatically saved as : %s" % urlfilename, self.StyleSheet['Normal']))
-
- # generation du document PDF
- self.document.build(self.objects)
- self.built = 1
-
- def __str__(self) :
- """Returns the PDF document as a string of text, or None if it's not ready yet."""
- if self.built :
- return self.report.getvalue()
- else :
- return None
-
- def append(self, object) :
- """Appends an object to our platypus "story" (using ReportLab's terminology)."""
- self.objects.append(object)
-
- def escapexml(self, s) :
- """Escape some xml entities."""
- s = string.strip(s)
- s = string.replace(s, "&", "&")
- s = string.replace(s, "<", "<")
- return string.replace(s, ">", ">")
-
-def rlzope(self) :
- """A sample external method to show people how to use ReportLab from within Zope."""
- try:
- #
- # which file/object name to use ?
- # append ?name=xxxxx to rlzope's url to
- # choose another name
- filename = self.REQUEST.get("name", "dummy.pdf")
- if filename[-4:] != '.pdf' :
- filename = filename + '.pdf'
-
- # tell the browser we send some PDF document
- # with the requested filename
-
- # get the document's content itself as a string of text
- content = str(MyPDFDoc(self, filename))
-
- # we will return it to the browser, but before that we also want to
- # save it into the ZODB into the current folder
- try :
- self.manage_addFile(id = filename, file = content, title = "A sample PDF document produced with ReportLab", precondition = '', content_type = "application/pdf")
- except :
- # it seems an object with this name already exists in the ZODB:
- # it's more secure to not replace it, since we could possibly
- # destroy an important PDF document of this name.
- pass
- self.REQUEST.RESPONSE.setHeader('Content-Type', 'application/pdf')
- self.REQUEST.RESPONSE.setHeader('Content-Disposition', 'attachment; filename=%s' % filename)
- except:
- import traceback, sys, cgi
- content = sys.stdout = sys.stderr = cStringIO.StringIO()
- self.REQUEST.RESPONSE.setHeader('Content-Type', 'text/html')
- traceback.print_exc()
- sys.stdout = sys.__stdout__
- sys.stderr = sys.__stderr__
- content = '%s ' % cgi.escape(content.getvalue())
-
- # then we also return the PDF content to the browser
- return content
diff --git a/bin/reportlab/demos/stdfonts/00readme.txt b/bin/reportlab/demos/stdfonts/00readme.txt
deleted file mode 100644
index 9803d8e0c9d..00000000000
--- a/bin/reportlab/demos/stdfonts/00readme.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-This lists out the standard 14 fonts
-in a very plain and simple fashion.
-
-Notably, the output is huge - it makes
-two separate text objects for each glyph.
-Smarter programming would make tighter
-PDF, but more lines of Python!
diff --git a/bin/reportlab/demos/stdfonts/stdfonts.py b/bin/reportlab/demos/stdfonts/stdfonts.py
deleted file mode 100644
index 44ce94f4739..00000000000
--- a/bin/reportlab/demos/stdfonts/stdfonts.py
+++ /dev/null
@@ -1,74 +0,0 @@
-#Copyright ReportLab Europe Ltd. 2000-2004
-#see license.txt for license details
-#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/demos/stdfonts/stdfonts.py
-__version__=''' $Id: stdfonts.py 2830 2006-04-05 15:18:32Z rgbecker $ '''
-__doc__="""
-This generates tables showing the 14 standard fonts in both
-WinAnsi and MacRoman encodings, and their character codes.
-Supply an argument of 'hex' or 'oct' to get code charts
-in those encodings; octal is what you need for \\n escape
-sequences in Python literals.
-
-usage: standardfonts.py [dec|hex|oct]
-"""
-import sys
-from reportlab.pdfbase import pdfmetrics
-from reportlab.pdfgen import canvas
-import string
-
-label_formats = {'dec':('%d=', 'Decimal'),
- 'oct':('%o=','Octal'),
- 'hex':('0x%x=', 'Hexadecimal')}
-
-def run(mode):
-
- label_formatter, caption = label_formats[mode]
-
- for enc in ['MacRoman', 'WinAnsi']:
- canv = canvas.Canvas(
- 'StandardFonts_%s.pdf' % enc,
- )
- canv.setPageCompression(0)
-
- for faceName in pdfmetrics.standardFonts:
- if faceName in ['Symbol', 'ZapfDingbats']:
- encLabel = faceName+'Encoding'
- else:
- encLabel = enc + 'Encoding'
-
- fontName = faceName + '-' + encLabel
- pdfmetrics.registerFont(pdfmetrics.Font(fontName,
- faceName,
- encLabel)
- )
-
- canv.setFont('Times-Bold', 18)
- canv.drawString(80, 744, fontName)
- canv.setFont('Times-BoldItalic', 12)
- canv.drawRightString(515, 744, 'Labels in ' + caption)
-
-
- #for dingbats, we need to use another font for the numbers.
- #do two parallel text objects.
- for byt in range(32, 256):
- col, row = divmod(byt - 32, 32)
- x = 72 + (66*col)
- y = 720 - (18*row)
- canv.setFont('Helvetica', 14)
- canv.drawString(x, y, label_formatter % byt)
- canv.setFont(fontName, 14)
- canv.drawString(x+44, y, chr(byt).decode(encLabel,'ignore').encode('utf8'))
- canv.showPage()
- canv.save()
-
-if __name__ == '__main__':
- if len(sys.argv)==2:
- mode = string.lower(sys.argv[1])
- if mode not in ['dec','oct','hex']:
- print __doc__
-
- elif len(sys.argv) == 1:
- mode = 'dec'
- run(mode)
- else:
- print __doc__
diff --git a/bin/reportlab/demos/tests/testdemos.py b/bin/reportlab/demos/tests/testdemos.py
deleted file mode 100644
index 3a215bb2269..00000000000
--- a/bin/reportlab/demos/tests/testdemos.py
+++ /dev/null
@@ -1,14 +0,0 @@
-#!/bin/env python
-#Copyright ReportLab Europe Ltd. 2000-2004
-#see license.txt for license details
-#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/demos/tests/testdemos.py
-__version__=''' $Id: testdemos.py 2385 2004-06-17 15:26:05Z rgbecker $ '''
-__doc__='Test all demos'
-_globals=globals().copy()
-import os, sys
-from reportlab import pdfgen
-
-for p in ('pythonpoint/pythonpoint.py','stdfonts/stdfonts.py','odyssey/odyssey.py', 'gadflypaper/gfe.py'):
- fn = os.path.normcase(os.path.normpath(os.path.join(os.path.dirname(pdfgen.__file__),'..','demos',p)))
- os.chdir(os.path.dirname(fn))
- execfile(fn,_globals.copy())
\ No newline at end of file
diff --git a/bin/reportlab/docs/00readme.txt b/bin/reportlab/docs/00readme.txt
deleted file mode 100644
index d1810ae46d0..00000000000
--- a/bin/reportlab/docs/00readme.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-Thid directory holds documentation. For end users,
-it should contain a number of PDF manuals. For
-people working with the source, this directory will
-be the destination for any manuals built.
-
-If you don't see the pdf manual you expected or you wich to
-ensure an up to date copy run the script tools/genAll.py!
diff --git a/bin/reportlab/docs/genAll.py b/bin/reportlab/docs/genAll.py
deleted file mode 100644
index 0776903c9a2..00000000000
--- a/bin/reportlab/docs/genAll.py
+++ /dev/null
@@ -1,37 +0,0 @@
-#!/bin/env python
-import os, sys
-def _genAll(d=None,verbose=1):
- if not d: d = '.'
- if not os.path.isabs(d):
- d = os.path.normpath(os.path.join(os.getcwd(),d))
- L = ['reference/genreference.py',
- 'userguide/genuserguide.py',
- 'graphguide/gengraphguide.py',
- '../tools/docco/graphdocpy.py',
- ]
- if os.path.isdir('../rl_addons'):
- L = L + ['../rl_addons/pyRXP/docs/PyRXP_Documentation.rml']
- elif os.path.isdir('../../rl_addons'):
- L = L + ['../../rl_addons/pyRXP/docs/PyRXP_Documentation.rml']
- for p in L:
- os.chdir(d)
- os.chdir(os.path.dirname(p))
- if p[-4:]=='.rml':
- try:
- from rlextra.rml2pdf.rml2pdf import main
- main(exe=0,fn=[os.path.basename(p)], quiet=not verbose, outDir=d)
- except:
- pass
- else:
- cmd = '%s %s %s' % (sys.executable,os.path.basename(p), not verbose and '-s' or '')
- if verbose: print cmd
- os.system(cmd)
-
-"""Runs the manual-building scripts"""
-if __name__=='__main__':
- #need a quiet mode for the test suite
- if '-s' in sys.argv: # 'silent
- verbose = 0
- else:
- verbose = 1
- _genAll(os.path.dirname(sys.argv[0]),verbose)
\ No newline at end of file
diff --git a/bin/reportlab/docs/graphguide/ch1_intro.py b/bin/reportlab/docs/graphguide/ch1_intro.py
deleted file mode 100644
index 794f4a769fc..00000000000
--- a/bin/reportlab/docs/graphguide/ch1_intro.py
+++ /dev/null
@@ -1,105 +0,0 @@
-#Copyright ReportLab Europe Ltd. 2000-2004
-#see license.txt for license details
-#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/graphguide/ch1_intro.py
-from reportlab.tools.docco.rl_doc_utils import *
-import reportlab
-
-title("Graphics Guide")
-centred('ReportLab Version ' + reportlab.Version)
-
-nextTemplate("Normal")
-
-########################################################################
-#
-# Chapter 1
-#
-########################################################################
-
-
-heading1("Introduction")
-
-
-heading2("About this document")
-disc("""
-This document is intended to be a helpful and reasonably full
-introduction to the use of the ReportLab Graphics sub-package.
-Starting with simple drawings and shapes, we will take you through the
-slightly more complex reusable widgets all the way through to our
-powerful and flexible chart library. You will see examples of using
-reportlab/graphics to make bar charts, line charts, line plots, pie
-charts... and a smiley face.
-""")
-
-disc("""
-We presume that you have already installed both the Python programming
-language and the core ReportLab library. If you have not done either
-of these, look in the ReportLab User Guide where chapter one
-talks you through all the required steps.
-""")
-
-disc("""
-We recommend that you read some or all of the User Guide and have at
-least a basic understanding of how the ReportLab library works before
-you start getting to grips with ReportLab Graphics.
-""")
-
-disc("")
-todo("""
-Be warned! This document is in a very preliminary form. We need
-your help to make sure it is complete and helpful. Please send any
-feedback to our user mailing list, reportlab-users@reportlab.com.
-""")
-
-heading2("What is ReportLab?")
-disc("""ReportLab is a software library that lets you directly
-create documents in Adobe's Portable Document Format (PDF) using
-the Python programming language. """)
-
-disc("""The ReportLab library directly creates PDF based on
-your graphics commands. There are no intervening steps. Your applications
-can generate reports extremely fast - sometimes orders
-of magnitude faster than traditional report-writing
-tools.""")
-
-heading2("What is ReportLab Graphics?")
-disc("""
-ReportLab Graphics is one of the sub-packages to the ReportLab
-library. It started off as a stand-alone set of programs, but is now a
-fully integrated part of the ReportLab toolkit that allows you to use
-its powerful charting and graphics features to improve your PDF forms
-and reports.
-""")
-
-heading2("Getting Involved")
-disc("""ReportLab is an Open Source project. Although we are
-a commercial company we provide the core PDF generation
-sources freely, even for commercial purposes, and we make no income directly
-from these modules. We also welcome help from the community
-as much as any other Open Source project. There are many
-ways in which you can help:""")
-
-bullet("""General feedback on the core API. Does it work for you?
-Are there any rough edges? Does anything feel clunky and awkward?""")
-
-bullet("""New objects to put in reports, or useful utilities for the library.
-We have an open standard for report objects, so if you have written a nice
-chart or table class, why not contribute it?""")
-
-bullet("""Demonstrations and Case Studies: If you have produced some nice
-output, send it to us (with or without scripts). If ReportLab solved a
-problem for you at work, write a little 'case study' and send it in.
-And if your web site uses our tools to make reports, let us link to it.
-We will be happy to display your work (and credit it with your name
-and company) on our site!""")
-
-bullet("""Working on the core code: we have a long list of things
-to refine or to implement. If you are missing some features or
-just want to help out, let us know!""")
-
-disc("""The first step for anyone wanting to learn more or
-get involved is to join the mailing list. To Subscribe visit
-$http://two.pairlist.net/mailman/listinfo/reportlab-users$.
-From there you can also browse through the group's archives
-and contributions. The mailing list is
-the place to report bugs and get support. """)
-
diff --git a/bin/reportlab/docs/graphguide/ch2_concepts.py b/bin/reportlab/docs/graphguide/ch2_concepts.py
deleted file mode 100644
index 28dab45fece..00000000000
--- a/bin/reportlab/docs/graphguide/ch2_concepts.py
+++ /dev/null
@@ -1,376 +0,0 @@
-#Copyright ReportLab Europe Ltd. 2000-2004
-#see license.txt for license details
-#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/graphguide/ch2_concepts.py
-from reportlab.tools.docco.rl_doc_utils import *
-
-heading1("General Concepts")
-
-disc("""
-In this chapter we will present some of the more fundamental principles of
-the graphics library, which will show-up later in various places.
-""")
-
-
-heading2("Drawings and Renderers")
-
-disc("""
-A Drawing is a platform-independent description of a collection of
-shapes.
-It is not directly associated with PDF, Postscript or any other output
-format.
-Fortunately, most vector graphics systems have followed the Postscript
-model and it is possible to describe shapes unambiguously.
-""")
-
-disc("""
-A drawing contains a number of primitive Shapes .
-Normal shapes are those widely known as rectangles, circles, lines,
-etc.
-One special (logic) shape is a Group , which can hold other
-shapes and apply a transformation to them.
-Groups represent composites of shapes and allow to treat the
-composite as if it were a single shape.
-Just about anything can be built up from a small number of basic
-shapes.
-""")
-
-disc("""
-The package provides several Renderers which know how to draw a
-drawing into different formats.
-These include PDF (of course), Postscript, and bitmap output.
-The bitmap renderer uses Raph Levien's libart rasterizer
-and Fredrik Lundh's Python Imaging Library (PIL).
-Very recently, an experimental SVG renderer was also added.
-It makes use of Python's standard library XML modules, so you don't
-need to install the XML-SIG's additional package named PyXML.
-If you have the right extensions installed, you can generate drawings
-in bitmap form for the web as well as vector form for PDF documents,
-and get "identical output".
-""")
-
-disc("""
-The PDF renderer has special "privileges" - a Drawing object is also
-a Flowable and, hence, can be placed directly in the story
-of any Platypus document, or drawn directly on a Canvas with
-one line of code.
-In addition, the PDF renderer has a utility function to make
-a one-page PDF document quickly.
-""")
-
-disc("""
-The SVG renderer is special as it is still pretty experimental.
-The SVG code it generates is not really optimised in any way and
-maps only the features available in ReportLab Graphics (RLG) to
-SVG. This means there is no support for SVG animation, interactivity,
-scripting or more sophisticated clipping, masking or graduation
-shapes.
-So, be careful, and please report any bugs you find!
-""")
-
-disc("""
-We expect to add both input and output filters for many vector
-graphics formats in future.
-SVG was the most prominent first one to start with for which there
-is now an output filter in the graphics package.
-An SVG input filter will probably become available in Summer 2002
-as an additional module.
-GUIs will be able to obtain screen images from the bitmap output
-filter working with PIL, so a chart could appear in a Tkinter
-GUI window.
-""")
-
-
-heading2("Coordinate System")
-
-disc("""
-The Y-direction in our X-Y coordinate system points from the
-bottom up .
-This is consistent with PDF, Postscript and mathematical notation.
-It also appears to be more natural for people, especially when
-working with charts.
-Note that in other graphics models (such as SVG) the Y-coordinate
-points down .
-For the SVG renderer this is actually no problem as it will take
-your drawings and flip things as needed, so your SVG output looks
-just as expected.
-""")
-
-disc("""
-The X-coordinate points, as usual, from left to right.
-So far there doesn't seem to be any model advocating the opposite
-direction - at least not yet (with interesting exceptions, as it
-seems, for Arabs looking at time series charts...).
-""")
-
-
-heading2("Getting Started")
-
-disc("""
-Let's create a simple drawing containing the string "Hello World",
-displayed on top of a coloured rectangle.
-After creating it we will save the drawing to a standalone PDF file.
-""")
-
-eg("""
- from reportlab.lib import colors
- from reportlab.graphics.shapes import *
-
- d = Drawing(400, 200)
- d.add(Rect(50, 50, 300, 100, fillColor=colors.yellow))
- d.add(String(150,100, 'Hello World',
- fontSize=18, fillColor=colors.red))
-
- from reportlab.graphics import renderPDF
- renderPDF.drawToFile(d, 'example1.pdf', 'My First Drawing')
-""")
-
-disc("This will produce a PDF file containing the following graphic:")
-
-from reportlab.graphics.shapes import *
-from reportlab.graphics import testshapes
-t = testshapes.getDrawing01()
-draw(t, "'Hello World'")
-
-disc("""
-Each renderer is allowed to do whatever is appropriate for its format,
-and may have whatever API is needed.
-If it refers to a file format, it usually has a $drawToFile$ function,
-and that's all you need to know about the renderer.
-Let's save the same drawing in Encapsulated Postscript format:
-""")
-
-##eg("""
-## from reportlab.graphics import renderPS
-## renderPS.drawToFile(D, 'example1.eps', 'My First Drawing')
-##""")
-eg("""
- from reportlab.graphics import renderPS
- renderPS.drawToFile(d, 'example1.eps')
-""")
-
-disc("""
-This will produce an EPS file with the identical drawing, which
-may be imported into publishing tools such as Quark Express.
-If we wanted to generate the same drawing as a bitmap file for
-a website, say, all we need to do is write code like this:
-""")
-
-eg("""
- from reportlab.graphics import renderPM
- renderPM.saveToFile(d, 'example1.png', 'PNG')
-""")
-
-disc("""
-Many other bitmap formats, like GIF, JPG, TIFF, BMP and PPN are
-genuinely available, making it unlikely you'll need to add external
-postprocessing steps to convert to the final format you need.
-""")
-
-disc("""
-To produce an SVG file containing the identical drawing, which
-may be imported into graphical editing tools such as Illustrator
-all we need to do is write code like this:
-""")
-
-eg("""
- from reportlab.graphics import renderSVG
- renderSVG.drawToFile(d, 'example1.svg')
-""")
-
-
-heading2("Attribute Verification")
-
-disc("""
-Python is very dynamic and lets us execute statements at run time that
-can easily be the source for unexpected behaviour.
-One subtle 'error' is when assigning to an attribute that the framework
-doesn't know about because the used attribute's name contains a typo.
-Python lets you get away with it (adding a new attribute to an object,
-say), but the graphics framework will not detect this 'typo' without
-taking special counter-measures.
-""")
-
-disc("""
-There are two verification techniques to avoid this situation.
-The default is for every object to check every assignment at run
-time, such that you can only assign to 'legal' attributes.
-This is what happens by default.
-As this imposes a small performance penalty, this behaviour can
-be turned off when you need it to be.
-""")
-
-eg("""
->>> r = Rect(10,10,200,100, fillColor=colors.red)
->>>
->>> r.fullColor = colors.green # note the typo
->>> r.x = 'not a number' # illegal argument type
->>> del r.width # that should confuse it
-""")
-
-disc("""
-These statements would be caught by the compiler in a statically
-typed language, but Python lets you get away with it.
-The first error could leave you staring at the picture trying to
-figure out why the colors were wrong.
-The second error would probably become clear only later, when
-some back-end tries to draw the rectangle.
-The third, though less likely, results in an invalid object that
-would not know how to draw itself.
-""")
-
-eg("""
->>> r = shapes.Rect(10,10,200,80)
->>> r.fullColor = colors.green
-Traceback (most recent call last):
- File "", line 1, in ?
- File "C:\code\users\andy\graphics\shapes.py", line 254, in __setattr__
- validateSetattr(self,attr,value) #from reportlab.lib.attrmap
- File "C:\code\users\andy\lib\attrmap.py", line 74, in validateSetattr
- raise AttributeError, "Illegal attribute '%s' in class %s" % (name, obj.__class__.__name__)
-AttributeError: Illegal attribute 'fullColor' in class Rect
->>>
-""")
-
-disc("""
-This imposes a performance penalty, so this behaviour can be turned
-off when you need it to be.
-To do this, you should use the following lines of code before you
-first import reportlab.graphics.shapes:
-""")
-
-eg("""
->>> import reportlab.rl_config
->>> reportlab.rl_config.shapeChecking = 0
->>> from reportlab.graphics import shapes
->>>
-""")
-
-disc("""
-Once you turn off $shapeChecking$, the classes are actually built
-without the verification hook; code should get faster, then.
-Currently the penalty seems to be about 25% on batches of charts,
-so it is hardly worth disabling.
-However, if we move the renderers to C in future (which is eminently
-possible), the remaining 75% would shrink to almost nothing and
-the saving from verification would be significant.
-""")
-
-disc("""
-Each object, including the drawing itself, has a $verify()$ method.
-This either succeeds, or raises an exception.
-If you turn off automatic verification, then you should explicitly
-call $verify()$ in testing when developing the code, or perhaps
-once in a batch process.
-""")
-
-
-heading2("Property Editing")
-
-disc("""
-A cornerstone of the reportlab/graphics which we will cover below is
-that you can automatically document widgets.
-This means getting hold of all of their editable properties,
-including those of their subcomponents.
-""")
-
-disc("""
-Another goal is to be able to create GUIs and config files for
-drawings.
-A generic GUI can be built to show all editable properties
-of a drawing, and let you modify them and see the results.
-The Visual Basic or Delphi development environment are good
-examples of this kind of thing.
-In a batch charting application, a file could list all the
-properties of all the components in a chart, and be merged
-with a database query to make a batch of charts.
-""")
-
-disc("""
-To support these applications we have two interfaces, $getProperties$
-and $setProperties$, as well as a convenience method $dumpProperties$.
-The first returns a dictionary of the editable properties of an
-object; the second sets them en masse.
-If an object has publicly exposed 'children' then one can recursively
-set and get their properties too.
-This will make much more sense when we look at Widgets later on,
-but we need to put the support into the base of the framework.
-""")
-
-eg("""
->>> r = shapes.Rect(0,0,200,100)
->>> import pprint
->>> pprint.pprint(r.getProperties())
-{'fillColor': Color(0.00,0.00,0.00),
- 'height': 100,
- 'rx': 0,
- 'ry': 0,
- 'strokeColor': Color(0.00,0.00,0.00),
- 'strokeDashArray': None,
- 'strokeLineCap': 0,
- 'strokeLineJoin': 0,
- 'strokeMiterLimit': 0,
- 'strokeWidth': 1,
- 'width': 200,
- 'x': 0,
- 'y': 0}
->>> r.setProperties({'x':20, 'y':30, 'strokeColor': colors.red})
->>> r.dumpProperties()
-fillColor = Color(0.00,0.00,0.00)
-height = 100
-rx = 0
-ry = 0
-strokeColor = Color(1.00,0.00,0.00)
-strokeDashArray = None
-strokeLineCap = 0
-strokeLineJoin = 0
-strokeMiterLimit = 0
-strokeWidth = 1
-width = 200
-x = 20
-y = 30
->>> """)
-
-disc("""
-Note: $pprint$ is the standard Python library module that allows
-you to 'pretty print' output over multiple lines rather than having
-one very long line.
-""")
-
-disc("""
-These three methods don't seem to do much here, but as we will see
-they make our widgets framework much more powerful when dealing with
-non-primitive objects.
-""")
-
-
-heading2("Naming Children")
-
-disc("""
-You can add objects to the $Drawing$ and $Group$ objects.
-These normally go into a list of contents.
-However, you may also give objects a name when adding them.
-This allows you to refer to and possibly change any element
-of a drawing after constructing it.
-""")
-
-eg("""
->>> d = shapes.Drawing(400, 200)
->>> s = shapes.String(10, 10, 'Hello World')
->>> d.add(s, 'caption')
->>> s.caption.text
-'Hello World'
->>>
-""")
-
-disc("""
-Note that you can use the same shape instance in several contexts
-in a drawing; if you choose to use the same $Circle$ object in many
-locations (e.g. a scatter plot) and use different names to access
-it, it will still be a shared object and the changes will be
-global.
-""")
-
-disc("""
-This provides one paradigm for creating and modifying interactive
-drawings.
-""")
\ No newline at end of file
diff --git a/bin/reportlab/docs/graphguide/ch3_shapes.py b/bin/reportlab/docs/graphguide/ch3_shapes.py
deleted file mode 100644
index 375513a037e..00000000000
--- a/bin/reportlab/docs/graphguide/ch3_shapes.py
+++ /dev/null
@@ -1,416 +0,0 @@
-#Copyright ReportLab Europe Ltd. 2000-2004
-#see license.txt for license details
-#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/graphguide/ch3_shapes.py
-
-from reportlab.tools.docco.rl_doc_utils import *
-from reportlab.graphics.shapes import *
-
-heading1("Shapes")
-
-disc("""
-This chapter describes the concept of shapes and their importance
-as building blocks for all output generated by the graphics library.
-Some properties of existing shapes and their relationship to
-diagrams are presented and the notion of having different renderers
-for different output formats is briefly introduced.
-""")
-
-heading2("Available Shapes")
-
-disc("""
-Drawings are made up of Shapes.
-Absolutely anything can be built up by combining the same set of
-primitive shapes.
-The module $shapes.py$ supplies a number of primitive shapes and
-constructs which can be added to a drawing.
-They are:
-""")
-
-bullet("Rect")
-bullet("Circle")
-bullet("Ellipse")
-bullet("Wedge (a pie slice)")
-bullet("Polygon")
-bullet("Line")
-bullet("PolyLine")
-bullet("String")
-bullet("Group")
-bullet("Path (not implemented yet, but will be added in the future )")
-
-disc("""
-The following drawing, taken from our test suite, shows most of the
-basic shapes (except for groups).
-Those with a filled green surface are also called solid shapes
-(these are $Rect$, $Circle$, $Ellipse$, $Wedge$ and $Polygon$).
-""")
-
-from reportlab.graphics import testshapes
-
-t = testshapes.getDrawing06()
-draw(t, "Basic shapes")
-
-
-heading2("Shape Properties")
-
-disc("""
-Shapes have two kinds of properties - some to define their geometry
-and some to define their style.
-Let's create a red rectangle with 3-point thick green borders:
-""")
-
-eg("""
->>> from reportlab.graphics.shapes import Rect
->>> from reportlab.lib.colors import red, green
->>> r = Rect(5, 5, 200, 100)
->>> r.fillColor = red
->>> r.strokeColor = green
->>> r.strokeWidth = 3
->>>
-""")
-
-from reportlab.graphics.shapes import Rect
-from reportlab.lib.colors import red, green
-d = Drawing(220, 120)
-r = Rect(5, 5, 200, 100)
-r.fillColor = red
-r.strokeColor = green
-r.strokeWidth = 3
-d.add(r)
-draw(d, "red rectangle with green border")
-
-disc("""
-Note: In future examples we will omit the import statements.
-""")
-
-disc("""
-All shapes have a number of properties which can be set.
-At an interactive prompt, we can use their dumpProperties()
-method to list these.
-Here's what you can use to configure a Rect:
-""")
-
-eg("""
->>> r.dumpProperties()
-fillColor = Color(1.00,0.00,0.00)
-height = 100
-rx = 0
-ry = 0
-strokeColor = Color(0.00,0.50,0.00)
-strokeDashArray = None
-strokeLineCap = 0
-strokeLineJoin = 0
-strokeMiterLimit = 0
-strokeWidth = 3
-width = 200
-x = 5
-y = 5
->>>
-""")
-
-disc("""
-Shapes generally have style properties and geometry
-properties .
-$x$, $y$, $width$ and $height$ are part of the geometry and must
-be provided when creating the rectangle, since it does not make
-much sense without those properties.
-The others are optional and come with sensible defaults.
-""")
-
-disc("""
-You may set other properties on subsequent lines, or by passing them
-as optional arguments to the constructor.
-We could also have created our rectangle this way:
-""")
-
-eg("""
->>> r = Rect(5, 5, 200, 100,
- fillColor=red,
- strokeColor=green,
- strokeWidth=3)
-""")
-
-disc("""
-Let's run through the style properties. $fillColor$ is obvious.
-$stroke$ is publishing terminology for the edge of a shape;
-the stroke has a color, width, possibly a dash pattern, and
-some (rarely used) features for what happens when a line turns
-a corner.
-$rx$ and $ry$ are optional geometric properties and are used to
-define the corner radius for a rounded rectangle.
-""")
-
-disc("All the other solid shapes share the same style properties.")
-
-
-heading2("Lines")
-
-disc("""
-We provide single straight lines, PolyLines and curves.
-Lines have all the $stroke*$ properties, but no $fillColor$.
-Here are a few Line and PolyLine examples and the corresponding
-graphics output:
-""")
-
-eg("""
- Line(50,50, 300,100,
- strokeColor=colors.blue, strokeWidth=5)
- Line(50,100, 300,50,
- strokeColor=colors.red,
- strokeWidth=10,
- strokeDashArray=[10, 20])
- PolyLine([120,110, 130,150, 140,110, 150,150, 160,110,
- 170,150, 180,110, 190,150, 200,110],
- strokeWidth=2,
- strokeColor=colors.purple)
-""")
-
-d = Drawing(400, 200)
-d.add(Line(50,50, 300,100,strokeColor=colors.blue, strokeWidth=5))
-d.add(Line(50,100, 300,50,
- strokeColor=colors.red,
- strokeWidth=10,
- strokeDashArray=[10, 20]))
-d.add(PolyLine([120,110, 130,150, 140,110, 150,150, 160,110,
- 170,150, 180,110, 190,150, 200,110],
- strokeWidth=2,
- strokeColor=colors.purple))
-draw(d, "Line and PolyLine examples")
-
-
-heading2("Strings")
-
-disc("""
-The ReportLab Graphics package is not designed for fancy text
-layout, but it can place strings at desired locations and with
-left/right/center alignment.
-Let's specify a $String$ object and look at its properties:
-""")
-
-eg("""
->>> s = String(10, 50, 'Hello World')
->>> s.dumpProperties()
-fillColor = Color(0.00,0.00,0.00)
-fontName = Times-Roman
-fontSize = 10
-text = Hello World
-textAnchor = start
-x = 10
-y = 50
->>>
-""")
-
-disc("""
-Strings have a textAnchor property, which may have one of the
-values 'start', 'middle', 'end'.
-If this is set to 'start', x and y relate to the start of the
-string, and so on.
-This provides an easy way to align text.
-""")
-
-disc("""
-Strings use a common font standard: the Type 1 Postscript fonts
-present in Acrobat Reader.
-We can thus use the basic 14 fonts in ReportLab and get accurate
-metrics for them.
-We have recently also added support for extra Type 1 fonts
-and the renderers all know how to render Type 1 fonts.
-""")
-
-##Until now we have worked with bitmap renderers which have to use
-##TrueType fonts and which make some substitutions; this could lead
-##to differences in text wrapping or even the number of labels on
-##a chart between renderers.
-
-disc("""
-Here is a more fancy example using the code snippet below.
-Please consult the ReportLab User Guide to see how non-standard
-like 'LettErrorRobot-Chrome' fonts are being registered!
-""")
-
-eg("""
- d = Drawing(400, 200)
- for size in range(12, 36, 4):
- d.add(String(10+size*2, 10+size*2, 'Hello World',
- fontName='Times-Roman',
- fontSize=size))
-
- d.add(String(130, 120, 'Hello World',
- fontName='Courier',
- fontSize=36))
-
- d.add(String(150, 160, 'Hello World',
- fontName='LettErrorRobot-Chrome',
- fontSize=36))
-""")
-
-from reportlab.pdfbase import pdfmetrics
-from reportlab import rl_config
-rl_config.warnOnMissingFontGlyphs = 0
-afmFile, pfbFile = getJustFontPaths()
-T1face = pdfmetrics.EmbeddedType1Face(afmFile, pfbFile)
-T1faceName = 'LettErrorRobot-Chrome'
-pdfmetrics.registerTypeFace(T1face)
-T1font = pdfmetrics.Font(T1faceName, T1faceName, 'WinAnsiEncoding')
-pdfmetrics.registerFont(T1font)
-
-d = Drawing(400, 200)
-for size in range(12, 36, 4):
- d.add(String(10+size*2, 10+size*2, 'Hello World',
- fontName='Times-Roman',
- fontSize=size))
-
-d.add(String(130, 120, 'Hello World',
- fontName='Courier',
- fontSize=36))
-
-d.add(String(150, 160, 'Hello World',
- fontName='LettErrorRobot-Chrome',
- fontSize=36))
-
-draw(d, 'fancy font example')
-
-
-heading2("""Paths""")
-
-disc("""
-Postscript paths are a widely understood concept in graphics.
-They are not implemented in $reportlab/graphics$ as yet, but they
-will be, soon.
-""")
-
-# NB This commented out section is for 'future compatibility' - paths haven't
-# been implemented yet, but when they are we can uncomment this back in.
-
- ##disc("""Postscript paths are a widely understood concept in graphics. A Path
- ## is a way of defining a region in space. You put an imaginary pen down,
- ## draw straight and curved segments, and even pick the pen up and move
- ## it. At the end of this you have described a region, which may consist
- ## of several distinct close shapes or unclosed lines. At the end, this
- ## 'path' is 'stroked and filled' according to its properties. A Path has
- ## the same style properties as a solid shape. It can be used to create
- ## any irregular shape.""")
- ##
- ##disc("""In Postscript-based imaging models such as PDF, Postscript and SVG,
- ## everything is done with paths. All the specific shapes covered above
- ## are instances of paths; even text strings (which are shapes in which
- ## each character is an outline to be filled). Here we begin creating a
- ## path with a straight line and a bezier curve:""")
- ##
- ##eg("""
- ##>>> P = Path(0,0, strokeWidth=3, strokeColor=red)
- ##>>> P.lineTo(0, 50)
- ##>>> P.curveTo(10,50,80,80,100,30)
- ##>>>
- ##""")
-
- ##disc("""As well as being the only way to draw complex shapes, paths offer some
- ## performance advantages in renderers which support them. If you want to
- ## create a scatter plot with 5000 blue circles of different sizes, you
- ## can create 5000 circles, or one path object. With the latter, you only
- ## need to set the color and line width once. PINGO just remembers the
- ## drawing sequence, and writes it out into the file. In renderers which
- ## do not support paths, the renderer will still have to decompose it
- ## into 5000 circles so you won't save anything.""")
- ##
- ##disc("""Note that our current path implementation is an approximation; it
- ## should be finished off accurately for PDF and PS. """)
-
-
-heading2("Groups")
-
-disc("""
-Finally, we have Group objects.
-A group has a list of contents, which are other nodes.
-It can also apply a transformation - its contents can be rotated,
-scaled or shifted.
-If you know the math, you can set the transform directly.
-Otherwise it provides methods to rotate, scale and so on.
-Here we make a group which is rotated and translated:
-""")
-
-eg("""
->>> g =Group(shape1, shape2, shape3)
->>> g.rotate(30)
->>> g.translate(50, 200)
-""")
-
-disc("""
-Groups provide a tool for reuse.
-You can make a bunch of shapes to represent some component - say,
-a coordinate system - and put them in one group called "Axis".
-You can then put that group into other groups, each with a different
-translation and rotation, and you get a bunch of axis.
-It is still the same group, being drawn in different places.
-""")
-
-disc("""Let's do this with some only slightly more code:""")
-
-eg("""
- d = Drawing(400, 200)
-
- Axis = Group(
- Line(0,0,100,0), # x axis
- Line(0,0,0,50), # y axis
- Line(0,10,10,10), # ticks on y axis
- Line(0,20,10,20),
- Line(0,30,10,30),
- Line(0,40,10,40),
- Line(10,0,10,10), # ticks on x axis
- Line(20,0,20,10),
- Line(30,0,30,10),
- Line(40,0,40,10),
- Line(50,0,50,10),
- Line(60,0,60,10),
- Line(70,0,70,10),
- Line(80,0,80,10),
- Line(90,0,90,10),
- String(20, 35, 'Axes', fill=colors.black)
- )
-
- firstAxisGroup = Group(Axis)
- firstAxisGroup.translate(10,10)
- d.add(firstAxisGroup)
-
- secondAxisGroup = Group(Axis)
- secondAxisGroup.translate(150,10)
- secondAxisGroup.rotate(15)
-
- d.add(secondAxisGroup)
-
- thirdAxisGroup = Group(Axis,
- transform=mmult(translate(300,10),
- rotate(30)))
- d.add(thirdAxisGroup)
-""")
-
-d = Drawing(400, 200)
-Axis = Group(
- Line(0,0,100,0), # x axis
- Line(0,0,0,50), # y axis
- Line(0,10,10,10), # ticks on y axis
- Line(0,20,10,20),
- Line(0,30,10,30),
- Line(0,40,10,40),
- Line(10,0,10,10), # ticks on x axis
- Line(20,0,20,10),
- Line(30,0,30,10),
- Line(40,0,40,10),
- Line(50,0,50,10),
- Line(60,0,60,10),
- Line(70,0,70,10),
- Line(80,0,80,10),
- Line(90,0,90,10),
- String(20, 35, 'Axes', fill=colors.black)
- )
-firstAxisGroup = Group(Axis)
-firstAxisGroup.translate(10,10)
-d.add(firstAxisGroup)
-secondAxisGroup = Group(Axis)
-secondAxisGroup.translate(150,10)
-secondAxisGroup.rotate(15)
-d.add(secondAxisGroup)
-thirdAxisGroup = Group(Axis,
- transform=mmult(translate(300,10),
- rotate(30)))
-d.add(thirdAxisGroup)
-draw(d, "Groups examples")
\ No newline at end of file
diff --git a/bin/reportlab/docs/graphguide/ch4_widgets.py b/bin/reportlab/docs/graphguide/ch4_widgets.py
deleted file mode 100644
index eed115d6a86..00000000000
--- a/bin/reportlab/docs/graphguide/ch4_widgets.py
+++ /dev/null
@@ -1,422 +0,0 @@
-#Copyright ReportLab Europe Ltd. 2000-2004
-#see license.txt for license details
-#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/graphguide/ch4_widgets.py
-
-from reportlab.tools.docco.rl_doc_utils import *
-from reportlab.graphics.shapes import *
-from reportlab.graphics.widgets import signsandsymbols
-
-heading1("Widgets")
-
-disc("""
-We now describe widgets and how they relate to shapes.
-Using many examples it is shown how widgets make reusable
-graphics components.
-""")
-
-
-heading2("Shapes vs. Widgets")
-
-disc("""Up until now, Drawings have been 'pure data'. There is no code in them
- to actually do anything, except assist the programmer in checking and
- inspecting the drawing. In fact, that's the cornerstone of the whole
- concept and is what lets us achieve portability - a renderer only
- needs to implement the primitive shapes.""")
-
-disc("""We want to build reusable graphic objects, including a powerful chart
- library. To do this we need to reuse more tangible things than
- rectangles and circles. We should be able to write objects for other
- to reuse - arrows, gears, text boxes, UML diagram nodes, even fully
- fledged charts.""")
-
-disc("""
-The Widget standard is a standard built on top of the shapes module.
-Anyone can write new widgets, and we can build up libraries of them.
-Widgets support the $getProperties()$ and $setProperties()$ methods,
-so you can inspect and modify as well as document them in a uniform
-way.
-""")
-
-bullet("A widget is a reusable shape ")
-bullet("""it can be initialized with no arguments
- when its $draw()$ method is called it creates a primitive Shape or a
- Group to represent itself""")
-bullet("""It can have any parameters you want, and they can drive the way it is
- drawn""")
-bullet("""it has a $demo()$ method which should return an attractively drawn
- example of itself in a 200x100 rectangle. This is the cornerstone of
- the automatic documentation tools. The $demo()$ method should also have
- a well written docstring, since that is printed too!""")
-
-disc("""Widgets run contrary to the idea that a drawing is just a bundle of
- shapes; surely they have their own code? The way they work is that a
- widget can convert itself to a group of primitive shapes. If some of
- its components are themselves widgets, they will get converted too.
- This happens automatically during rendering; the renderer will not see
- your chart widget, but just a collection of rectangles, lines and
- strings. You can also explicitly 'flatten out' a drawing, causing all
- widgets to be converted to primitives.""")
-
-
-heading2("Using a Widget")
-
-disc("""
-Let's imagine a simple new widget.
-We will use a widget to draw a face, then show how it was implemented.""")
-
-eg("""
->>> from reportlab.lib import colors
->>> from reportlab.graphics import shapes
->>> from reportlab.graphics import widgetbase
->>> from reportlab.graphics import renderPDF
->>> d = shapes.Drawing(200, 100)
->>> f = widgetbase.Face()
->>> f.skinColor = colors.yellow
->>> f.mood = "sad"
->>> d.add(f)
->>> renderPDF.drawToFile(d, 'face.pdf', 'A Face')
-""")
-
-from reportlab.graphics import widgetbase
-d = Drawing(200, 120)
-f = widgetbase.Face()
-f.x = 50
-f.y = 10
-f.skinColor = colors.yellow
-f.mood = "sad"
-d.add(f)
-draw(d, 'A sample widget')
-
-disc("""
-Let's see what properties it has available, using the $setProperties()$
-method we have seen earlier:
-""")
-
-eg("""
->>> f.dumpProperties()
-eyeColor = Color(0.00,0.00,1.00)
-mood = sad
-size = 80
-skinColor = Color(1.00,1.00,0.00)
-x = 10
-y = 10
->>>
-""")
-
-disc("""
-One thing which seems strange about the above code is that we did not
-set the size or position when we made the face.
-This is a necessary trade-off to allow a uniform interface for
-constructing widgets and documenting them - they cannot require
-arguments in their $__init__()$ method.
-Instead, they are generally designed to fit in a 200 x 100
-window, and you move or resize them by setting properties such as
-x, y, width and so on after creation.
-""")
-
-disc("""
-In addition, a widget always provides a $demo()$ method.
-Simple ones like this always do something sensible before setting
-properties, but more complex ones like a chart would not have any
-data to plot.
-The documentation tool calls $demo()$ so that your fancy new chart
-class can create a drawing showing what it can do.
-""")
-
-disc("""
-Here are a handful of simple widgets available in the module
-signsandsymbols.py :
-""")
-
-from reportlab.graphics.shapes import Drawing
-from reportlab.graphics.widgets import signsandsymbols
-
-d = Drawing(230, 230)
-
-ne = signsandsymbols.NoEntry()
-ds = signsandsymbols.DangerSign()
-fd = signsandsymbols.FloppyDisk()
-ns = signsandsymbols.NoSmoking()
-
-ne.x, ne.y = 10, 10
-ds.x, ds.y = 120, 10
-fd.x, fd.y = 10, 120
-ns.x, ns.y = 120, 120
-
-d.add(ne)
-d.add(ds)
-d.add(fd)
-d.add(ns)
-
-draw(d, 'A few samples from signsandsymbols.py')
-
-disc("""
-And this is the code needed to generate them as seen in the drawing above:
-""")
-
-eg("""
-from reportlab.graphics.shapes import Drawing
-from reportlab.graphics.widgets import signsandsymbols
-
-d = Drawing(230, 230)
-
-ne = signsandsymbols.NoEntry()
-ds = signsandsymbols.DangerSign()
-fd = signsandsymbols.FloppyDisk()
-ns = signsandsymbols.NoSmoking()
-
-ne.x, ne.y = 10, 10
-ds.x, ds.y = 120, 10
-fd.x, fd.y = 10, 120
-ns.x, ns.y = 120, 120
-
-d.add(ne)
-d.add(ds)
-d.add(fd)
-d.add(ns)
-""")
-
-
-heading2("Compound Widgets")
-
-disc("""Let's imagine a compound widget which draws two faces side by side.
- This is easy to build when you have the Face widget.""")
-
-eg("""
->>> tf = widgetbase.TwoFaces()
->>> tf.faceOne.mood
-'happy'
->>> tf.faceTwo.mood
-'sad'
->>> tf.dumpProperties()
-faceOne.eyeColor = Color(0.00,0.00,1.00)
-faceOne.mood = happy
-faceOne.size = 80
-faceOne.skinColor = None
-faceOne.x = 10
-faceOne.y = 10
-faceTwo.eyeColor = Color(0.00,0.00,1.00)
-faceTwo.mood = sad
-faceTwo.size = 80
-faceTwo.skinColor = None
-faceTwo.x = 100
-faceTwo.y = 10
->>>
-""")
-
-disc("""The attributes 'faceOne' and 'faceTwo' are deliberately exposed so you
- can get at them directly. There could also be top-level attributes,
- but there aren't in this case.""")
-
-
-heading2("Verifying Widgets")
-
-disc("""The widget designer decides the policy on verification, but by default
- they work like shapes - checking every assignment - if the designer
- has provided the checking information.""")
-
-
-heading2("Implementing Widgets")
-
-disc("""We tried to make it as easy to implement widgets as possible. Here's
- the code for a Face widget which does not do any type checking:""")
-
-eg("""
-class Face(Widget):
- \"\"\"This draws a face with two eyes, mouth and nose.\"\"\"
-
- def __init__(self):
- self.x = 10
- self.y = 10
- self.size = 80
- self.skinColor = None
- self.eyeColor = colors.blue
- self.mood = 'happy'
-
- def draw(self):
- s = self.size # abbreviate as we will use this a lot
- g = shapes.Group()
- g.transform = [1,0,0,1,self.x, self.y]
- # background
- g.add(shapes.Circle(s * 0.5, s * 0.5, s * 0.5,
- fillColor=self.skinColor))
- # CODE OMITTED TO MAKE MORE SHAPES
- return g
-""")
-
-disc("""We left out all the code to draw the shapes in this document, but you
- can find it in the distribution in $widgetbase.py$.""")
-
-disc("""By default, any attribute without a leading underscore is returned by
- setProperties. This is a deliberate policy to encourage consistent
- coding conventions.""")
-
-disc("""Once your widget works, you probably want to add support for
- verification. This involves adding a dictionary to the class called
- $_verifyMap$, which map from attribute names to 'checking functions'.
- The $widgetbase.py$ module defines a bunch of checking functions with names
- like $isNumber$, $isListOfShapes$ and so on. You can also simply use $None$,
- which means that the attribute must be present but can have any type.
- And you can and should write your own checking functions. We want to
- restrict the "mood" custom attribute to the values "happy", "sad" or
- "ok". So we do this:""")
-
-eg("""
-class Face(Widget):
- \"\"\"This draws a face with two eyes. It exposes a
- couple of properties to configure itself and hides
- all other details\"\"\"
- def checkMood(moodName):
- return (moodName in ('happy','sad','ok'))
- _verifyMap = {
- 'x': shapes.isNumber,
- 'y': shapes.isNumber,
- 'size': shapes.isNumber,
- 'skinColor':shapes.isColorOrNone,
- 'eyeColor': shapes.isColorOrNone,
- 'mood': checkMood
- }
-""")
-
-disc("""This checking will be performed on every attribute assignment; or, if
- $config.shapeChecking$ is off, whenever you call $myFace.verify()$.""")
-
-
-heading2("Documenting Widgets")
-
-disc("""
-We are working on a generic tool to document any Python package or
-module; this is already checked into ReportLab and will be used to
-generate a reference for the ReportLab package.
-When it encounters widgets, it adds extra sections to the
-manual including:""")
-
-bullet("the doc string for your widget class ")
-bullet("the code snippet from your demo() method, so people can see how to use it")
-bullet("the drawing produced by the demo() method ")
-bullet("the property dump for the widget in the drawing. ")
-
-disc("""
-This tool will mean that we can have guaranteed up-to-date
-documentation on our widgets and charts, both on the web site
-and in print; and that you can do the same for your own widgets,
-too!
-""")
-
-
-heading2("Widget Design Strategies")
-
-disc("""We could not come up with a consistent architecture for designing
- widgets, so we are leaving that problem to the authors! If you do not
- like the default verification strategy, or the way
- $setProperties/getProperties$ works, you can override them yourself.""")
-
-disc("""For simple widgets it is recommended that you do what we did above:
- select non-overlapping properties, initialize every property on
- $__init__$ and construct everything when $draw()$ is called. You can
- instead have $__setattr__$ hooks and have things updated when certain
- attributes are set. Consider a pie chart. If you want to expose the
- individual wedges, you might write code like this:""")
-
-eg("""
-from reportlab.graphics.charts import piecharts
-pc = piecharts.Pie()
-pc.defaultColors = [navy, blue, skyblue] #used in rotation
-pc.data = [10,30,50,25]
-pc.slices[7].strokeWidth = 5
-""")
-#removed 'pc.backColor = yellow' from above code example
-
-disc("""The last line is problematic as we have only created four wedges - in
- fact we might not have created them yet. Does $pc.wedges[7]$ raise an
- error? Is it a prescription for what should happen if a seventh wedge
- is defined, used to override the default settings? We dump this
- problem squarely on the widget author for now, and recommend that you
- get a simple one working before exposing 'child objects' whose
- existence depends on other properties' values :-)""")
-
-disc("""We also discussed rules by which parent widgets could pass properties
- to their children. There seems to be a general desire for a global way
- to say that 'all wedges get their lineWidth from the lineWidth of
- their parent' without a lot of repetitive coding. We do not have a
- universal solution, so again leave that to widget authors. We hope
- people will experiment with push-down, pull-down and pattern-matching
- approaches and come up with something nice. In the meantime, we
- certainly can write monolithic chart widgets which work like the ones
- in, say, Visual Basic and Delphi.""")
-
-disc("""For now have a look at the following sample code using an early
- version of a pie chart widget and the output it generates:""")
-
-eg("""
-from reportlab.lib.colors import *
-from reportlab.graphics import shapes,renderPDF
-from reportlab.graphics.charts.piecharts import Pie
-
-d = Drawing(400,200)
-d.add(String(100,175,"Without labels", textAnchor="middle"))
-d.add(String(300,175,"With labels", textAnchor="middle"))
-
-pc = Pie()
-pc.x = 25
-pc.y = 50
-pc.data = [10,20,30,40,50,60]
-pc.slices[0].popout = 5
-d.add(pc, 'pie1')
-
-pc2 = Pie()
-pc2.x = 150
-pc2.y = 50
-pc2.data = [10,20,30,40,50,60]
-pc2.labels = ['a','b','c','d','e','f']
-d.add(pc2, 'pie2')
-
-pc3 = Pie()
-pc3.x = 275
-pc3.y = 50
-pc3.data = [10,20,30,40,50,60]
-pc3.labels = ['a','b','c','d','e','f']
-pc3.wedges.labelRadius = 0.65
-pc3.wedges.fontName = "Helvetica-Bold"
-pc3.wedges.fontSize = 16
-pc3.wedges.fontColor = colors.yellow
-d.add(pc3, 'pie3')
-""")
-
-# Hack to force a new paragraph before the todo() :-(
-disc("")
-
-from reportlab.lib.colors import *
-from reportlab.graphics import shapes,renderPDF
-from reportlab.graphics.charts.piecharts import Pie
-
-d = Drawing(400,200)
-d.add(String(100,175,"Without labels", textAnchor="middle"))
-d.add(String(300,175,"With labels", textAnchor="middle"))
-
-pc = Pie()
-pc.x = 25
-pc.y = 50
-pc.data = [10,20,30,40,50,60]
-pc.slices[0].popout = 5
-d.add(pc, 'pie1')
-
-pc2 = Pie()
-pc2.x = 150
-pc2.y = 50
-pc2.data = [10,20,30,40,50,60]
-pc2.labels = ['a','b','c','d','e','f']
-d.add(pc2, 'pie2')
-
-pc3 = Pie()
-pc3.x = 275
-pc3.y = 50
-pc3.data = [10,20,30,40,50,60]
-pc3.labels = ['a','b','c','d','e','f']
-pc3.slices.labelRadius = 0.65
-pc3.slices.fontName = "Helvetica-Bold"
-pc3.slices.fontSize = 16
-pc3.slices.fontColor = colors.yellow
-d.add(pc3, 'pie3')
-
-draw(d, 'Some sample Pies')
\ No newline at end of file
diff --git a/bin/reportlab/docs/graphguide/ch5_charts.py b/bin/reportlab/docs/graphguide/ch5_charts.py
deleted file mode 100644
index d37df78d094..00000000000
--- a/bin/reportlab/docs/graphguide/ch5_charts.py
+++ /dev/null
@@ -1,1229 +0,0 @@
-#Copyright ReportLab Europe Ltd. 2000-2004
-#see license.txt for license details
-#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/graphguide/ch5_charts.py
-
-from reportlab.tools.docco.rl_doc_utils import *
-from reportlab.graphics.shapes import *
-
-heading1("Charts")
-
-disc("""
-The motivation for much of this is to create a flexible chart
-package.
-This chapter presents a treatment of the ideas behind our charting
-model, what the design goals are and what components of the chart
-package already exist.
-""")
-
-
-heading2("Design Goals")
-
-disc("Here are some of the design goals: ")
-
-disc("Make simple top-level use really simple ")
-disc("""It should be possible to create a simple chart with minimum lines of
- code, yet have it 'do the right things' with sensible automatic
- settings. The pie chart snippets above do this. If a real chart has
- many subcomponents, you still should not need to interact with them
- unless you want to customize what they do.""")
-
-disc("Allow precise positioning ")
-disc("""An absolute requirement in publishing and graphic design is to control
- the placing and style of every element. We will try to have properties
- that specify things in fixed sizes and proportions of the drawing,
- rather than having automatic resizing. Thus, the 'inner plot
- rectangle' will not magically change when you make the font size of
- the y labels bigger, even if this means your labels can spill out of
- the left edge of the chart rectangle. It is your job to preview the
- chart and choose sizes and spaces which will work.""")
-
-disc("""Some things do need to be automatic. For example, if you want to fit N
- bars into a 200 point space and don't know N in advance, we specify
- bar separation as a percentage of the width of a bar rather than a
- point size, and let the chart work it out. This is still deterministic
- and controllable.""")
-
-disc("Control child elements individually or as a group ")
-disc("""We use smart collection classes that let you customize a group of
- things, or just one of them. For example you can do this in our
- experimental pie chart:""")
-
-eg("""
-d = Drawing(400,200)
-pc = Pie()
-pc.x = 150
-pc.y = 50
-pc.data = [10,20,30,40,50,60]
-pc.labels = ['a','b','c','d','e','f']
-pc.slices.strokeWidth=0.5
-pc.slices[3].popout = 20
-pc.slices[3].strokeWidth = 2
-pc.slices[3].strokeDashArray = [2,2]
-pc.slices[3].labelRadius = 1.75
-pc.slices[3].fontColor = colors.red
-d.add(pc, '')
-""")
-
-disc("""pc.slices[3] actually lazily creates a little object which holds
- information about the slice in question; this will be used to format a
- fourth slice at draw-time if there is one.""")
-
-disc("Only expose things you should change ")
-disc("""It would be wrong from a statistical viewpoint to let you directly
- adjust the angle of one of the pie wedges in the above example, since
- that is determined by the data. So not everything will be exposed
- through the public properties. There may be 'back doors' to let you
- violate this when you really need to, or methods to provide advanced
- functionality, but in general properties will be orthogonal.""")
-
-disc("Composition and component based ")
-disc("""Charts are built out of reusable child widgets. A Legend is an
- easy-to-grasp example. If you need a specialized type of legend (e.g.
- circular colour swatches), you should subclass the standard Legend
- widget. Then you could either do something like...""")
-
-eg("""
-c = MyChartWithLegend()
-c.legend = MyNewLegendClass() # just change it
-c.legend.swatchRadius = 5 # set a property only relevant to the new one
-c.data = [10,20,30] # and then configure as usual...
-""")
-
-disc("""...or create/modify your own chart or drawing class which creates one
- of these by default. This is also very relevant for time series
- charts, where there can be many styles of x axis.""")
-
-disc("""Top level chart classes will create a number of such components, and
- then either call methods or set private properties to tell them their
- height and position - all the stuff which should be done for you and
- which you cannot customise. We are working on modelling what the
- components should be and will publish their APIs here as a consensus
- emerges.""")
-
-disc("Multiples ")
-disc("""A corollary of the component approach is that you can create diagrams
- with multiple charts, or custom data graphics. Our favourite example
- of what we are aiming for is the weather report in our gallery
- contributed by a user; we'd like to make it easy to create such
- drawings, hook the building blocks up to their legends, and feed that
- data in a consistent way.""")
-disc("""(If you want to see the image, it is available on our website at
-http://www.reportlab.com/demos/provencio.pdf )""")
-
-
-##heading2("Key Concepts and Components")
-heading2("Overview")
-
-disc("""A chart or plot is an object which is placed on a drawing; it is not
- itself a drawing. You can thus control where it goes, put several on
- the same drawing, or add annotations.""")
-
-disc("""Charts have two axes; axes may be Value or Category axes. Axes in turn
- have a Labels property which lets you configure all text labels or
- each one individually. Most of the configuration details which vary
- from chart to chart relate to axis properties, or axis labels.""")
-
-disc("""Objects expose properties through the interfaces discussed in the
- previous section; these are all optional and are there to let the end
- user configure the appearance. Things which must be set for a chart to
- work, and essential communication between a chart and its components,
- are handled through methods.""")
-
-disc("""You can subclass any chart component and use your replacement instead
- of the original provided you implement the essential methods and
- properties.""")
-
-
-heading2("Labels")
-
-disc("""
-A label is a string of text attached to some chart element.
-They are used on axes, for titles or alongside axes, or attached
-to individual data points.
-Labels may contain newline characters, but only one font.
-""")
-
-disc("""The text and 'origin' of a label are typically set by its parent
- object. They are accessed by methods rather than properties. Thus, the
- X axis decides the 'reference point' for each tickmark label and the
- numeric or date text for each label. However, the end user can set
- properties of the label (or collection of labels) directly to affect
- its position relative to this origin and all of its formatting.""")
-
-eg("""
-from reportlab.graphics import shapes
-from reportlab.graphics.charts.textlabels import Label
-
-d = Drawing(200, 100)
-
-# mark the origin of the label
-d.add(Circle(100,90, 5, fillColor=colors.green))
-
-lab = Label()
-lab.setOrigin(100,90)
-lab.boxAnchor = 'ne'
-lab.angle = 45
-lab.dx = 0
-lab.dy = -20
-lab.boxStrokeColor = colors.green
-lab.setText('Some\nMulti-Line\nLabel')
-
-d.add(lab)
-""")
-
-
-from reportlab.graphics import shapes
-from reportlab.graphics.charts.textlabels import Label
-
-d = Drawing(200, 100)
-
-# mark the origin of the label
-d.add(Circle(100,90, 5, fillColor=colors.green))
-
-lab = Label()
-lab.setOrigin(100,90)
-lab.boxAnchor = 'ne'
-lab.angle = 45
-lab.dx = 0
-lab.dy = -20
-lab.boxStrokeColor = colors.green
-lab.setText('Some\nMulti-Line\nLabel')
-
-d.add(lab)
-
-draw(d, 'Label example')
-
-
-
-disc("""
-In the drawing above, the label is defined relative to the green blob.
-The text box should have its north-east corner ten points down from
-the origin, and be rotated by 45 degrees about that corner.
-""")
-
-disc("""
-At present labels have the following properties, which we believe are
-sufficient for all charts we have seen to date:
-""")
-
-disc("")
-
-data=[["Property", "Meaning"],
- ["dx", """The label's x displacement."""],
- ["dy", """The label's y displacement."""],
- ["angle", """The angle of rotation (counterclockwise) applied to the label."""],
- ["boxAnchor", "The label's box anchor, one of 'n', 'e', 'w', 's', 'ne', 'nw', 'se', 'sw'."],
- ["textAnchor", """The place where to anchor the label's text, one of 'start', 'middle', 'end'."""],
- ["boxFillColor", """The fill color used in the label's box."""],
- ["boxStrokeColor", "The stroke color used in the label's box."],
- ["boxStrokeWidth", """The line width of the label's box."""],
- ["fontName", """The label's font name."""],
- ["fontSize", """The label's font size."""],
- ["leading", """The leading value of the label's text lines."""],
- ["x", """The X-coordinate of the reference point."""],
- ["y", """The Y-coordinate of the reference point."""],
- ["width", """The label's width."""],
- ["height", """The label's height."""]
- ]
-t=Table(data, colWidths=(100,330))
-t.setStyle(TableStyle([
- ('FONT',(0,0),(-1,0),'Times-Bold',10,12),
- ('FONT',(0,1),(0,-1),'Courier',8,8),
- ('FONT',(1,1),(1,-1),'Times-Roman',10,12),
- ('VALIGN',(0,0),(-1,-1),'MIDDLE'),
- ('INNERGRID', (0,0), (-1,-1), 0.25, colors.black),
- ('BOX', (0,0), (-1,-1), 0.25, colors.black),
- ]))
-getStory().append(t)
-caption("""Table - Label properties""")
-
-disc("""
-To see many more examples of $Label$ objects with different
-combinations of properties, please have a look into the
-ReportLab test suite in the folder $reportlab/test$, run the
-script $test_charts_textlabels.py$ and look at the PDF document
-it generates!
-""")
-
-
-
-heading2("Axes")
-
-disc("""
-We identify two basic kinds of axes - Value and Category
-ones.
-Both come in horizontal and vertical flavors.
-Both can be subclassed to make very specific kinds of axis.
-For example, if you have complex rules for which dates to display
-in a time series application, or want irregular scaling, you override
-the axis and make a new one.
-""")
-
-disc("""
-Axes are responsible for determining the mapping from data to image
-coordinates; transforming points on request from the chart; drawing
-themselves and their tickmarks, gridlines and axis labels.
-""")
-
-disc("""
-This drawing shows two axes, one of each kind, which have been created
-directly without reference to any chart:
-""")
-
-
-from reportlab.graphics import shapes
-from reportlab.graphics.charts.axes import XCategoryAxis,YValueAxis
-
-drawing = Drawing(400, 200)
-
-data = [(10, 20, 30, 40), (15, 22, 37, 42)]
-
-xAxis = XCategoryAxis()
-xAxis.setPosition(75, 75, 300)
-xAxis.configure(data)
-xAxis.categoryNames = ['Beer', 'Wine', 'Meat', 'Cannelloni']
-xAxis.labels.boxAnchor = 'n'
-xAxis.labels[3].dy = -15
-xAxis.labels[3].angle = 30
-xAxis.labels[3].fontName = 'Times-Bold'
-
-yAxis = YValueAxis()
-yAxis.setPosition(50, 50, 125)
-yAxis.configure(data)
-
-drawing.add(xAxis)
-drawing.add(yAxis)
-
-draw(drawing, 'Two isolated axes')
-
-
-disc("Here is the code that created them: ")
-
-eg("""
-from reportlab.graphics import shapes
-from reportlab.graphics.charts.axes import XCategoryAxis,YValueAxis
-
-drawing = Drawing(400, 200)
-
-data = [(10, 20, 30, 40), (15, 22, 37, 42)]
-
-xAxis = XCategoryAxis()
-xAxis.setPosition(75, 75, 300)
-xAxis.configure(data)
-xAxis.categoryNames = ['Beer', 'Wine', 'Meat', 'Cannelloni']
-xAxis.labels.boxAnchor = 'n'
-xAxis.labels[3].dy = -15
-xAxis.labels[3].angle = 30
-xAxis.labels[3].fontName = 'Times-Bold'
-
-yAxis = YValueAxis()
-yAxis.setPosition(50, 50, 125)
-yAxis.configure(data)
-
-drawing.add(xAxis)
-drawing.add(yAxis)
-""")
-
-disc("""
-Remember that, usually, you won't have to create axes directly;
-when using a standard chart, it comes with ready-made axes.
-The methods are what the chart uses to configure it and take care
-of the geometry.
-However, we will talk through them in detail below.
-The orthogonally dual axes to those we describe have essentially
-the same properties, except for those refering to ticks.
-""")
-
-
-heading3("XCategoryAxis class")
-
-disc("""
-A Category Axis doesn't really have a scale; it just divides itself
-into equal-sized buckets.
-It is simpler than a value axis.
-The chart (or programmer) sets its location with the method
-$setPosition(x, y, length)$.
-The next stage is to show it the data so that it can configure
-itself.
-This is easy for a category axis - it just counts the number of
-data points in one of the data series. The $reversed$ attribute (if 1)
-indicates that the categories should be reversed.
-When the drawing is drawn, the axis can provide some help to the
-chart with its $scale()$ method, which tells the chart where
-a given category begins and ends on the page.
-We have not yet seen any need to let people override the widths
-or positions of categories.
-""")
-
-disc("An XCategoryAxis has the following editable properties:")
-
-disc("")
-
-data=[["Property", "Meaning"],
- ["visible", """Should the axis be drawn at all? Sometimes you don't want
-to display one or both axes, but they still need to be there as
-they manage the scaling of points."""],
- ["strokeColor", "Color of the axis"],
- ["strokeDashArray", """Whether to draw axis with a dash and, if so, what kind.
-Defaults to None"""],
- ["strokeWidth", "Width of axis in points"],
- ["tickUp", """How far above the axis should the tick marks protrude?
-(Note that making this equal to chart height gives you a gridline)"""],
- ["tickDown", """How far below the axis should the tick mark protrude?"""],
- ["categoryNames", """Either None, or a list of strings. This should have the
-same length as each data series."""],
- ["labels", """A collection of labels for the tick marks. By default the 'north'
-of each text label (i.e top centre) is positioned 5 points down
-from the centre of each category on the axis. You may redefine
-any property of the whole label group or of any one label. If
-categoryNames=None, no labels are drawn."""],
- ["title", """Not Implemented Yet. This needs to be like a label, but also
-lets you set the text directly. It would have a default
-location below the axis."""]]
-t=Table(data, colWidths=(100,330))
-t.setStyle(TableStyle([
- ('FONT',(0,0),(-1,0),'Times-Bold',10,12),
- ('FONT',(0,1),(0,-1),'Courier',8,8),
- ('FONT',(1,1),(1,-1),'Times-Roman',10,12),
- ('VALIGN',(0,0),(-1,-1),'MIDDLE'),
- ('INNERGRID', (0,0), (-1,-1), 0.25, colors.black),
- ('BOX', (0,0), (-1,-1), 0.25, colors.black),
- ]))
-getStory().append(t)
-caption("""Table - XCategoryAxis properties""")
-
-
-heading3("YValueAxis")
-
-disc("""
-The left axis in the diagram is a YValueAxis.
-A Value Axis differs from a Category Axis in that each point along
-its length corresponds to a y value in chart space.
-It is the job of the axis to configure itself, and to convert Y values
-from chart space to points on demand to assist the parent chart in
-plotting.
-""")
-
-disc("""
-$setPosition(x, y, length)$ and $configure(data)$ work exactly as
-for a category axis.
-If you have not fully specified the maximum, minimum and tick
-interval, then $configure()$ results in the axis choosing suitable
-values.
-Once configured, the value axis can convert y data values to drawing
-space with the $scale()$ method.
-Thus:
-""")
-
-eg("""
->>> yAxis = YValueAxis()
->>> yAxis.setPosition(50, 50, 125)
->>> data = [(10, 20, 30, 40),(15, 22, 37, 42)]
->>> yAxis.configure(data)
->>> yAxis.scale(10) # should be bottom of chart
-50.0
->>> yAxis.scale(40) # should be near the top
-167.1875
->>>
-""")
-
-disc("""By default, the highest data point is aligned with the top of the
- axis, the lowest with the bottom of the axis, and the axis choose
- 'nice round numbers' for its tickmark points. You may override these
- settings with the properties below. """)
-
-disc("")
-
-data=[["Property", "Meaning"],
- ["visible", """Should the axis be drawn at all? Sometimes you don't want
-to display one or both axes, but they still need to be there as
-they manage the scaling of points."""],
- ["strokeColor", "Color of the axis"],
- ["strokeDashArray", """Whether to draw axis with a dash and, if so, what kind.
-Defaults to None"""],
- ["strokeWidth", "Width of axis in points"],
- ["tickLeft", """How far to the left of the axis should the tick marks protrude?
-(Note that making this equal to chart height gives you a gridline)"""],
- ["tickRight", """How far to the right of the axis should the tick mark protrude?"""],
-
- ["valueMin", """The y value to which the bottom of the axis should correspond.
-Default value is None in which case the axis sets it to the lowest
-actual data point (e.g. 10 in the example above). It is common to set
-this to zero to avoid misleading the eye."""],
- ["valueMax", """The y value to which the top of the axis should correspond.
-Default value is None in which case the axis sets it to the highest
-actual data point (e.g. 42 in the example above). It is common to set
-this to a 'round number' so data bars do not quite reach the top."""],
- ["valueStep", """The y change between tick intervals. By default this is
-None, and the chart tries to pick 'nice round numbers' which are
-just wider than the minimumTickSpacing below."""],
-
- ["valueSteps", """A list of numbers at which to place ticks."""],
-
- ["minimumTickSpacing", """This is used when valueStep is set to None, and ignored
-otherwise. The designer specified that tick marks should be no
-closer than X points apart (based, presumably, on considerations
-of the label font size and angle). The chart tries values of the
-type 1,2,5,10,20,50,100... (going down below 1 if necessary) until
-it finds an interval which is greater than the desired spacing, and
-uses this for the step."""],
- ["labelTextFormat", """This determines what goes in the labels. Unlike a category
-axis which accepts fixed strings, the labels on a ValueAxis are
-supposed to be numbers. You may provide either a 'format string'
-like '%0.2f' (show two decimal places), or an arbitrary function
-which accepts a number and returns a string. One use for the
-latter is to convert a timestamp to a readable year-month-day
-format."""],
- ["title", """Not Implemented Yet. This needs to be like a label, but also
-lets you set the text directly. It would have a default
-location below the axis."""]]
-t=Table(data, colWidths=(100,330))
-t.setStyle(TableStyle([
- ('FONT',(0,0),(-1,0),'Times-Bold',10,12),
- ('FONT',(0,1),(0,-1),'Courier',8,8),
- ('FONT',(1,1),(1,-1),'Times-Roman',10,12),
- ('VALIGN',(0,0),(-1,-1),'MIDDLE'),
- ('INNERGRID', (0,0), (-1,-1), 0.25, colors.black),
- ('BOX', (0,0), (-1,-1), 0.25, colors.black),
- ]))
-getStory().append(t)
-caption("""Table - YValueAxis properties""")
-
-disc("""
-The $valueSteps$ property lets you explicitly specify the
-tick mark locations, so you don't have to follow regular intervals.
-Hence, you can plot month ends and month end dates with a couple of
-helper functions, and without needing special time series chart
-classes.
-The following code show how to create a simple $XValueAxis$ with special
-tick intervals. Make sure to set the $valueSteps$ attribute before calling
-the configure method!
-""")
-
-eg("""
-from reportlab.graphics.shapes import Drawing
-from reportlab.graphics.charts.axes import XValueAxis
-
-drawing = Drawing(400, 100)
-
-data = [(10, 20, 30, 40)]
-
-xAxis = XValueAxis()
-xAxis.setPosition(75, 50, 300)
-xAxis.valueSteps = [10, 15, 20, 30, 35, 40]
-xAxis.configure(data)
-xAxis.labels.boxAnchor = 'n'
-
-drawing.add(xAxis)
-""")
-
-
-from reportlab.graphics import shapes
-from reportlab.graphics.charts.axes import XValueAxis
-
-drawing = Drawing(400, 100)
-
-data = [(10, 20, 30, 40)]
-
-xAxis = XValueAxis()
-xAxis.setPosition(75, 50, 300)
-xAxis.valueSteps = [10, 15, 20, 30, 35, 40]
-xAxis.configure(data)
-xAxis.labels.boxAnchor = 'n'
-
-drawing.add(xAxis)
-
-draw(drawing, 'An axis with non-equidistant tick marks')
-
-
-disc("""
-In addition to these properties, all axes classes have three
-properties describing how to join two of them to each other.
-Again, this is interesting only if you define your own charts
-or want to modify the appearance of an existing chart using
-such axes.
-These properties are listed here only very briefly for now,
-but you can find a host of sample functions in the module
-$reportlab/graphics/axes.py$ which you can examine...
-""")
-
-disc("""
-One axis is joined to another, by calling the method
-$joinToAxis(otherAxis, mode, pos)$ on the first axis,
-with $mode$ and $pos$ being the properties described by
-$joinAxisMode$ and $joinAxisPos$, respectively.
-$'points'$ means to use an absolute value, and $'value'$
-to use a relative value (both indicated by the the
-$joinAxisPos$ property) along the axis.
-""")
-
-disc("")
-
-data=[["Property", "Meaning"],
- ["joinAxis", """Join both axes if true."""],
- ["joinAxisMode", """Mode used for connecting axis ('bottom', 'top', 'left', 'right', 'value', 'points', None)."""],
- ["joinAxisPos", """Position at which to join with other axis."""],
- ]
-t=Table(data, colWidths=(100,330))
-t.setStyle(TableStyle([
- ('FONT',(0,0),(-1,0),'Times-Bold',10,12),
- ('FONT',(0,1),(0,-1),'Courier',8,8),
- ('FONT',(1,1),(1,-1),'Times-Roman',10,12),
- ('VALIGN',(0,0),(-1,-1),'MIDDLE'),
- ('INNERGRID', (0,0), (-1,-1), 0.25, colors.black),
- ('BOX', (0,0), (-1,-1), 0.25, colors.black),
- ]))
-getStory().append(t)
-caption("""Table - Axes joining properties""")
-
-
-heading2("Bar Charts")
-
-disc("""
-This describes our current $VerticalBarChart$ class, which uses the
-axes and labels above.
-We think it is step in the right direction but is is
-far from final.
-Note that people we speak to are divided about 50/50 on whether to
-call this a 'Vertical' or 'Horizontal' bar chart.
-We chose this name because 'Vertical' appears next to 'Bar', so
-we take it to mean that the bars rather than the category axis
-are vertical.
-""")
-
-disc("""
-As usual, we will start with an example:
-""")
-
-from reportlab.graphics.shapes import Drawing
-from reportlab.graphics.charts.barcharts import VerticalBarChart
-
-drawing = Drawing(400, 200)
-
-data = [
- (13, 5, 20, 22, 37, 45, 19, 4),
- (14, 6, 21, 23, 38, 46, 20, 5)
- ]
-
-bc = VerticalBarChart()
-bc.x = 50
-bc.y = 50
-bc.height = 125
-bc.width = 300
-bc.data = data
-bc.strokeColor = colors.black
-
-bc.valueAxis.valueMin = 0
-bc.valueAxis.valueMax = 50
-bc.valueAxis.valueStep = 10
-
-bc.categoryAxis.labels.boxAnchor = 'ne'
-bc.categoryAxis.labels.dx = 8
-bc.categoryAxis.labels.dy = -2
-bc.categoryAxis.labels.angle = 30
-bc.categoryAxis.categoryNames = ['Jan-99','Feb-99','Mar-99',
- 'Apr-99','May-99','Jun-99','Jul-99','Aug-99']
-
-drawing.add(bc)
-
-draw(drawing, 'Simple bar chart with two data series')
-
-
-eg("""
- # code to produce the above chart
-
- from reportlab.graphics.shapes import Drawing
- from reportlab.graphics.charts.barcharts import VerticalBarChart
-
- drawing = Drawing(400, 200)
-
- data = [
- (13, 5, 20, 22, 37, 45, 19, 4),
- (14, 6, 21, 23, 38, 46, 20, 5)
- ]
-
- bc = VerticalBarChart()
- bc.x = 50
- bc.y = 50
- bc.height = 125
- bc.width = 300
- bc.data = data
- bc.strokeColor = colors.black
-
- bc.valueAxis.valueMin = 0
- bc.valueAxis.valueMax = 50
- bc.valueAxis.valueStep = 10
-
- bc.categoryAxis.labels.boxAnchor = 'ne'
- bc.categoryAxis.labels.dx = 8
- bc.categoryAxis.labels.dy = -2
- bc.categoryAxis.labels.angle = 30
- bc.categoryAxis.categoryNames = ['Jan-99','Feb-99','Mar-99',
- 'Apr-99','May-99','Jun-99','Jul-99','Aug-99']
-
- drawing.add(bc)
-""")
-
-disc("""
-Most of this code is concerned with setting up the axes and
-labels, which we have already covered.
-Here are the top-level properties of the $VerticalBarChart$ class:
-""")
-
-disc("")
-
-data=[["Property", "Meaning"],
- ["data", """This should be a "list of lists of numbers" or "list of
-tuples of numbers". If you have just one series, write it as
-data = [(10,20,30,42),]"""],
- ["x, y, width, height", """These define the inner 'plot rectangle'. We
-highlighted this with a yellow border above. Note that it is
-your job to place the chart on the drawing in a way which leaves
-room for all the axis labels and tickmarks. We specify this 'inner
-rectangle' because it makes it very easy to lay out multiple charts
-in a consistent manner."""],
- ["strokeColor", """Defaults to None. This will draw a border around the
-plot rectangle, which may be useful in debugging. Axes will
-overwrite this."""],
- ["fillColor", """Defaults to None. This will fill the plot rectangle with
-a solid color. (Note that we could implement dashArray etc.
-as for any other solid shape)"""],
- ["barLabelFormat", """This is a format string or function used for displaying
-labels above each bar. They are positioned automatically
-above the bar for positive values and below for negative ones."""],
- ["useAbsolute", """Defaults to 0. If 1, the three properties below are
-absolute values in points (which means you can make a chart
-where the bars stick out from the plot rectangle); if 0,
-they are relative quantities and indicate the proportional
-widths of the elements involved."""],
- ["barWidth", """As it says. Defaults to 10."""],
- ["groupSpacing", """Defaults to 5. This is the space between each group of
-bars. If you have only one series, use groupSpacing and not
-barSpacing to split them up. Half of the groupSpacing is used
-before the first bar in the chart, and another half at the end."""],
- ["barSpacing", """Defaults to 0. This is the spacing between bars in each
-group. If you wanted a little gap between green and red bars in
-the example above, you would make this non-zero."""],
- ["barLabelFormat", """Defaults to None. As with the YValueAxis, if you supply
-a function or format string then labels will be drawn next
-to each bar showing the numeric value."""],
- ["barLabels", """A collection of labels used to format all bar labels. Since
-this is a two-dimensional array, you may explicitly format the
-third label of the second series using this syntax:
- chart.barLabels[(1,2)].fontSize = 12"""],
- ["valueAxis", """The value axis, which may be formatted as described
-previously."""],
- ["categoryAxis", """The category axis, which may be formatted as described
-previously."""],
-
- ["title", """Not Implemented Yet. This needs to be like a label, but also
-lets you set the text directly. It would have a default
-location below the axis."""]]
-t=Table(data, colWidths=(100,330))
-t.setStyle(TableStyle([
- ('FONT',(0,0),(-1,0),'Times-Bold',10,12),
- ('FONT',(0,1),(0,-1),'Courier',8,8),
- ('FONT',(1,1),(1,-1),'Times-Roman',10,12),
- ('VALIGN',(0,0),(-1,-1),'MIDDLE'),
- ('INNERGRID', (0,0), (-1,-1), 0.25, colors.black),
- ('BOX', (0,0), (-1,-1), 0.25, colors.black),
- ]))
-getStory().append(t)
-caption("""Table - VerticalBarChart properties""")
-
-
-disc("""
-From this table we deduce that adding the following lines to our code
-above should double the spacing between bar groups (the $groupSpacing$
-attribute has a default value of five points) and we should also see
-some tiny space between bars of the same group ($barSpacing$).
-""")
-
-eg("""
- bc.groupSpacing = 10
- bc.barSpacing = 2.5
-""")
-
-disc("""
-And, in fact, this is exactly what we can see after adding these
-lines to the code above.
-Notice how the width of the individual bars has changed as well.
-This is because the space added between the bars has to be 'taken'
-from somewhere as the total chart width stays unchanged.
-""")
-
-from reportlab.graphics.shapes import Drawing
-from reportlab.graphics.charts.barcharts import VerticalBarChart
-
-drawing = Drawing(400, 200)
-
-data = [
- (13, 5, 20, 22, 37, 45, 19, 4),
- (14, 6, 21, 23, 38, 46, 20, 5)
- ]
-
-bc = VerticalBarChart()
-bc.x = 50
-bc.y = 50
-bc.height = 125
-bc.width = 300
-bc.data = data
-bc.strokeColor = colors.black
-
-bc.groupSpacing = 10
-bc.barSpacing = 2.5
-
-bc.valueAxis.valueMin = 0
-bc.valueAxis.valueMax = 50
-bc.valueAxis.valueStep = 10
-
-bc.categoryAxis.labels.boxAnchor = 'ne'
-bc.categoryAxis.labels.dx = 8
-bc.categoryAxis.labels.dy = -2
-bc.categoryAxis.labels.angle = 30
-bc.categoryAxis.categoryNames = ['Jan-99','Feb-99','Mar-99',
- 'Apr-99','May-99','Jun-99','Jul-99','Aug-99']
-
-drawing.add(bc)
-
-draw(drawing, 'Like before, but with modified spacing')
-
-disc("""
-Bars labels are automatically displayed for negative values
-below the lower end of the bar for positive values
-above the upper end of the other ones.
-""")
-
-
-##Property Value
-##data This should be a "list of lists of numbers" or "list of tuples of numbers". If you have just one series, write it as
-##data = [(10,20,30,42),]
-##
-##x, y, width, height These define the inner 'plot rectangle'. We highlighted this with a yellow border above. Note that it is your job to place the chart on the drawing in a way which leaves room for all the axis labels and tickmarks. We specify this 'inner rectangle' because it makes it very easy to lay out multiple charts in a consistent manner.
-##strokeColor Defaults to None. This will draw a border around the plot rectangle, which may be useful in debugging. Axes will overwrite this.
-##fillColor Defaults to None. This will fill the plot rectangle with a solid color. (Note that we could implement dashArray etc. as for any other solid shape)
-##barLabelFormat This is a format string or function used for displaying labels above each bar. We're working on ways to position these labels so that they work for positive and negative bars.
-##useAbsolute Defaults to 0. If 1, the three properties below are absolute values in points (which means you can make a chart where the bars stick out from the plot rectangle); if 0, they are relative quantities and indicate the proportional widths of the elements involved.
-##barWidth As it says. Defaults to 10.
-##groupSpacing Defaults to 5. This is the space between each group of bars. If you have only one series, use groupSpacing and not barSpacing to split them up. Half of the groupSpacing is used before the first bar in the chart, and another half at the end.
-##barSpacing Defaults to 0. This is the spacing between bars in each group. If you wanted a little gap between green and red bars in the example above, you would make this non-zero.
-##barLabelFormat Defaults to None. As with the YValueAxis, if you supply a function or format string then labels will be drawn next to each bar showing the numeric value.
-##barLabels A collection of labels used to format all bar labels. Since this is a two-dimensional array, you may explicitly format the third label of the second series using this syntax:
-## chart.barLabels[(1,2)].fontSize = 12
-##
-##valueAxis The value axis, which may be formatted as described previously
-##categoryAxis The categoryAxis, which may be formatted as described previously
-##title, subTitle Not implemented yet. These would be label-like objects whose text could be set directly and which would appear in sensible locations. For now, you can just place extra strings on the drawing.
-
-
-heading2("Line Charts")
-
-disc("""
-We consider "Line Charts" to be essentially the same as
-"Bar Charts", but with lines instead of bars.
-Both share the same pair of Category/Value axes pairs.
-This is in contrast to "Line Plots", where both axes are
-Value axes.
-""")
-
-disc("""
-The following code and its output shall serve as a simple
-example.
-More explanation will follow.
-For the time being you can also study the output of running
-the tool $reportlab/lib/graphdocpy.py$ withough any arguments
-and search the generated PDF document for examples of
-Line Charts.
-""")
-
-eg("""
-from reportlab.graphics.charts.linecharts import HorizontalLineChart
-
-drawing = Drawing(400, 200)
-
-data = [
- (13, 5, 20, 22, 37, 45, 19, 4),
- (5, 20, 46, 38, 23, 21, 6, 14)
-]
-
-lc = HorizontalLineChart()
-lc.x = 50
-lc.y = 50
-lc.height = 125
-lc.width = 300
-lc.data = data
-lc.joinedLines = 1
-catNames = string.split('Jan Feb Mar Apr May Jun Jul Aug', ' ')
-lc.categoryAxis.categoryNames = catNames
-lc.categoryAxis.labels.boxAnchor = 'n'
-lc.valueAxis.valueMin = 0
-lc.valueAxis.valueMax = 60
-lc.valueAxis.valueStep = 15
-lc.lines[0].strokeWidth = 2
-lc.lines[1].strokeWidth = 1.5
-drawing.add(lc)
-""")
-
-from reportlab.graphics.charts.linecharts import HorizontalLineChart
-
-drawing = Drawing(400, 200)
-
-data = [
- (13, 5, 20, 22, 37, 45, 19, 4),
- (5, 20, 46, 38, 23, 21, 6, 14)
-]
-
-lc = HorizontalLineChart()
-lc.x = 50
-lc.y = 50
-lc.height = 125
-lc.width = 300
-lc.data = data
-lc.joinedLines = 1
-catNames = string.split('Jan Feb Mar Apr May Jun Jul Aug', ' ')
-lc.categoryAxis.categoryNames = catNames
-lc.categoryAxis.labels.boxAnchor = 'n'
-lc.valueAxis.valueMin = 0
-lc.valueAxis.valueMax = 60
-lc.valueAxis.valueStep = 15
-lc.lines[0].strokeWidth = 2
-lc.lines[1].strokeWidth = 1.5
-drawing.add(lc)
-
-draw(drawing, 'HorizontalLineChart sample')
-
-
-disc("")
-todo("Add properties table.")
-
-
-heading2("Line Plots")
-
-disc("""
-Below we show a more complex example of a Line Plot that
-also uses some experimental features like line markers
-placed at each data point.
-""")
-
-eg("""
-from reportlab.graphics.charts.lineplots import LinePlot
-from reportlab.graphics.widgets.markers import makeMarker
-
-drawing = Drawing(400, 200)
-
-data = [
- ((1,1), (2,2), (2.5,1), (3,3), (4,5)),
- ((1,2), (2,3), (2.5,2), (3.5,5), (4,6))
-]
-
-lp = LinePlot()
-lp.x = 50
-lp.y = 50
-lp.height = 125
-lp.width = 300
-lp.data = data
-lp.joinedLines = 1
-lp.lines[0].symbol = makeMarker('FilledCircle')
-lp.lines[1].symbol = makeMarker('Circle')
-lp.lineLabelFormat = '%2.0f'
-lp.strokeColor = colors.black
-lp.xValueAxis.valueMin = 0
-lp.xValueAxis.valueMax = 5
-lp.xValueAxis.valueSteps = [1, 2, 2.5, 3, 4, 5]
-lp.xValueAxis.labelTextFormat = '%2.1f'
-lp.yValueAxis.valueMin = 0
-lp.yValueAxis.valueMax = 7
-lp.yValueAxis.valueSteps = [1, 2, 3, 5, 6]
-
-drawing.add(lp)
-""")
-
-
-from reportlab.graphics.charts.lineplots import LinePlot
-from reportlab.graphics.widgets.markers import makeMarker
-
-drawing = Drawing(400, 200)
-
-data = [
- ((1,1), (2,2), (2.5,1), (3,3), (4,5)),
- ((1,2), (2,3), (2.5,2), (3.5,5), (4,6))
-]
-
-lp = LinePlot()
-lp.x = 50
-lp.y = 50
-lp.height = 125
-lp.width = 300
-lp.data = data
-lp.joinedLines = 1
-lp.lines[0].symbol = makeMarker('FilledCircle')
-lp.lines[1].symbol = makeMarker('Circle')
-lp.lineLabelFormat = '%2.0f'
-lp.strokeColor = colors.black
-lp.xValueAxis.valueMin = 0
-lp.xValueAxis.valueMax = 5
-lp.xValueAxis.valueSteps = [1, 2, 2.5, 3, 4, 5]
-lp.xValueAxis.labelTextFormat = '%2.1f'
-lp.yValueAxis.valueMin = 0
-lp.yValueAxis.valueMax = 7
-lp.yValueAxis.valueSteps = [1, 2, 3, 5, 6]
-
-drawing.add(lp)
-
-draw(drawing, 'LinePlot sample')
-
-
-
-disc("")
-todo("Add properties table.")
-
-
-
-heading2("Pie Charts")
-
-disc("""
-We've already seen a pie chart example above.
-This is provisional but seems to do most things.
-At the very least we need to change the name.
-For completeness we will cover it here.
-""")
-
-eg("""
-from reportlab.graphics.charts.piecharts import Pie
-
-d = Drawing(200, 100)
-
-pc = Pie()
-pc.x = 65
-pc.y = 15
-pc.width = 70
-pc.height = 70
-pc.data = [10,20,30,40,50,60]
-pc.labels = ['a','b','c','d','e','f']
-
-pc.slices.strokeWidth=0.5
-pc.slices[3].popout = 10
-pc.slices[3].strokeWidth = 2
-pc.slices[3].strokeDashArray = [2,2]
-pc.slices[3].labelRadius = 1.75
-pc.slices[3].fontColor = colors.red
-
-d.add(pc)
-""")
-
-from reportlab.graphics.charts.piecharts import Pie
-
-d = Drawing(200, 100)
-
-pc = Pie()
-pc.x = 65
-pc.y = 15
-pc.width = 70
-pc.height = 70
-pc.data = [10,20,30,40,50,60]
-pc.labels = ['a','b','c','d','e','f']
-
-pc.slices.strokeWidth=0.5
-pc.slices[3].popout = 10
-pc.slices[3].strokeWidth = 2
-pc.slices[3].strokeDashArray = [2,2]
-pc.slices[3].labelRadius = 1.75
-pc.slices[3].fontColor = colors.red
-
-d.add(pc)
-
-draw(d, 'A bare bones pie chart')
-
-disc("""
-Properties are covered below.
-The pie has a 'wedges' collection and we document wedge properties
-in the same table.
-This was invented before we finished the $Label$ class and will
-probably be reworked to use such labels shortly.
-""")
-
-disc("")
-todo("Add properties table.")
-
-##Property Value
-##data a list or tuple of numbers
-##x, y, width, height Bounding box of the pie. Note that x and y do NOT specify the centre but the bottom left corner, and that width and height do not have to be equal; pies may be elliptical and wedges will be drawn correctly.
-##labels None, or a list of strings. Make it None if you don't want labels around the edge of the pie. Since it is impossible to know the size of slices, we generally discourage placing labels in or around pies; it is much better to put them in a legend alongside.
-##startAngle Where is the start angle of the first pie slice? The default is '90' which is twelve o'clock.
-##direction Which direction do slices progress in? The default is 'clockwise'.
-##wedges Collection of wedges. This lets you customise each wedge, or individual ones. See below
-##wedges.strokeWidth Border width for wedge
-##wedges.strokeColor Border color
-##wedges.strokeDashArray Solid or dashed line configuration for
-##wedges.popout How far out should the slice(s) stick from the centre of
-##the pie? default is zero.
-##wedges.fontName
-##wedges.fontSize
-##wedges.fontColor Used for text labels
-##wedges.labelRadius This controls the anchor point for a text label. It
-##is a fraction of the radius; 0.7 will place the text inside the pie,
-##1.2 will place it slightly outside. (note that if we add labels, we
-##will keep this to specify their anchor point)
-##
-
-
-heading2("Legends")
-
-disc("""
-Various preliminary legend classes can be found but need a
-cleanup to be consistent with the rest of the charting
-model.
-Legends are the natural place to specify the colors and line
-styles of charts; we propose that each chart is created with
-a $legend$ attribute which is invisible.
-One would then do the following to specify colors:
-""")
-
-eg("""
-myChart.legend.defaultColors = [red, green, blue]
-""")
-
-disc("""
-One could also define a group of charts sharing the same legend:
-""")
-
-eg("""
-myLegend = Legend()
-myLegend.defaultColor = [red, green.....] #yuck!
-myLegend.columns = 2
-# etc.
-chart1.legend = myLegend
-chart2.legend = myLegend
-chart3.legend = myLegend
-""")
-
-# Hack to force a new paragraph before the todo() :-(
-disc("")
-
-todo("""Does this work? Is it an acceptable complication over specifying chart
-colors directly?""")
-
-
-
-heading2("Remaining Issues")
-
-disc("""
-There are several issues that are almost solved, but for which
-is is a bit too early to start making them really public.
-Nevertheless, here is a list of things that are under way:
-""")
-
-list("""
-Color specification - right now the chart has an undocumented property
-$defaultColors$, which provides a list of colors to cycle through,
-such that each data series gets its own color.
-Right now, if you introduce a legend, you need to make sure it shares
-the same list of colors.
-Most likely, this will be replaced with a scheme to specify a kind
-of legend containing attributes with different values for each data
-series.
-This legend can then also be shared by several charts, but need not
-be visible itself.
-""")
-
-list("""
-Additional chart types - when the current design will have become
-more stable, we expect to add variants of bar charts to deal with stacked
-and percentile bars as well as the side-by-side variant seen here.
-""")
-
-
-heading2("Outlook")
-
-disc("""
-It will take some time to deal with the full range of chart types.
-We expect to finalize bars and pies first and to produce trial
-implementations of more general plots, thereafter.
-""")
-
-
-heading3("X-Y Plots")
-
-disc("""
-Most other plots involve two value axes and directly plotting
-x-y data in some form.
-The series can be plotted as lines, marker symbols, both, or
-custom graphics such as open-high-low-close graphics.
-All share the concepts of scaling and axis/title formatting.
-At a certain point, a routine will loop over the data series and
-'do something' with the data points at given x-y locations.
-Given a basic line plot, it should be very easy to derive a
-custom chart type just by overriding a single method - say,
-$drawSeries()$.
-""")
-
-
-heading3("Marker customisation and custom shapes")
-
-disc("""
-Well known plotting packages such as excel, Mathematica and Excel
-offer ranges of marker types to add to charts.
-We can do better - you can write any kind of chart widget you
-want and just tell the chart to use it as an example.
-""")
-
-
-heading4("Combination plots")
-
-disc("""
-Combining multiple plot types is really easy.
-You can just draw several charts (bar, line or whatever) in
-the same rectangle, suppressing axes as needed.
-So a chart could correlate a line with Scottish typhoid cases
-over a 15 year period on the left axis with a set of bars showing
-inflation rates on the right axis.
-If anyone can remind us where this example came from we'll
-attribute it, and happily show the well-known graph as an
-example.
-""")
-
-
-heading3("Interactive editors")
-
-disc("""
-One principle of the Graphics package is to make all 'interesting'
-properties of its graphic components accessible and changeable by
-setting apropriate values of corresponding public attributes.
-This makes it very tempting to build a tool like a GUI editor that
-that helps you with doing that interactively.
-""")
-
-disc("""
-ReportLab has built such a tool using the Tkinter toolkit that
-loads pure Python code describing a drawing and records your
-property editing operations.
-This "change history" is then used to create code for a subclass
-of that chart, say, that can be saved and used instantly just
-like any other chart or as a new starting point for another
-interactive editing session.
-""")
-
-disc("""
-This is still work in progress, though, and the conditions for
-releasing this need to be further elaborated.
-""")
-
-
-heading3("Misc.")
-
-disc("""
-This has not been an exhaustive look at all the chart classes.
-Those classes are constantly being worked on.
-To see exactly what is in the current distribution, use the
-$graphdocpy.py$ utility.
-By default, it will run on reportlab/graphics, and produce a full
-report.
-(If you want to run it on other modules or packages,
-$graphdocpy.py -h$ prints a help message that will tell you
-how.)
-""")
-
-disc("""
-This is the tool that was mentioned in the section on 'Documenting
-Widgets'.
-""")
\ No newline at end of file
diff --git a/bin/reportlab/docs/graphguide/gengraphguide.py b/bin/reportlab/docs/graphguide/gengraphguide.py
deleted file mode 100644
index 541bbcedbac..00000000000
--- a/bin/reportlab/docs/graphguide/gengraphguide.py
+++ /dev/null
@@ -1,59 +0,0 @@
-#!/bin/env python
-#Copyright ReportLab Europe Ltd. 2000-2004
-#see license.txt for license details
-#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/docs/graphguide/gengraphguide.py
-__version__=''' $Id: gengraphguide.py 2385 2004-06-17 15:26:05Z rgbecker $ '''
-__doc__ = """
-This module contains the script for building the graphics guide.
-"""
-def run(pagesize=None, verbose=1, outDir=None):
- import os
- from reportlab.tools.docco.rl_doc_utils import setStory, getStory, RLDocTemplate, defaultPageSize
- from reportlab.tools.docco import rl_doc_utils
- from reportlab.lib.utils import open_and_read, _RL_DIR
- if not outDir: outDir = os.path.join(_RL_DIR,'docs')
- destfn = os.path.join(outDir,'graphguide.pdf')
- doc = RLDocTemplate(destfn,pagesize = pagesize or defaultPageSize)
-
- #this builds the story
- setStory()
- G = {}
- exec 'from reportlab.tools.docco.rl_doc_utils import *' in G, G
- doc = RLDocTemplate(destfn,pagesize = pagesize or defaultPageSize)
- for f in (
- 'ch1_intro',
- 'ch2_concepts',
- 'ch3_shapes',
- 'ch4_widgets',
- 'ch5_charts',
- ):
- exec open_and_read(f+'.py',mode='t') in G, G
- del G
-
- story = getStory()
- if verbose: print 'Built story contains %d flowables...' % len(story)
- doc.build(story)
- if verbose: print 'Saved "%s"' % destfn
-
-def makeSuite():
- "standard test harness support - run self as separate process"
- from reportlab.test.utils import ScriptThatMakesFileTest
- return ScriptThatMakesFileTest('../docs/graphguide', 'gengraphguide.py', 'graphguide.pdf')
-
-def main():
- import sys
- verbose = '-s' not in sys.argv
- if not verbose: sys.argv.remove('-s')
- if len(sys.argv) > 1:
- try:
- pagesize = eval(sys.argv[1])
- except:
- print 'Expected page size in argument 1', sys.argv[1]
- raise
- print 'set page size to',sys.argv[1]
- else:
- pagesize = None
- run(pagesize,verbose)
-
-if __name__=="__main__":
- main()
diff --git a/bin/reportlab/docs/images/Edit_Prefs.gif b/bin/reportlab/docs/images/Edit_Prefs.gif
deleted file mode 100644
index ebcfa34987d8ca83cf51cf4206c79dd4ba3c6ffb..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 9685
zcmbtYvK0n^zyKf^00;vhry^M+!H}epERnR3Ipkm@
zHWC_%g=_{q33`f=2LyotArQcmKIB+r1Oh=oKnMu%Bp1m7nFN9$Kp+GNK&nTQLe@e6
zAP4{m0U+fe{Xo)0b|dXT>PM15DnznIf+0yGSt3i3JdlHt*hpw37U0Rbr!+D~9v}z=
zcrp^H4>=YY0f8VO0O>1IE|LW@2?78?0Hlvdr;!FAc_GV@MkCcCtwj2Pq>1cC+JWSR
z6pU1eWQ_zvl16qSX(4$a2P3hO(152EJyj#q$QXG5$c-V5MCwD1MMglt)8%;b^}l^T
zCI4IDlg0RU|PKpFs`2LK3=H2#nD>FMd}>S}9iYk7HjczC#{r>C~IwzRY~
zJv}`E!4oz+@&P=(3vw86zzHU$eD(M4U<@Mi6**^`z%YCU#Vq+6dKo=ZAn2ilfMGCz
z7BNOjHl075#PYEmyjW8-n#yJ|qI~-&ZcO~4HR%vNkDpR3TTvs)c$KxRMnMp7v?LiNj4D+9s%mj_Et&c8>pm71znTlHqD8u;se
ztak=J$EH?puHNhoKRLl3*3J7p7|)=Tqx`dWXEYsXzXtpHMS?9Vjc={3XI(si4fU%Q
zJdU?>_PK6dj-y)R$vlSB%)BuLzth(?iLIy;3Qwo4R(E>w@dr=Wg=$fyT(NkwAQZem
zJNFAt{qFq$IBoD6MNZ4@#r{l%=>+w8uix44QO_H7@c!A(^3nQ4XD9NFig{z;4|rv>
z5rn~93JJWiWu|Z`h9}|K*E+tQ4r$ldiw`9fv&IV}Me!t;Cv{ykb83kyQ#d~@~7t8j_n?8X|Y(FnniGCOoSV>U&$#P`J
zGD}j`FT}sQYnOsN|m$p;I$T6)WWw|k}
z68&VC7?Oc6%1gq%smU2*E5GNotLv*LC#_487L%oN8pJujBoYe!|VIW&hP
z``FDFK@}&BE9I9HRp^*3@jv3989FxY7gwCN95=GDH@~>DgZ!L-WnWo0B3bdLW8yl~
zscsg__fN;d-6)m3PIJXs4^HkS2W^{);;F?YpTpmNQtRlGUV==0{r;X`qklRP*Y@wb
zr(Q(=s2_W*LjkaD+{7EuG2sBl`tqR{!~9Z0XZ08pMs)+y=mRdzgcJ65Q_2+~BzchtDzp|19wl(FW7R6#ay!h)vlde*tZ*R4(W;|tdnugAU0
zCbKVwCpD}33~c8M!a#e0#qcO&0eQ|rFyFZSZ-+0#EdPjjCPoY%ucf&ws03q^O2C5K
zc^9osP1;0^ob!gcr*}uyy0cA(?n&fcLxwaRHxub^OeTJ|r=8r?6k_`c?!2%!@%b}i
z$oTWGJwuz$?qIG8d@p-2*5UAZUjDG}IidvQhKX6YsL`(3n?8TDUq6r#_ca7!{Lk(U
zSv&!oCtEAc<`#POU1+>x)XX|y6@O@M1~rgs#NU2Rh^AN0d!#+x@r<+BzdR}!DN_XG^iC%HE3iI!)FRqI_o`i2lG2YbE!
zcrzLHUR;oN^pa2uviXs=aX2>s6(wswTA6QHLHN4pBKs_Quf!vwNE}X$p&9ZE--7w#
zyFGPZF6J{9_q$+|yhQ#B|i!m+49L@?z`@ahqrIw8ZY?
z3H0t7;fFICqU5ZOsM?gTU1kfMdy4spM&i}UFN+1nSlv%_qMq
zZNb6SXg^R#&=QxaHzcXuUT6)T)t4EW)APpIlCw=ZsE%2VIY$c?m&;z2t{1{M-M_>I
zoIMAERNl&``pmcdBFVXIt1$VO@x5Yv??)gm^b@+$Vh{Osb+`)D{PpPKfY5bKe2jzT
z9#&nW-gRyI7!<@mx-{-{UH2Wg(ne0{*L22peW}Wc&79s+F??gEp*p70!CGl~>5xgU
ze5~@b=jig<-E~tJ?y24C@WK{(lel+fbo`CJ`h|1(cW!7lQgYlG%dF8KQt*mAeRo
zg-*I#U!D5b4+0AXc%<{~bV>Y5XiOoA$^rx~ftdlhE{F`I&
z|M02w$l~2id8U3Zkvp-GDuI|M`fp*}J`50%Cvs%)t^Pc$!6SNH3fBM@EF-FEkA|
zKYmW{H~2GD$8-MvoqJCS+sT^PQ2xaDO(Y7AP2Rsgy
zpMxf<{;nRKR$K_yf0I^fMsd*Nkw=?%x{DJX*G&`fQ(we=eT(0*8ZP8081b;L)_J!u
z@u(jWP+H&Q@^D488zHGUU>)n^c02*L^B_Yw<%7HAK>dHo1$g~vWOeP_@fzj=U)}`b
zlLl!M_-%0qRCxwzxNFCU1yQnSk*AaGF8G(7`%|UU(y@GHU?HO!($eW+?cEeGPf>0s
z&;hapTk(EmvZ1vbR2tsHW3(Z|7*fF+QhSw7EgTdqh(RmtMJtD4%$6Rao*tyA9ipKZ
zy5IM)G%Zw;7>Gahitr}%6X`c|fo~cvh7Oy=mg(Q@n!h>RyaFv6e4hH|DiG!-ALhhj
zDV0I=3Rx}Wb4SfQ=2L7}Od5`9C3Iky+c|j>ly_FamS*1$L~wXS-V>OB=Ey@1%D^HRJ
znxiEdd`oyYY|b^DIA)#r$vsVSHziIZRq!XH_!1;UGIhiS^!^2eAcX-{gIuQ=&qF_D
zSU&xAXp(JyGRLjyV^M0+4U@9BiRO}}V0T8LEg8yiN}oPiuPvUtP8Psh(X}B>u_ScT
z+pA|c%koi|LkFLZua1f{N#?PDv!n+IAb!6`2)x11{=(E&BN``|tbfQD&VO=WV)9)de69s~
zF^}-zy;U@n0zSh6Q20owhRK-L=VP}-y|56SO5_v7;up@qk6I|yv?Elza}u+;ik1?$2Q1us?RpQv42@715$MPs7S=(lh;(2^Om8Y;CU{W4<}IZJujBak+=LH
zp$%Ly($VJ7y<(nsKD9u*+^gw#!BSa~B$kKp$HMk`JUPYpBFVO&pNj%Ryax&dGh3`_
zMx3A@iivzmUl0`8`;^a57e7Ku^{@(~$xGJ`fHW;KTbMQsLdAqGV*Xr($zkPz66I*m
zxSfCH8z$$KXp~I4mOLhwa5j}3FO?7wdZoOn>>wxVDz}NiD$sAqjxliBh$xoD;+4-}
zPZ4s=dMm|pQDSINiTq|O9;`Z3w0_l6u3Mh><4}HLy6FDA$WJaOi=iA8EFBx^L?c&3
zc;{ey`294}IbkFxIhAkVuE4YaI@|+IE>T|yBc3dW?)-8$<#$@c@*$G*~!?$Q_l1
z2y_7D%ieX4y@gO28J;gyL(Gl#VfCfInv`4l0;7JYvjOWe_!=S&nQCq5ye(qv+5|}}w
z4(khr*)@baN|hSQ?HgJR-5Pw0!??O$_TSpTI#XTW{=
zf>K+Qbn`p*ssr*~&e?4H=sv0gj$N$&ylYjd%S5ys9k)khmGMxPKUDN>8um&pe`kIemV$Qqp(>(;g>M^;?}EpF
zy23_&j!$!CX>&*KGpfFXP)kU}OW0Vm8mOI7l4V?^328)gc~S6qf#44T{fo*|Hi;z(
z1Lhbw5gp%%UK(0%CTJP6H>VIClQxf`RrN6_F3iCSylL~
zI@O$}=$w}EoQ~g|UiO>;E{V9nkK>2AY?rK0qVw2LbuGQwwUxqaXFTKVKrOvKq2^@8
zrA#hC=DcP#_98m?LU6fP#(Qr1YJtqybB0k8H3{Q+snQ9{^BHwnNTF>^v3`c%ZFDTv
zk^v~@TTIB6Kqv*qLO*Ll`mmWwy83U)`C`YcJdKYf?Z18xc0v7qsonglb+nEUU9P2C
zZWLW^<{-1FfRxakPY9|e|
zgz4kM9Dj{-m=A9TXGpAO`H`)wXlGEMi^>&=tGkuG#W9v<<;k(BzChFhT7}Y$dn|v?B$k%?0J^ubc
zy)DrDTf$^p)_+^R!_clC#bj<<^>JIBdPh@iN6TbK$A3pJXUCvp$7pTGsk0-S{3*em`lvu1$jvil^h4
zPI>mrWtf_EETvZiaI7Rv_bmEyG3(ZW3{CV6PUjnh*t4b^sR|4CfK)fbqs^?*gZ-k
zG-hG5{BAM^ty(?lbS|^z;AJKGO|@|!L8>SRXgponJ7NmmahmzX?LKFMdv{ch3CBhb8yizVV#h$&%;x
z9B^>X{l|=JB2Dl758_#ZWaxgz*2RhPzD45+H-=ToJ8+e%l>#UIEBIG>)+yybr|6YT
zBBED$;|F@{R!W`G+5uNNHdp=K@w~X#Hq7G+*9kF>spe!F0gjnwgvW~#@XprL&6CcQ?T)sc8qtDbnaD>!ZmN@
zX_$CM6lZFA4&~}8^KaE@w%ddK4qB-fTKgPOA4|*jS-Q++OEHnvFp|CO
zdSLZJrgT{{92t(YC6sH`QKQ^m?ACS^}LW;3o5C}3
zlxJLLBB(?kox83{E!Al7+3Nq~g5{;TWJq+O$bW-Qnb6+p#|S&R>w&xK`p|hcyALmX
zFI^<45&C9>X!m7%y?Ai58ihBxA>3lG<$!ntmw-(IfDV?T<`Ctx_tS&)L5yGIIfF0%
z(lEkBMSzO@>mfuvtTObD<+zwh3GF^u=0z&B>-R(|Jid%Pqg12OKn6-6>JfWW$qSAO@igjN=c3{3`zFV5Evl{;@TwB!?KCbEVi%rwSyfV1
z4_rB4a%%zMMor(jyp2B2KT|nz`>5L9udD5RaCxO&ls=a@>Kmo`Z#8IHMsJLfR}?rY
zi961}W&F>te%(cGB6ku4qx`gQLUt*vAou;$q5+{JjLi8n^PA|#
zf5VOq%*zT@m07b^Ux0AU)i_TN{#mb3c-R`HuFW5HYi5kBX_>22V4T1A3w151pfzO7#EYv!S^>;ha
zNtS36MPc4!)C%o;Uv7nRM7gVxYGW%2AolkASWUL}hT_;$wYPJK1aGzTxxwO3rE
zPl(y;)!l_)(;(W`gf|54Kc4mTIn+6ETsvJp*A>&Rn8^v~8Nsfl4=|d82V@{nF$4g7
ze+=qeO_K)rKD;8LvL#>v*GI{F~9cFI&rGC0l%wg!AS8GcD_w>oYA)L2=fxqicEJN(xsv97NkL
zvae$WTB#rZgs}&2e9akbOiFO@*&I#0a+4KiaK#JLIHts_xM3zDtg<<&AbFS<82n+(
z75=%T8|p^PxQM;ZEap{)?;A+3x#sX%
z@?Q+T7pBOTf9YbE%wvT!$~`GIXLujafod4A&cXCM!b9M)FUHIZ@G5t&o76OHjr3PSq>Z&FmeMps+7#EQwsuulKSza~?66D1l-kO;
z;z_Yy%i@;45hF>+7_KkQlb!FM<{?l~7qJuSwd-??ZSYctC*+KNjnGusJu1ea+j})Z
zCMt2oQ*=JE#PnNVmfW2ajHtIZ^qn6*cd1TeQi2wXEY265{>`@`qQA!};|O_MTYOvd
zw&qkQKEnUf`o18mPu4zeI%B?p)!^hqx5v-|*89d7M%La_OdZpgHlHoDj=+-k3(75S
z&5ErYSQ<+LIiQ)6DoZByC7HRYl&U6SO3jZcEez!bUtCi%S7L0u^#V;ioc;RrbmMNd
zJ74_pfQjhy-=dE9#khMoiLMz$Sc`zGwKI=eQuRGwkJT5m|ID7YR|t45d|>{%`qa`^
z^x5&d$q2O1F`;`xoDO1E=96E~*^kKrJU)$mzN|z3H)EGqI~FHgxK=1Vp`kTAHYYEc
zXe*;Ap~1ug#GZ~6@G@`2EHr&zX{@YrLnF!a_Z{ANr)N)Z#5Dqf&S+iF|1^W!x~aX@
z&k^fuA%CohtEZUvbZ@Ha6nWPHGSZ6i)~=LS-O{@!H+7nBQoc5R?SEgfet*8uNhMpH
z>iBj$+5ih=lvVfIYDi5(VzEZ9h(5F*wHSvVr`KkFx9IkG6Zj7}mfHWe^W|5IphK_5
zEaTrLQ-i#b@fmqSFSsKt3Q97e|Y46$*rIJ&De8nhbZH~W$0GYBro
zgy{#n37h6;KXft`*cHz-vizvnJ(Bzg`Kbf{c2QCbH9cUCZ3!j6a8Jrw0$el
zcBGRGG>;wo+E}~v?$@Dd-IDvhmRqn?ao;kUVh4F$UGW*1S@b!%3a&LxH$QG|XqvAt
z>I>(t3PD~+&OdYmuWT8JaL$^sM1lprxE1YD9&BkY_RP=Lw{VP^aW@jdl8bmO4+Pb~
znXI|PN6ql&c5QDoin(6@^A1NxMI(mQ0~$@CAs4Kp65VXE{?mW4zLZ6122?*a5Dg4@
zO^Y0vMxRr`*57}ux&7#Ub-ZeFiq*Y(Y%iI%Vr6~V5}JIPd1MSbX%w2rK5^o=2X9d)
zdgbGq>;-GL$>HlB_rh1M(c1kgb{;8P>vdHG?>bqKWmgd^^L<>TXZ7rEM5s5p4*_4>`AT*qJ2dbe$!_1lRsvCA43
z$nad>-NK;%bwj7$sptCrI(ooOzqtQ-+WN!Z4+SYgAiVFgz_Z<{RrEB^e`95e3-&t3
z9t(xyJIw0+CMibThIsB!4B!C=cGkHc^?`s6
z=ekwAtS-9q1I7#K57D&UK^R?xS=dBe5smmbufY;OOEb^uFtBDZeh0-6wPF0;40|r!
zy`UZyJ}E&5ji9;gj+*TJ4evsKNr{8^ApUTHQo-
ztfR%oN$!3N!$bsk1KE2!Y&w|wqM<#|zKy1p8>~wF=uFz)31?hRu#~WJFK=J?`+AA&
z_q|;=5#sF9?KV=(&`t@vXu+%)uyZjAr6kdD4>4u;&n{_S+OC{xNe;INx;Dvx@DGL>
z()1#dygWT{Vd?l%X$GDgZHEt;>M|?Ny)WxK-=Iq1Zugs9_Al9B$tq*LdFb?=46~3P
zu+$o`vK#=p4OoW^*d!0w77p0e57_q&ILr<>&JKtX^H$#VI};DOFb?i4_q$3Dx@pO+
z&hk`OV@{$F)EtP4i?~a7xv*sC1Z7+VU|ECV{V4qt0PZcl+X*a8ZM=p
zn!_7m3XM35U8KDzme?Ocuu3mwf3u8KZzmRp^u;sE#UFQeYbh78z;IkhMxDjWZ6Zhe
zV6a)(7U{vsl9vdVc-?WsgVI2Q0t@?XWu2y+`*KK@QZ+rtheo#0L6&gD18$X_n-k%*m
zy;MzX8~;N*@fS6}H(B*udLnRp{L)hG&}ia1WMUgUaZ{+anWZ-TonW6~=uSHJA-V$|
zA}dui
zyi=BeEvjP`#o(n#kr7AXtVR=&w7i^)#!H!`XOtFclL`scAdXS*OO`-@HL79pFZyRD
zO!Xx`@boc|L{RNa&8cg|Iz+tMiKc3wcqW5S@t+UEIT3d^=s%Y8@Dl_U#+Uqy7nljq+dgHb=
zUv=E)bVKL#Qs(rF<_sF<4EyJd=H`rd=1i{UOwr~)k<6PlXa^h3TFA^>YR_9)&4b1|
rd@wKobdOXP4z|wR*0vzp_wV@ManqW6)9QOzeW6viwRX310|@^Q2&Nd(
diff --git a/bin/reportlab/docs/images/Python_21.gif b/bin/reportlab/docs/images/Python_21.gif
deleted file mode 100644
index 1d6892e074fa69f1d5154b9c0f7eeb7a856f47c3..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 28106
zcmW(+2{e@7`=13fW0@KI&e*qP8#2~0_BA^Z*_SMhT_`j5-Cz=u#!gwwzSP*25{X2~
z7Ak}|8qX?J@?%6KF_`9Ztppt=Xni{4OFkV8v-MN$AJF<3P3{t2O%Vs3kj7%
za&aMrgpg8FTu>7(E+H6Nih%;gWDB
zo;Z_OoRc-q(;64+WWrT#BIIPE05!oWnBZbfaAXq`oQa9GiOIjpKbD$Ums(4eS}S0z
zFm+L@Yip+fYfn$>umC6Pe@t?+E_JeQ{~!OslkBN5>4~ZK#34Pc
zlRT}-p4Qc#|HHrXAKN`WM+0!=0NiANNq>M7;Qw6&1bC7I{)gCrFmgaxb(l#&m`Q(_
zlR}u2NthEk%+vEiv9ay3v7@oEo3TlyNnxc)vBybCu}MjDNlBYY
zNk5aaN|UM^lln`OMys;|F0#T*vcdwg{`HYmot4y{l{A|5Ka^%={mg2tCWnQQ!%E4q
z*5ufJa#9#MtDl@TO3s=ill#f!V{&OJxwN0$-dLKoRGRg(^naKvEnO;|tgg;lswOM^
zv#%ykR+k=ESGQMJ_gA+!R`<96k4x>1{{~TN(pXyESpAQ4jn&7EjirtM&|clx-rk<|
zkH_s~&vtTSJGs5RG^xGxpNoH%lmBl#*WUh*o9*q#{iRF&?biM6js5-oqos4BjY*@8
zrK9axqy3Ge|HJ0!=<(>}-00@gWOdkNfA!?t=3L|4TzlADd)8e4@!Y8A++^6?-}$Q(d2e#^D$|~oj+Y4E
zUb@shv1#VB+6-fxCYW*s~tDtPW+f^7?E?E3OU_q)h1=
z9QM8r{CIvOL)+xih2JTgU06*t(T@6Y(5Nfy_JIv7%0^X28NvynUtdEB#K(~sK>h)2
zd?1&WfOWV#(edMQ2~aM|lK~_zdjsR2EpmLpj_B(9^55EPqE
z=DNyLbkzK-$QoKw-l--FX=3Tu@A?U4>sfd@pheU6-m3TpHPhX{{LclSXy1G2bmwnY!?@rF!>QcXNMh
z&o#f^=)1lC6C|icPAwPq9z5uouy~cPwh%lVe-JD8JZ1L}eq{ew
z;AVf4z{1<{2l>v;L%H^5{#8N~zhxhttDPQ{^MGA;A919bNlw|+_SI{Jr!dy0$c(>4
z!7kXqD%+D_Io`&JWHK}}$8$*$4fZQ(xMZu>CV*>2?c;Gs6B
z&nlGm>xqrtX8vNZ##VvzkL2C-(ZU@8mcYl+`vk#Tf0xwaY$m?dKB;jMgHWF{(fT|;
z&))t}8?Sj(@ZrsKksRdO$YrveMgMZylb=z4V*k6*|A(A7BvPb6>%Gz(b}=D%zPq9Q
z_oxxFpziW*(5lDR76e=km?~!D=aTib05eI^mPi
zR8hoPBB&Uf?6Nw?<+K9=snC>vzTo0iWlM8RXvO{@c?rXE~K~xC^di)SB{PK_A5Z*1KG0d4ddk
zq*h9(B84aD(M3i5bj5~T0fQGs98qLj{!X^Qh<(HQH^jDI-|n$lw!hsKlbL|skci);
z6d+B9Wifro6QAsA?R)~Zt;Q~xroG0Tecg~g3!ACIUgiAdX5V9$d(DJ?F9)X6@rbOe
zA>K?4x;wtw0O`p1uuAffxal*x-S+at2(OcQp=_w6WNWU=7v%j;)nL8lwo7RMhUX*n
z-oT?~|A(V|Vz1OUFGdVh&hbIKy0KTFkLe;L8}-H5hI9NZu>c>yj`wZeZvUbIi@8-p
zW<{$-{RTH$OQgOy4S;a-Z$$S~vaIKr`cgzRu{)x7&EG^V%Qw)2>w)7#LEy`QTNMuV
zFuw0Loa0?C01wW5$_-2YOxvsCPpLWCbgkP_=!46_{Kl#`t@-~P21lGZ<-;rk}xXHfu>4bSDzQHp`h3&O=
zjgE(Ub@LscmKE3FdCa8UfZ+6=@Ztt4TSy%@s>Q+1vdyt7oFC0E1lPlCjN;@xx!Lt1
zeIlqsCfo^TLoKCkz4zYwtVx_I!
zVFB4xjxa2)-8Sn>C!GcJc}uEdgB=)-Uj_+uQEAndfru(9khhMgc@~lrhArrRI4ZC5
z_0QNrHLS3v#-#~#g;u&Dk)!Y=MJ#%N$ut`Ld0BEqmZ}5sWfNg{>G*H8l#-xNp@Jgu
zdTl!dA`gWMl$@v1UD_kcn>|R&gjYYhn%)!Gp|8^=+#{B>nsQR
z9>7$3m{<$zt!*@Ce3K_UtS_8-eY88mXi#u@;3mH*N#leznE(A}S%x#_Gz=vneRyw-
z<>U8Uv%}Ea%kHr#$_fJ0#Yz{7r`yRhD7GWUV*^OTa7^|^%WUL9r;JzZNmlYOjr5=itcLd;X&-57iEj6Yf;
zc|bsBDq^=Y#0Wx!=($eaL(H^z53M6eZalw`@LE5f9ROU^+j>Zz(Ud}~NwF_zLHzRK
z*#^K*!mkby=x)fwWa(>i%F!(
zHuuWrAm)GUQi(pgTQQO-qndH!nkB`P-|1nKc8A`uF`lleyc>1>P{Gn%bqN?V7ZU*m`+Cvh
zf)|2>EgKTCGBP*S*;*i8huRp7yU_^ZPv?!oYhkl%h$(>El3jghr8woViu508jz!~a
zxhlL~+h)qKG)k7$sXVySJYOD?$`fz$wf^b%fT#j>7gmXLf)z;==%oxfCCP_#KdFKKwy)9`wsVe+(Lil_0NbR)P`HNHeTvr_hmm3v?{g!w@HO@(ypfcgvo2*PK(
zQpAlb)qjCqbXhO``+gVylpPtFZIagM~)G1+R-VgG&WV
zLu3f&(-jTHR1Rj8yhA6#ud^!L02jI^vpXf(L*IgvY0*<}GjMJ*ifzNGqkn$q|3N`i
z%hQqMVNFsD5dhf8GW-<4JNe&J=64#5Mf@JT4IVNb{a((DHXTty(gD4yyCrS-Cv73>
zouLy?cX^)i;CyqizM7`Kmsn8Yg)s4qh*){ZIz14i#555W;Xr~BkWj*2mp0br(m_-2
zLGxLHlG?NG(#7twKiw4Go{C;HdjY@uEG!fY**7AYPl44?P{_VG5etfDaOc<(52b>x
zC)M;~`F;SH