diff --git a/NEWS b/NEWS index 30d337b0..56a8fe03 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,5 @@ +* #1888 Choose the correct mime type when adding text from Write to the + clipboard. (tomeu) * #2149, #2150: fixes for the clipboard palette. (tomeu) * #2163 Arrow icons in the intro screen buttons. (marco) diff --git a/services/clipboard/clipboardobject.py b/services/clipboard/clipboardobject.py index 7b93f378..19ad747d 100644 --- a/services/clipboard/clipboardobject.py +++ b/services/clipboard/clipboardobject.py @@ -20,7 +20,6 @@ import urlparse from sugar.objects import mime from sugar import activity -from sugar import util import objecttypeservice @@ -111,7 +110,7 @@ class ClipboardObject: if not self._formats: return '' - format = util.choose_most_significant_mime_type(self._formats.keys()) + format = mime.choose_most_significant(self._formats.keys()) if format == 'text/uri-list': data = self._formats['text/uri-list'].get_data() diff --git a/shell/view/clipboardmenu.py b/shell/view/clipboardmenu.py index fa0ebcd2..3de4d46a 100644 --- a/shell/view/clipboardmenu.py +++ b/shell/view/clipboardmenu.py @@ -31,7 +31,6 @@ from sugar.clipboard import clipboardservice from sugar.datastore import datastore from sugar.objects import mime from sugar import profile -from sugar import util class ClipboardMenu(Palette): @@ -160,7 +159,7 @@ class ClipboardMenu(Palette): cb_service = clipboardservice.get_instance() obj = cb_service.get_object(self._object_id) - format = util.choose_most_significant_mime_type(obj['FORMATS']) + format = mime.choose_most_significant(obj['FORMATS']) data = cb_service.get_object_data(self._object_id, format) if format == 'text/uri-list': diff --git a/sugar/objects/mime.py b/sugar/objects/mime.py index 8725700e..0cba0010 100644 --- a/sugar/objects/mime.py +++ b/sugar/objects/mime.py @@ -15,6 +15,8 @@ # Free Software Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. +import logging + from sugar import _sugarext def get_for_file(file_name): @@ -40,3 +42,37 @@ def get_primary_extension(mime_type): _extensions_cache[mime_type] = None return None + +def choose_most_significant(mime_types): + logging.debug('Choosing between %r.' % mime_types) + if not mime_types: + return '' + + if 'text/uri-list' in mime_types: + return 'text/uri-list' + + for mime_category in ['image/', 'text/', 'application/']: + for mime_type in mime_types: + + # skip text/plain and text/html, these have lower priority. + if mime_type in ['text/plain', 'text/html']: + continue + + if mime_type.startswith(mime_category): + # skip mozilla private types (second component starts with '_') + if mime_type.split('/')[1].startswith('_'): + continue + + # take out the specifier after ';' that mozilla likes to add + mime_type = mime_type.split(';')[0] + logging.debug('Choosed %r!' % mime_type) + return mime_type + + if 'text/html' in mime_types: + return 'text/html' + + if 'text/plain' in mime_types or 'STRING' in mime_types: + return 'text/plain' + + logging.debug('Returning first: %r.' % mime_types[0]) + return mime_types[0] diff --git a/sugar/util.py b/sugar/util.py index 497eb538..814a7283 100644 --- a/sugar/util.py +++ b/sugar/util.py @@ -128,25 +128,3 @@ def set_proc_title(title): except: return False -def choose_most_significant_mime_type(mime_types): - logging.debug('Choosing between %r.' % mime_types) - if not mime_types: - return '' - - if 'text/uri-list' in mime_types: - return 'text/uri-list' - - for mime_category in ['image/', 'text/', 'application/']: - for mime_type in mime_types: - if mime_type.startswith(mime_category) and \ - not mime_type.split('/')[1].startswith('_'): - mime_type = mime_type.split(';')[0] - logging.debug('Choosed %r!' % mime_type) - return mime_type - - if 'STRING' in mime_types: - return 'text/plain' - - logging.debug('Returning first: %r.' % mime_types[0]) - return mime_types[0] -