[Sugar-devel] [PATCH InfoSlicer] Change encoding to UTF8 SL #3607

Walter Bender walter.bender at gmail.com
Tue May 15 15:01:44 EDT 2012


On Tue, May 15, 2012 at 2:50 PM, Manuel Kaufmann <humitos at gmail.com> wrote:
> I had to change the encoding to UTF8 of xol.py because it was DOS and
> the "genpot" command from setup.py (xgettext) was failing with string
> with multiple lines. So, it was detecting just the first line of the
> multiple lines strings and then the translation string weren't
> matching with the source code strings.

Not sure what you did. I would have assumed that simply adding

# -*- coding: utf-8 -*-

to the top of the file would have fixed the problem.

-walter
>
> Signed-off-by: Manuel Kaufmann <humitos at gmail.com>
> ---
>  xol.py |  416 ++++++++++++++++++++++++++++++++--------------------------------
>  1 file changed, 208 insertions(+), 208 deletions(-)
>
> diff --git a/xol.py b/xol.py
> index bbe2ce5..d4774ef 100644
> --- a/xol.py
> +++ b/xol.py
> @@ -1,208 +1,208 @@
> -# Copyright (C) IBM Corporation 2008
> -#
> -# 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 2 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, write to the Free Software
> -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
> -
> -import os
> -import gtk
> -import zipfile
> -import uuid
> -import logging
> -from glob import glob
> -from gettext import gettext as _
> -
> -from sugar.activity.activity import get_bundle_path, get_activity_root, get_bundle_name
> -from sugar.datastore import datastore
> -from sugar import activity
> -
> -from infoslicer.processing.NewtifulSoup import NewtifulStoneSoup \
> -        as BeautifulStoneSoup
> -import book
> -
> -logger = logging.getLogger('infoslicer')
> -
> -def publish(activity, force=False):
> -    if not [i for i in book.custom.index if i['ready']]:
> -        activity.notify_alert(
> -                _('Nothing to publish'),
> -                _('Mark arcticles from "Custom" panel and try again.'))
> -        return
> -
> -    title = activity.metadata['title']
> -    jobject = datastore.find({
> -            'activity_id': activity.get_id(),
> -            'activity'   : book.custom.uid})[0] or None
> -
> -    logger.debug('publish: title=%s jobject=%s force=%s' \
> -            % (title, jobject and jobject[0].metadata['activity'], force))
> -
> -    if jobject:
> -        if force:
> -            jobject = jobject[0]
> -        else:
> -            try:
> -                # check for 0.84 code
> -                from jarabe import config
> -            except:
> -                # 0.82 couldn't override .xol bundles
> -                activity.notify_alert(
> -                        _('Bundle exists'),
> -                        _('A bundle by "%s" name already exists. Please ' \
> -                        'click "Erase" in the Journal. You can click ' \
> -                        '"Publish" again afterwards.') % \
> -                        jobject[0].metadata['title'])
> -                return
> -
> -            activity.confirmation_alert(
> -                    _('Overwrite existed bundle?'),
> -                    _('A bundle for current object was already created. ' \
> -                          'Click "OK" to overwrite it.'),
> -                    publish, activity, True)
> -            jobject[0].destroy()
> -            return
> -    else:
> -        jobject = datastore.create()
> -        jobject.metadata['activity_id'] = activity.get_id()
> -        jobject.metadata['activity'] = book.custom.uid
> -        jobject.metadata['mime_type'] = 'application/vnd.olpc-content'
> -        jobject.metadata['description'] = \
> -                'This is a bundle containing articles on %s.\n' \
> -                'To view these articles, open the \'Browse\' Activity.\n' \
> -                'Go to \'Books\', and select \'%s\'.' % (title, title)
> -
> -    book.custom.sync_article()
> -    book.custom.revision += 1
> -
> -    jobject.metadata['title'] = title
> -    _publish(title, jobject)
> -    jobject.destroy()
> -
> -    book.custom.sync_index()
> -
> -"""
> - at author: Matthew Bailey
> -
> -This class deals with the creation of content packages, comprised of articles from
> -themes, with are zipped up and installed in the relevant OS specific location. From
> -here they can be distributed to the consumers
> -"""
> -def _publish(title, jobject):
> -    zipfilename = '/tmp/infoslicer.xol'
> -    zip = zipfile.ZipFile(zipfilename, 'w')
> -
> -    uid = book.custom.uid
> -
> -    for i in glob(os.path.join(get_bundle_path(), 'Stylesheets', '*')):
> -        zip.write(i, os.path.join(uid, 'slicecontent', os.path.basename(i)))
> -
> -    _info_file(zip, uid, title)
> -    _index_redirect(zip, uid)
> -    _dita_management(zip, uid, title)
> -
> -    zip.close()
> -
> -    jobject.set_file_path(zipfilename)
> -    datastore.write(jobject, transfer_ownership=True)
> -
> -def _dita_management(zip, uid, title):
> -    """
> -        Creates a DITA map, and copies the requested articles and their associated images into the zipped directories
> -    """
> -    map = [ '<?xml version=\'1.0\' encoding=\'utf-8\'?>',\
> -            '<!DOCTYPE map PUBLIC "-//IBM//DTD DITA IBM Map//EN" ' \
> -                    '"ibm-map.dtd">',\
> -            '<?xml-stylesheet type="text/xsl" href="mapstylesheet.xsl"?>',\
> -            '<map title="%s">' % title ]
> -
> -    images = {}
> -
> -    for entry in book.custom.index:
> -        if not entry['ready']:
> -            continue
> -
> -        atitle = entry['title']
> -        auid = entry['uid']
> -
> -        content = BeautifulStoneSoup(book.custom._load(auid))
> -
> -        for image in content.findAll('image'):
> -            image_path = book.wiki.root + '/' + image['href']
> -            image_name = os.path.basename(image_path)
> -            image_ext = os.path.splitext(image_name)[1]
> -
> -            image_num = images.get(image_name, len(images))
> -            images[image_name] = image_num
> -            image_name = ('%08d%s' % (image_num, image_ext)).encode('CP437')
> -
> -            zip.write(image_path, os.path.join(uid, 'slicecontent', image_name))
> -            image['href'] = image_name
> -
> -        content.insert(1, '<?xml-stylesheet type="text/xsl" ' \
> -                'href="ditastylesheet.xsl"?>')
> -        zipstr(zip, os.path.join(uid, 'slicecontent', '%s.dita' % auid),
> -                content.prettify())
> -
> -        map.append('<topicref href="%s.dita" navtitle="%s">' % (auid, atitle))
> -        map.append('</topicref>')
> -
> -    map.append('</map>')
> -    zipstr(zip, os.path.join(uid, 'slicecontent', 'librarymap.ditamap'),
> -            "\n".join(map))
> -
> -def _index_redirect(zip, uid):
> -    """
> -        Creates the redirecting index.html
> -    """
> -    redirect_loc = 'slicecontent/librarymap.ditamap'
> -
> -    html = ['<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">',\
> -            '<html>',\
> -            '<head>',\
> -            '<title>Redirecting to index</title>',\
> -            '<meta http-equiv="REFRESH" content="0;url=%s">' % redirect_loc,\
> -            '</head>',\
> -            '<body>',\
> -            '</body>',\
> -            '</html>']
> -
> -    zipstr(zip, os.path.join(uid, 'index.html'), "\n".join(html))
> -
> -def _info_file(zip, uid, title):
> -    """
> -        Creates the library.info file
> -    """
> -    libraryfile = ['[Library]',\
> -                   'name = %s' % title,\
> -                   'bundle_class = %s' % uid,\
> -                   'global_name = info.slice.%s' % title,\
> -                   'long_name = %s' % title,\
> -                   'library_version = %d' % book.custom.revision,\
> -                   'host_version = 1',\
> -                   'l10n = false',\
> -                   'locale = en',\
> -                   'category = books',\
> -                   'subcategory = slice',\
> -                   'icon = book.png',\
> -                   'activity = Web',\
> -                   'activity_start = index.html']
> -
> -    zipstr(zip, os.path.join(uid, 'library', 'library.info'),
> -            "\n".join(libraryfile))
> -
> -# XXX setup mode_t for files written by writestr()
> -def zipstr(zip, arcname, str):
> -    import copy
> -    zipinfo = copy.copy(zip.infolist()[0])
> -    zipinfo.filename = arcname
> -    zip.writestr(zipinfo, str)
> +# Copyright (C) IBM Corporation 2008
> +#
> +# 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 2 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, write to the Free Software
> +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
> +
> +import os
> +import gtk
> +import zipfile
> +import uuid
> +import logging
> +from glob import glob
> +from gettext import gettext as _
> +
> +from sugar.activity.activity import get_bundle_path, get_activity_root, get_bundle_name
> +from sugar.datastore import datastore
> +from sugar import activity
> +
> +from infoslicer.processing.NewtifulSoup import NewtifulStoneSoup \
> +        as BeautifulStoneSoup
> +import book
> +
> +logger = logging.getLogger('infoslicer')
> +
> +def publish(activity, force=False):
> +    if not [i for i in book.custom.index if i['ready']]:
> +        activity.notify_alert(
> +                _('Nothing to publish'),
> +                _('Mark arcticles from "Custom" panel and try again.'))
> +        return
> +
> +    title = activity.metadata['title']
> +    jobject = datastore.find({
> +            'activity_id': activity.get_id(),
> +            'activity'   : book.custom.uid})[0] or None
> +
> +    logger.debug('publish: title=%s jobject=%s force=%s' \
> +            % (title, jobject and jobject[0].metadata['activity'], force))
> +
> +    if jobject:
> +        if force:
> +            jobject = jobject[0]
> +        else:
> +            try:
> +                # check for 0.84 code
> +                from jarabe import config
> +            except:
> +                # 0.82 couldn't override .xol bundles
> +                activity.notify_alert(
> +                        _('Bundle exists'),
> +                        _('A bundle by "%s" name already exists. Please ' \
> +                        'click "Erase" in the Journal. You can click ' \
> +                        '"Publish" again afterwards.') % \
> +                        jobject[0].metadata['title'])
> +                return
> +
> +            activity.confirmation_alert(
> +                    _('Overwrite existed bundle?'),
> +                    _('A bundle for current object was already created. '
> +                      'Click "OK" to overwrite it.'),
> +                    publish, activity, True)
> +            jobject[0].destroy()
> +            return
> +    else:
> +        jobject = datastore.create()
> +        jobject.metadata['activity_id'] = activity.get_id()
> +        jobject.metadata['activity'] = book.custom.uid
> +        jobject.metadata['mime_type'] = 'application/vnd.olpc-content'
> +        jobject.metadata['description'] = \
> +                'This is a bundle containing articles on %s.\n' \
> +                'To view these articles, open the \'Browse\' Activity.\n' \
> +                'Go to \'Books\', and select \'%s\'.' % (title, title)
> +
> +    book.custom.sync_article()
> +    book.custom.revision += 1
> +
> +    jobject.metadata['title'] = title
> +    _publish(title, jobject)
> +    jobject.destroy()
> +
> +    book.custom.sync_index()
> +
> +"""
> + at author: Matthew Bailey
> +
> +This class deals with the creation of content packages, comprised of articles from
> +themes, with are zipped up and installed in the relevant OS specific location. From
> +here they can be distributed to the consumers
> +"""
> +def _publish(title, jobject):
> +    zipfilename = '/tmp/infoslicer.xol'
> +    zip = zipfile.ZipFile(zipfilename, 'w')
> +
> +    uid = book.custom.uid
> +
> +    for i in glob(os.path.join(get_bundle_path(), 'Stylesheets', '*')):
> +        zip.write(i, os.path.join(uid, 'slicecontent', os.path.basename(i)))
> +
> +    _info_file(zip, uid, title)
> +    _index_redirect(zip, uid)
> +    _dita_management(zip, uid, title)
> +
> +    zip.close()
> +
> +    jobject.set_file_path(zipfilename)
> +    datastore.write(jobject, transfer_ownership=True)
> +
> +def _dita_management(zip, uid, title):
> +    """
> +        Creates a DITA map, and copies the requested articles and their associated images into the zipped directories
> +    """
> +    map = [ '<?xml version=\'1.0\' encoding=\'utf-8\'?>',\
> +            '<!DOCTYPE map PUBLIC "-//IBM//DTD DITA IBM Map//EN" ' \
> +                    '"ibm-map.dtd">',\
> +            '<?xml-stylesheet type="text/xsl" href="mapstylesheet.xsl"?>',\
> +            '<map title="%s">' % title ]
> +
> +    images = {}
> +
> +    for entry in book.custom.index:
> +        if not entry['ready']:
> +            continue
> +
> +        atitle = entry['title']
> +        auid = entry['uid']
> +
> +        content = BeautifulStoneSoup(book.custom._load(auid))
> +
> +        for image in content.findAll('image'):
> +            image_path = book.wiki.root + '/' + image['href']
> +            image_name = os.path.basename(image_path)
> +            image_ext = os.path.splitext(image_name)[1]
> +
> +            image_num = images.get(image_name, len(images))
> +            images[image_name] = image_num
> +            image_name = ('%08d%s' % (image_num, image_ext)).encode('CP437')
> +
> +            zip.write(image_path, os.path.join(uid, 'slicecontent', image_name))
> +            image['href'] = image_name
> +
> +        content.insert(1, '<?xml-stylesheet type="text/xsl" ' \
> +                'href="ditastylesheet.xsl"?>')
> +        zipstr(zip, os.path.join(uid, 'slicecontent', '%s.dita' % auid),
> +                content.prettify())
> +
> +        map.append('<topicref href="%s.dita" navtitle="%s">' % (auid, atitle))
> +        map.append('</topicref>')
> +
> +    map.append('</map>')
> +    zipstr(zip, os.path.join(uid, 'slicecontent', 'librarymap.ditamap'),
> +            "\n".join(map))
> +
> +def _index_redirect(zip, uid):
> +    """
> +        Creates the redirecting index.html
> +    """
> +    redirect_loc = 'slicecontent/librarymap.ditamap'
> +
> +    html = ['<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">',\
> +            '<html>',\
> +            '<head>',\
> +            '<title>Redirecting to index</title>',\
> +            '<meta http-equiv="REFRESH" content="0;url=%s">' % redirect_loc,\
> +            '</head>',\
> +            '<body>',\
> +            '</body>',\
> +            '</html>']
> +
> +    zipstr(zip, os.path.join(uid, 'index.html'), "\n".join(html))
> +
> +def _info_file(zip, uid, title):
> +    """
> +        Creates the library.info file
> +    """
> +    libraryfile = ['[Library]',\
> +                   'name = %s' % title,\
> +                   'bundle_class = %s' % uid,\
> +                   'global_name = info.slice.%s' % title,\
> +                   'long_name = %s' % title,\
> +                   'library_version = %d' % book.custom.revision,\
> +                   'host_version = 1',\
> +                   'l10n = false',\
> +                   'locale = en',\
> +                   'category = books',\
> +                   'subcategory = slice',\
> +                   'icon = book.png',\
> +                   'activity = Web',\
> +                   'activity_start = index.html']
> +
> +    zipstr(zip, os.path.join(uid, 'library', 'library.info'),
> +            "\n".join(libraryfile))
> +
> +# XXX setup mode_t for files written by writestr()
> +def zipstr(zip, arcname, str):
> +    import copy
> +    zipinfo = copy.copy(zip.infolist()[0])
> +    zipinfo.filename = arcname
> +    zip.writestr(zipinfo, str)
> --
> 1.7.10
>



-- 
Walter Bender
Sugar Labs
http://www.sugarlabs.org


More information about the Sugar-devel mailing list