From 4f05cefb321769aeb82483ada841dcd7c3e79d2c Mon Sep 17 00:00:00 2001 From: Steve Howell Date: Sat, 24 Mar 2018 08:23:30 -0400 Subject: [PATCH] Remove obsolete code for stream subscribe buttons. In 18e43895ff488b4641cd304a268d3e2889e81545 we replaced stream subscribe buttons with stream links. The new feature has been well tested and well received for over a year now, so it's safe to remove the older feature at this point. Older sites will have super old messages that still have the rendered markup; this commit does not attempt to address those situations. Most likely, clicking on an old button in the old message will either do nothing or look like a message reply. --- static/js/custom_markdown.js | 126 ----------------------- zerver/fixtures/markdown_test_cases.json | 13 --- zerver/lib/bugdown/__init__.py | 25 ----- zerver/tests/test_bugdown.py | 52 ---------- zproject/settings.py | 1 - 5 files changed, 217 deletions(-) delete mode 100644 static/js/custom_markdown.js diff --git a/static/js/custom_markdown.js b/static/js/custom_markdown.js deleted file mode 100644 index 5f8837358b..0000000000 --- a/static/js/custom_markdown.js +++ /dev/null @@ -1,126 +0,0 @@ -var custom_markdown = (function () { - -var exports = {}; - -(function () { - // Javascript for bugdown.StreamSubscribeButton - - // A map of stream names to ids to select inline subscribe node without - // needing to escape the CSS selectors. - var inline_subscribe_id_map = {}; - - function add_sub(stream_name, $status_message) { - channel.post({ - url: '/json/users/me/subscriptions', - data: { - subscriptions: JSON.stringify([{name: stream_name}]), - }, - }).then( - function (data) { - if (!$.isEmptyObject(data.already_subscribed)) { - // Display the canonical stream capitalization. - var my_email = people.my_current_email(); - var true_stream_name = data.already_subscribed[my_email][0]; - ui_report.success(i18n.t("Already subscribed to __stream__", {stream: true_stream_name}), - $status_message); - } - }, function (xhr) { - ui_report.error(i18n.t("Error adding subscription"), xhr, $status_message); - } - ); - } - - function remove_sub(stream_name, $status_message) { - channel.del({ - url: '/json/users/me/subscriptions', - data: { - subscriptions: JSON.stringify([stream_name]), - }, - }).then( - function () { - $status_message.hide(); - }, function (xhr) { - ui_report.error(i18n.t("Error removing subscription"), xhr, $status_message); - } - ); - } - - function display_subscribe($button, stream_name) { - $button.text(i18n.t('Subscribe to __stream__', {stream: stream_data.canonicalized_name(stream_name)})) - .removeClass('btn-success') - .addClass('btn-default'); - } - - function display_unsubscribe($button, stream_name) { - $button.text(i18n.t('Unsubscribe from __stream__', {stream: stream_data.canonicalized_name(stream_name)})) - .removeClass('btn-default') - .addClass('btn-success'); - } - - function update_button_display($button, stream_name) { - if (stream_data.is_subscribed(stream_name)) { - display_unsubscribe($button, stream_name); - } else { - display_subscribe($button, stream_name); - } - } - - $(function () { - $('#main_div').on('click', '.inline-subscribe-button', function (e) { - var $button = $(e.target); - var stream_name = $button.closest('.inline-subscribe').attr('data-stream-name'); - var $status_message = $button.siblings('.inline-subscribe-error'); - e.preventDefault(); - e.stopPropagation(); - - if (stream_data.is_subscribed(stream_name)) { - remove_sub(stream_name, $status_message); - } else { - add_sub(stream_name, $status_message); - } - }); - }); - - $(document).on('message_rendered.zulip', function (e) { - var $inline_subscribe; - var $button; - var stream_name; - var id; - $inline_subscribe = $(e.target).find('.inline-subscribe'); - if ($inline_subscribe.length === 0) { - return; - } - stream_name = $inline_subscribe.attr('data-stream-name'); - $button = $inline_subscribe.find('.inline-subscribe-button'); - - if (inline_subscribe_id_map[stream_name]) { - id = inline_subscribe_id_map[stream_name]; - } else { - id = _.uniqueId('inline-subscribe-id-'); - inline_subscribe_id_map[stream_name] = id; - } - // Can not use data here, jQuery only stores into expando so our jQuery - // selectors will not be able to find it. - $inline_subscribe.attr('data-stream-ui-id', id); - - update_button_display($button, stream_name); - }); - - var sub_event_handler = function (e) { - var stream_name = e.sub.name; - var id = inline_subscribe_id_map[stream_name]; - var $button = $('#main_div'). - find('.inline-subscribe[data-stream-ui-id="'+ id + '"] .inline-subscribe-button'); - update_button_display($button, stream_name); - }; - $(document).on('subscription_add_done.zulip', sub_event_handler); - $(document).on('subscription_remove_done.zulip', sub_event_handler); -}()); - - -return exports; - -}()); -if (typeof module !== 'undefined') { - module.exports = custom_markdown; -} diff --git a/zerver/fixtures/markdown_test_cases.json b/zerver/fixtures/markdown_test_cases.json index 50a0f780c6..144df66804 100644 --- a/zerver/fixtures/markdown_test_cases.json +++ b/zerver/fixtures/markdown_test_cases.json @@ -566,19 +566,6 @@ "expected_output": "

!gravatar(username@example.com)

", "text_content": "!gravatar(username@example.com)" }, - { - "name": "stream_subscribe_button", - "input": "!_stream_subscribe_button(streamname)", - "expected_output": "

", - "marked_expected_output": "

!_stream_subscribe_button(streamname)

", - "text_content": "Subscribe to streamname" - }, - { - "name": "stream_subscribe_button_escaped", - "input": "`!_stream_subscribe_button(streamname)`", - "expected_output": "

!_stream_subscribe_button(streamname)

", - "text_content": "!_stream_subscribe_button(streamname)" - }, { "name": "tex_inline", "input": "$$1 \\oplus 0 = 1$$", diff --git a/zerver/lib/bugdown/__init__.py b/zerver/lib/bugdown/__init__.py index ffc263e8b5..10e1729fe9 100644 --- a/zerver/lib/bugdown/__init__.py +++ b/zerver/lib/bugdown/__init__.py @@ -1054,26 +1054,6 @@ class Emoji(markdown.inlinepatterns.Pattern): def content_has_emoji_syntax(content: Text) -> bool: return re.search(EMOJI_REGEX, content) is not None -class StreamSubscribeButton(markdown.inlinepatterns.Pattern): - # This markdown extension has required javascript in - # static/js/custom_markdown.js - def handleMatch(self, match: Match[Text]) -> Element: - stream_name = match.group('stream_name') - stream_name = stream_name.replace('\\)', ')').replace('\\\\', '\\') - - span = markdown.util.etree.Element('span') - span.set('class', 'inline-subscribe') - span.set('data-stream-name', stream_name) - - button = markdown.util.etree.SubElement(span, 'button') - button.text = 'Subscribe to ' + stream_name - button.set('class', 'inline-subscribe-button btn') - - error = markdown.util.etree.SubElement(span, 'span') - error.set('class', 'inline-subscribe-error') - - return span - class ModalLink(markdown.inlinepatterns.Pattern): """ A pattern that allows including in-app modal links in messages. @@ -1585,11 +1565,6 @@ class Bugdown(markdown.Extension): md.inlinePatterns.add('avatar', Avatar(AVATAR_REGEX), '>backtick') md.inlinePatterns.add('gravatar', Avatar(GRAVATAR_REGEX), '>backtick') - md.inlinePatterns.add( - 'stream_subscribe_button', - StreamSubscribeButton( - r'!_stream_subscribe_button\((?P(?:[^)\\]|\\\)|\\)*)\)'), - '>backtick') md.inlinePatterns.add( 'modal_link', ModalLink(r'!modal_link\((?P[^)]*), (?P[^)]*)\)'), diff --git a/zerver/tests/test_bugdown.py b/zerver/tests/test_bugdown.py index bcc374ae9e..258e1ac73c 100644 --- a/zerver/tests/test_bugdown.py +++ b/zerver/tests/test_bugdown.py @@ -1067,58 +1067,6 @@ class BugdownTest(ZulipTestCase): '

There #Nonexistentstream

') self.assertEqual(msg.mentions_user_ids, set()) - def test_stream_subscribe_button_simple(self) -> None: - msg = '!_stream_subscribe_button(simple)' - converted = bugdown_convert(msg) - self.assertEqual( - converted, - '

' - '' - '' - '' - '' - '

' - ) - - def test_stream_subscribe_button_in_name(self) -> None: - msg = '!_stream_subscribe_button(simple (not\\))' - converted = bugdown_convert(msg) - self.assertEqual( - converted, - '

' - '' - '' - '' - '' - '

' - ) - - def test_stream_subscribe_button_after_name(self) -> None: - msg = '!_stream_subscribe_button(simple) (not)' - converted = bugdown_convert(msg) - self.assertEqual( - converted, - '

' - '' - '' - '' - '' - ' (not)

' - ) - - def test_stream_subscribe_button_slash(self) -> None: - msg = '!_stream_subscribe_button(simple\\\\)' - converted = bugdown_convert(msg) - self.assertEqual( - converted, - '

' - '' - '' - '' - '' - '

' - ) - def test_in_app_modal_link(self) -> None: msg = '!modal_link(#settings, Settings page)' converted = bugdown_convert(msg) diff --git a/zproject/settings.py b/zproject/settings.py index aeae24d568..f0878dba01 100644 --- a/zproject/settings.py +++ b/zproject/settings.py @@ -1144,7 +1144,6 @@ JS_SPECS = { 'js/admin.js', 'js/tab_bar.js', 'js/emoji.js', - 'js/custom_markdown.js', 'js/bot_data.js', 'js/reactions.js', 'js/typing.js',