summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordkuhlman <dkuhlman@929543f6-e4f2-0310-98a6-ba3bd3dd1d04>2019-02-12 22:22:18 +0000
committerdkuhlman <dkuhlman@929543f6-e4f2-0310-98a6-ba3bd3dd1d04>2019-02-12 22:22:18 +0000
commit163799700e89093b294942f69b73e3646e4ecf18 (patch)
tree9d57e92ae764f3fbfac0bc5c4c9605275f757a0b
parentd61dbb6c26017dca422117ce7cda7215f265c28a (diff)
downloaddocutils-163799700e89093b294942f69b73e3646e4ecf18.tar.gz
Converted odf_odt for compatibility with both Python 2 and Python3
git-svn-id: http://svn.code.sf.net/p/docutils/code/trunk@8248 929543f6-e4f2-0310-98a6-ba3bd3dd1d04
-rw-r--r--docutils/docutils/writers/odf_odt/__init__.py81
-rwxr-xr-xdocutils/test/test_writers/test_odt.py7
2 files changed, 48 insertions, 40 deletions
diff --git a/docutils/docutils/writers/odf_odt/__init__.py b/docutils/docutils/writers/odf_odt/__init__.py
index f40113430..0a77f9e82 100644
--- a/docutils/docutils/writers/odf_odt/__init__.py
+++ b/docutils/docutils/writers/odf_odt/__init__.py
@@ -1,5 +1,5 @@
# $Id$
-# Author: Dave Kuhlman <dkuhlman@rexx.com>
+# Author: Dave Kuhlman <dkuhlman@davekuhlman.org>
# Copyright: This module has been placed in the public domain.
"""
@@ -20,9 +20,14 @@ import zipfile
from xml.dom import minidom
import time
import re
-import StringIO
+if sys.version_info.major >= 3:
+ from io import StringIO
+ from urllib.request import urlopen
+ from urllib.error import HTTPError
+else:
+ from StringIO import StringIO
+ from urllib2 import urlopen, HTTPError
import copy
-import urllib2
import itertools
import docutils
try:
@@ -41,18 +46,18 @@ try:
#from lxml import etree
#WhichElementTree = 'lxml'
raise ImportError('Ignoring lxml')
-except ImportError, e:
+except ImportError as e:
try:
# 2. Try to use ElementTree from the Python standard library.
from xml.etree import ElementTree as etree
WhichElementTree = 'elementtree'
- except ImportError, e:
+ except ImportError as e:
try:
# 3. Try to use a version of ElementTree installed as a separate
# product.
from elementtree import ElementTree as etree
WhichElementTree = 'elementtree'
- except ImportError, e:
+ except ImportError as e:
s1 = 'Must install either a version of Python containing ' \
'ElementTree (Python version >=2.5) or install ElementTree.'
raise ImportError(s1)
@@ -62,9 +67,13 @@ except ImportError, e:
try:
import pygments
import pygments.lexers
- from pygmentsformatter import OdtPygmentsProgFormatter, \
- OdtPygmentsLaTeXFormatter
-except (ImportError, SyntaxError), exp:
+ if sys.version_info.major >= 3:
+ from .pygmentsformatter import OdtPygmentsProgFormatter, \
+ OdtPygmentsLaTeXFormatter
+ else:
+ from pygmentsformatter import OdtPygmentsProgFormatter, \
+ OdtPygmentsLaTeXFormatter
+except (ImportError, SyntaxError) as exp:
pygments = None
# check for the Python Imaging Library
@@ -299,7 +308,7 @@ def SubElement(parent, tag, attrib=None, nsmap=None, nsdict=CNSD):
def fix_ns(tag, attrib, nsdict):
nstag = add_ns(tag, nsdict)
nsattrib = {}
- for key, val in attrib.iteritems():
+ for key, val in list(attrib.items()):
nskey = add_ns(key, nsdict)
nsattrib[nskey] = val
return nstag, nsattrib
@@ -309,12 +318,12 @@ def add_ns(tag, nsdict=CNSD):
nstag, name = tag.split(':')
ns = nsdict.get(nstag)
if ns is None:
- raise RuntimeError, 'Invalid namespace prefix: %s' % nstag
+ raise RuntimeError('Invalid namespace prefix: %s' % nstag)
tag = '{%s}%s' % (ns, name,)
return tag
def ToString(et):
- outstream = StringIO.StringIO()
+ outstream = StringIO()
if sys.version_info >= (3, 2):
et.write(outstream, encoding="unicode")
else:
@@ -683,7 +692,7 @@ class Writer(writers.Writer):
localtime = time.localtime(time.time())
zinfo = zipfile.ZipInfo(name, localtime)
# Add some standard UNIX file access permissions (-rw-r--r--).
- zinfo.external_attr = (0x81a4 & 0xFFFF) << 16L
+ zinfo.external_attr = (0x81a4 & 0xFFFF) << 16
zinfo.compress_type = compress_type
zfile.writestr(zinfo, bytes)
@@ -694,7 +703,7 @@ class Writer(writers.Writer):
continue
try:
zfile.write(source, destination)
- except OSError, e:
+ except OSError as e:
self.document.reporter.warning(
"Can't open file %s." % (source, ))
@@ -895,7 +904,7 @@ class ODFTranslator(nodes.GenericNodeVisitor):
document.reporter)
self.format_map = {}
if self.settings.odf_config_file:
- from ConfigParser import ConfigParser
+ from configparser import ConfigParser
parser = ConfigParser()
parser.read(self.settings.odf_config_file)
@@ -995,7 +1004,7 @@ class ODFTranslator(nodes.GenericNodeVisitor):
s2 = zfile.read('content.xml')
zfile.close()
else:
- raise RuntimeError, 'stylesheet path (%s) must be %s or .xml file' %(stylespath, extension)
+ raise RuntimeError('stylesheet path (%s) must be %s or .xml file' %(stylespath, extension))
self.str_stylesheet = s1
self.str_stylesheetcontent = s2
self.dom_stylesheet = etree.fromstring(self.str_stylesheet)
@@ -1118,13 +1127,13 @@ class ODFTranslator(nodes.GenericNodeVisitor):
def setup_paper(self, root_el):
try:
fin = os.popen("paperconf -s 2> /dev/null")
- w, h = map(float, fin.read().split())
+ w, h = list(map(float, fin.read().split()))
fin.close()
except:
w, h = 612, 792 # default to Letter
def walk(el):
if el.tag == "{%s}page-layout-properties" % SNSD["style"] and \
- not el.attrib.has_key("{%s}page-width" % SNSD["fo"]):
+ "{%s}page-width" % SNSD["fo"] not in el.attrib:
el.attrib["{%s}page-width" % SNSD["fo"]] = "%.3fpt" % w
el.attrib["{%s}page-height" % SNSD["fo"]] = "%.3fpt" % h
el.attrib["{%s}margin-left" % SNSD["fo"]] = \
@@ -1187,7 +1196,7 @@ class ODFTranslator(nodes.GenericNodeVisitor):
elcustom = self.create_custom_headfoot(el2,
self.settings.custom_footer, 'footer', automatic_styles)
- code_none, code_field, code_text = range(3)
+ code_none, code_field, code_text = list(range(3))
field_pat = re.compile(r'%(..?)%')
def create_custom_headfoot(self, parent, text, style_name, automatic_styles):
@@ -1203,12 +1212,12 @@ class ODFTranslator(nodes.GenericNodeVisitor):
'd1', 'd2', 'd3', 'd4', 'd5',
's', 't', 'a'):
msg = 'bad field spec: %%%s%%' % (item[1], )
- raise RuntimeError, msg
+ raise RuntimeError(msg)
el1 = self.make_field_element(parent,
item[1], style_name, automatic_styles)
if el1 is None:
msg = 'bad field spec: %%%s%%' % (item[1], )
- raise RuntimeError, msg
+ raise RuntimeError(msg)
else:
current_element = el1
else:
@@ -1581,7 +1590,7 @@ class ODFTranslator(nodes.GenericNodeVisitor):
return el
def encode(self, text):
- text = text.replace(u'\u00a0', " ")
+ text = text.replace('\n', " ")
return text
#
@@ -1735,7 +1744,7 @@ class ODFTranslator(nodes.GenericNodeVisitor):
if self.settings.generate_oowriter_toc:
pass
else:
- if node.has_key('classes') and \
+ if 'classes' in node and \
'auto-toc' in node.attributes['classes']:
el = SubElement(self.current_element, 'text:list', attrib={
'text:style-name': self.rststyle('tocenumlist'),
@@ -2184,7 +2193,7 @@ class ODFTranslator(nodes.GenericNodeVisitor):
destination = 'Pictures/1%08x%s' % (self.image_count, filename, )
if source.startswith('http:') or source.startswith('https:'):
try:
- imgfile = urllib2.urlopen(source)
+ imgfile = urlopen(source)
content = imgfile.read()
imgfile.close()
imgfile2 = tempfile.NamedTemporaryFile('wb', delete=False)
@@ -2192,7 +2201,7 @@ class ODFTranslator(nodes.GenericNodeVisitor):
imgfile2.close()
imgfilename = imgfile2.name
source = imgfilename
- except urllib2.HTTPError, e:
+ except HTTPError as e:
self.document.reporter.warning(
"Can't open image url %s." % (source, ))
spec = (source, destination,)
@@ -2239,7 +2248,7 @@ class ODFTranslator(nodes.GenericNodeVisitor):
unit = '%'
else:
size, unit = self.convert_to_cm(size)
- except ValueError, exp:
+ except ValueError as exp:
self.document.reporter.warning(
'Invalid %s for image: "%s". '
'Error: "%s".' % (
@@ -2358,7 +2367,7 @@ class ODFTranslator(nodes.GenericNodeVisitor):
page_width, _ = self.convert_to_cm(page_width)
margin_left, _ = self.convert_to_cm(margin_left)
margin_right, _ = self.convert_to_cm(margin_right)
- except ValueError, exp:
+ except ValueError as exp:
self.document.reporter.warning(
'Stylesheet file contains invalid page width '
'or margin size.')
@@ -2408,7 +2417,7 @@ class ODFTranslator(nodes.GenericNodeVisitor):
el2 = SubElement(el1, 'style:text-properties',
attrib=attrib, nsdict=SNSD)
style_name = 'rstframestyle%d' % self.image_style_count
- draw_name = 'graphics%d' % IMAGE_NAME_COUNTER.next()
+ draw_name = 'graphics%d' % next(IMAGE_NAME_COUNTER)
# Add the styles
attrib = {
'style:name': style_name,
@@ -2513,7 +2522,7 @@ class ODFTranslator(nodes.GenericNodeVisitor):
attrib['style:wrap'] = 'none'
el2 = SubElement(el1,
'style:graphic-properties', attrib=attrib, nsdict=SNSD)
- draw_name = 'graphics%d' % IMAGE_NAME_COUNTER.next()
+ draw_name = 'graphics%d' % next(IMAGE_NAME_COUNTER)
# Add the content.
#el = SubElement(current_element, 'text:p',
# attrib={'text:style-name': self.rststyle('textbody')})
@@ -2906,7 +2915,7 @@ class ODFTranslator(nodes.GenericNodeVisitor):
if 'odt' in formatlist:
rawstr = node.astext()
attrstr = ' '.join(['%s="%s"' % (k, v, )
- for k,v in CONTENT_NAMESPACE_ATTRIB.items()])
+ for k,v in list(CONTENT_NAMESPACE_ATTRIB.items())])
contentstr = '<stuff %s>%s</stuff>' % (attrstr, rawstr, )
if WhichElementTree != "lxml":
contentstr = contentstr.encode("utf-8")
@@ -2933,7 +2942,7 @@ class ODFTranslator(nodes.GenericNodeVisitor):
def visit_reference(self, node):
text = node.astext()
if self.settings.create_links:
- if node.has_key('refuri'):
+ if 'refuri' in node:
href = node['refuri']
if ( self.settings.cloak_email_addresses
and href.startswith('mailto:')):
@@ -2943,7 +2952,7 @@ class ODFTranslator(nodes.GenericNodeVisitor):
'xlink:type': 'simple',
})
self.set_current_element(el)
- elif node.has_key('refid'):
+ elif 'refid' in node:
if self.settings.create_links:
href = node['refid']
el = self.append_child('text:reference-ref', attrib={
@@ -2960,7 +2969,7 @@ class ODFTranslator(nodes.GenericNodeVisitor):
def depart_reference(self, node):
if self.settings.create_links:
- if node.has_key('refuri'):
+ if 'refuri' in node:
self.set_to_parent()
def visit_rubric(self, node):
@@ -3208,8 +3217,8 @@ class ODFTranslator(nodes.GenericNodeVisitor):
#
# I don't know how to implement targets in ODF.
# How do we create a target in oowriter? A cross-reference?
- if not (node.has_key('refuri') or node.has_key('refid')
- or node.has_key('refname')):
+ if not ('refuri' in node or 'refid' in node
+ or 'refname' in node):
pass
else:
pass
@@ -3452,7 +3461,7 @@ class ODFTranslator(nodes.GenericNodeVisitor):
def generate_admonition(self, node, label, title=None):
if hasattr(self.language, 'labels'):
- translated_label = self.language.labels[label]
+ translated_label = self.language.labels.get(label, label)
else:
translated_label = label
el1 = SubElement(self.current_element, 'text:p', attrib={
diff --git a/docutils/test/test_writers/test_odt.py b/docutils/test/test_writers/test_odt.py
index e50baed9e..1afbf68b8 100755
--- a/docutils/test/test_writers/test_odt.py
+++ b/docutils/test/test_writers/test_odt.py
@@ -32,7 +32,6 @@ Instructions for adding a new test:
import sys
import os
-import StringIO
import zipfile
from xml.dom import minidom
import tempfile
@@ -60,18 +59,18 @@ class DocutilsOdtTestCase(DocutilsTestSupport.StandardTestCase):
#from lxml import etree
#WhichElementTree = 'lxml'
raise ImportError('Ignoring lxml')
- except ImportError, e:
+ except ImportError as e:
try:
# 2. Try to use ElementTree from the Python standard library.
from xml.etree import ElementTree as etree
WhichElementTree = 'elementtree'
- except ImportError, e:
+ except ImportError as e:
try:
# 3. Try to use a version of ElementTree installed as a separate
# product.
from elementtree import ElementTree as etree
WhichElementTree = 'elementtree'
- except ImportError, e:
+ except ImportError as e:
s1 = '\nSkipped test of odf_odt writer. ' \
'In order to test odf_odt writer ' \
'must install either a version of Python containing ' \