diff --git a/src/chat_control.py b/src/chat_control.py index 9c5e33efa..ae3107d17 100644 --- a/src/chat_control.py +++ b/src/chat_control.py @@ -547,7 +547,7 @@ class ChatControlBase(MessageControl): end = True textview.print_conversation_line(text, jid, kind, name, tim, other_tags_for_name, other_tags_for_time, other_tags_for_text, - subject, old_kind, xhtml) + subject, old_kind, xhtml = xhtml) if not count_as_new: return @@ -1254,7 +1254,9 @@ class ChatControl(ChatControlBase): kind = 'outgoing' name = gajim.nicks[self.account] if not xhtml and not encrypted and gajim.config.get('rst_formatting_outgoing_messages'): - xhtml = '%s' % (NS_XHTML, create_xhtml(text)) + xhtml = create_xhtml(text) + if xhtml: + xhtml = '%s' % (NS_XHTML, xhtml) ChatControlBase.print_conversation_line(self, text, kind, name, tim, subject = subject, old_kind = self.old_msg_kind, xhtml = xhtml) if text.startswith('/me ') or text.startswith('/me\n'): diff --git a/src/common/connection.py b/src/common/connection.py index eddc3bd10..5027b64ea 100644 --- a/src/common/connection.py +++ b/src/common/connection.py @@ -678,7 +678,7 @@ class Connection(ConnectionHandlers): user_nick = None, xhtml = None): if not self.connection: return - if not xhtml and gajim.config.get('rst_formatting_outgoing_messages'): + if msg and not xhtml and gajim.config.get('rst_formatting_outgoing_messages'): xhtml = create_xhtml(msg) if not msg and chatstate is None: return diff --git a/src/rst_xhtml_generator.py b/src/rst_xhtml_generator.py index c44d3a9d8..c69771506 100644 --- a/src/rst_xhtml_generator.py +++ b/src/rst_xhtml_generator.py @@ -14,88 +14,98 @@ ## GNU General Public License for more details. ## -from docutils import io -from docutils.core import Publisher -from docutils.parsers.rst import roles - -def jep_reference_role(role, rawtext, text, lineno, inliner, - options={}, content=[]): - '''Role to make handy references to Jabber Enhancement Proposals (JEP). +try: + from docutils import io + from docutils.core import Publisher + from docutils.parsers.rst import roles + from docutils import nodes,utils + from docutils.parsers.rst.roles import set_classes +except: + def create_xhtml(text): + return None +else: + def jep_reference_role(role, rawtext, text, lineno, inliner, + options={}, content=[]): + '''Role to make handy references to Jabber Enhancement Proposals (JEP). Use as :JEP:`71` (or jep, or jep-reference). Modeled after the sample in docutils documentation. - ''' - from docutils import nodes,utils - from docutils.parsers.rst.roles import set_classes + ''' - jep_base_url = 'http://www.jabber.org/jeps/' - jep_url = 'jep-%04d.html' - try: - jepnum = int(text) - if jepnum <= 0: - raise ValueError - except ValueError: - msg = inliner.reporter.error( + jep_base_url = 'http://www.jabber.org/jeps/' + jep_url = 'jep-%04d.html' + try: + jepnum = int(text) + if jepnum <= 0: + raise ValueError + except ValueError: + msg = inliner.reporter.error( 'JEP number must be a number greater than or equal to 1; ' '"%s" is invalid.' % text, line=lineno) - prb = inliner.problematic(rawtext, rawtext, msg) - return [prb], [msg] - ref = jep_base_url + jep_url % jepnum - set_classes(options) - node = nodes.reference(rawtext, 'JEP ' + utils.unescape(text), refuri=ref, - **options) - return [node], [] + prb = inliner.problematic(rawtext, rawtext, msg) + return [prb], [msg] + ref = jep_base_url + jep_url % jepnum + set_classes(options) + node = nodes.reference(rawtext, 'JEP ' + utils.unescape(text), refuri=ref, + **options) + return [node], [] -roles.register_canonical_role('jep-reference', jep_reference_role) -from docutils.parsers.rst.languages.en import roles -roles['jep-reference'] = 'jep-reference' -roles['jep'] = 'jep-reference' + roles.register_canonical_role('jep-reference', jep_reference_role) + from docutils.parsers.rst.languages.en import roles + roles['jep-reference'] = 'jep-reference' + roles['jep'] = 'jep-reference' -class HTMLGenerator: - '''Really simple HTMLGenerator starting from publish_parts. + class HTMLGenerator: + '''Really simple HTMLGenerator starting from publish_parts. - It reuses the docutils.core.Publisher class, which means it is *not* - threadsafe. - ''' - def __init__(self, - settings_spec=None, - settings_overrides=dict(report_level=5, halt_level=5), - config_section='general'): - self.pub = Publisher(reader=None, parser=None, writer=None, - settings=None, - source_class=io.StringInput, - destination_class=io.StringOutput) - self.pub.set_components(reader_name='standalone', - parser_name='restructuredtext', - writer_name='html') - #hack: JEP-0071 does not allow HTML char entities, so we hack our way out of it. - # — == u"\u2014" - # a setting to only emit charater entities in the writer would be nice - # FIXME: several   are emitted, and they are explicitly forbidden in the JEP - #   == u"\u00a0" - self.pub.writer.translator_class.attribution_formats['dash'] = (u'\u2014', '') - self.pub.process_programmatic_settings(settings_spec, - settings_overrides, - config_section) + It reuses the docutils.core.Publisher class, which means it is *not* + threadsafe. + ''' + def __init__(self, + settings_spec=None, + settings_overrides=dict(report_level=5, halt_level=5), + config_section='general'): + self.pub = Publisher(reader=None, parser=None, writer=None, + settings=None, + source_class=io.StringInput, + destination_class=io.StringOutput) + self.pub.set_components(reader_name='standalone', + parser_name='restructuredtext', + writer_name='html') + # hack: JEP-0071 does not allow HTML char entities, so we hack our way + # out of it. + # — == u"\u2014" + # a setting to only emit charater entities in the writer would be nice + # FIXME: several   are emitted, and they are explicitly forbidden + # in the JEP + #   == u"\u00a0" + self.pub.writer.translator_class.attribution_formats['dash'] = ( + u'\u2014', '') + self.pub.process_programmatic_settings(settings_spec, + settings_overrides, + config_section) - def create_xhtml(self, text, - destination=None, - destination_path=None, - enable_exit_status=None): - ''' Create xhtml for a fragment of IM dialog. - We can use the source_name to store info about - the message.''' - self.pub.set_source(text, None) - self.pub.set_destination(destination, destination_path) - output = self.pub.publish(enable_exit_status=enable_exit_status) - #kludge until we can get docutils to stop generating (rare)   entities - return u'\u00a0'.join(self.pub.writer.parts['fragment'].strip().split(' ')) + def create_xhtml(self, text, + destination=None, + destination_path=None, + enable_exit_status=None): + ''' Create xhtml for a fragment of IM dialog. + We can use the source_name to store info about + the message.''' + self.pub.set_source(text, None) + self.pub.set_destination(destination, destination_path) + output = self.pub.publish(enable_exit_status=enable_exit_status) + # kludge until we can get docutils to stop generating (rare)   + # entities + return u'\u00a0'.join(self.pub.writer.parts['fragment'].strip().split( + ' ')) -Generator = HTMLGenerator() + Generator = HTMLGenerator() -def create_xhtml(text): - return Generator.create_xhtml(text) + def create_xhtml(text): + return Generator.create_xhtml(text) + if __name__ == '__main__': print Generator.create_xhtml('''