mirror of
				https://github.com/zulip/zulip.git
				synced 2025-10-31 03:53:50 +00:00 
			
		
		
		
	markdown: Rewrite include plugin without markdown-include.
markdown-include is GPL licensed. Also, rewrite it as a block processor, so that it works correctly inside indented blocks. Signed-off-by: Anders Kaseorg <anders@zulip.com>
This commit is contained in:
		
				
					committed by
					
						 Tim Abbott
						Tim Abbott
					
				
			
			
				
	
			
			
			
						parent
						
							7f0e11bd06
						
					
				
				
					commit
					dc33a0ae67
				
			| @@ -76,7 +76,7 @@ Here are a few common macros used to document Zulip's integrations: | |||||||
|   integration or incoming webhook. For an example rendering, see **Step 1** of |   integration or incoming webhook. For an example rendering, see **Step 1** of | ||||||
|   [the docs for Zulip's GitHub integration][github-integration]. |   [the docs for Zulip's GitHub integration][github-integration]. | ||||||
|  |  | ||||||
| - `{!create-bot-construct-url-indented.md!}` macro - Instructs users to create a bot | - `{!create-bot-construct-url.md!}` macro - Instructs users to create a bot | ||||||
|   for a given integration and construct a webhook URL using the bot API key |   for a given integration and construct a webhook URL using the bot API key | ||||||
|   and stream name. The URL is generated automatically for every incoming webhook |   and stream name. The URL is generated automatically for every incoming webhook | ||||||
|   by using attributes in the `WebhookIntegration` class in |   by using attributes in the `WebhookIntegration` class in | ||||||
| @@ -94,12 +94,12 @@ Here are a few common macros used to document Zulip's integrations: | |||||||
| - `{!append-stream-name.md!}` macro - Recommends appending `&stream=stream_name` | - `{!append-stream-name.md!}` macro - Recommends appending `&stream=stream_name` | ||||||
|   to a URL in cases where supplying a stream name in the URL is optional. |   to a URL in cases where supplying a stream name in the URL is optional. | ||||||
|   Supplying a stream name is optional for most Zulip integrations. If you use |   Supplying a stream name is optional for most Zulip integrations. If you use | ||||||
|   `{!create-bot-construct-url-indented.md!}`, this macro need not be used. |   `{!create-bot-construct-url.md!}`, this macro need not be used. | ||||||
|  |  | ||||||
| - `{!append-topic.md!}` macro - Recommends appending `&topic=my_topic` to a URL | - `{!append-topic.md!}` macro - Recommends appending `&topic=my_topic` to a URL | ||||||
|   to supply a custom topic for webhook notification messages. Supplying a custom |   to supply a custom topic for webhook notification messages. Supplying a custom | ||||||
|   topic is optional for most Zulip integrations. If you use |   topic is optional for most Zulip integrations. If you use | ||||||
|   `{!create-bot-construct-url-indented.md!}`, this macro need not be used. |   `{!create-bot-construct-url.md!}`, this macro need not be used. | ||||||
|  |  | ||||||
| - `{!congrats.md!}` macro - Inserts congratulatory lines signifying the | - `{!congrats.md!}` macro - Inserts congratulatory lines signifying the | ||||||
|   successful setup of a given integration. This macro is usually used at |   successful setup of a given integration. This macro is usually used at | ||||||
| @@ -127,7 +127,7 @@ Here are a few common macros used to document Zulip's integrations: | |||||||
|   see the last paragraph of **Step 2** in |   see the last paragraph of **Step 2** in | ||||||
|   [the docs for Zulip's GitHub integration][github-integration]. |   [the docs for Zulip's GitHub integration][github-integration]. | ||||||
|  |  | ||||||
| - `{!webhook-url.md!}` - Used internally by `{!create-bot-construct-url-indented.md!}` | - `{!webhook-url.md!}` - Used internally by `{!create-bot-construct-url.md!}` | ||||||
|   to generate the webhook URL. |   to generate the webhook URL. | ||||||
|  |  | ||||||
| - `{!zulip-config.md!}` - Used internally by `{!change-zulip-config-file.md!}` | - `{!zulip-config.md!}` - Used internally by `{!change-zulip-config-file.md!}` | ||||||
| @@ -202,7 +202,7 @@ A typical doc will then have the following steps. | |||||||
|  |  | ||||||
| ##### "Create the bot" step | ##### "Create the bot" step | ||||||
|  |  | ||||||
| - Typically, use the `create-bot-construct-url-indented` macro. | - Typically, use the `create-bot-construct-url` macro. | ||||||
| - [Existing macros](#markdown-macros) should be used for this if they exist, but if the macro | - [Existing macros](#markdown-macros) should be used for this if they exist, but if the macro | ||||||
|   defaults don’t work, it may make sense to write something custom for the |   defaults don’t work, it may make sense to write something custom for the | ||||||
|   integration in question. This step is mandatory for all integrations. |   integration in question. This step is mandatory for all integrations. | ||||||
|   | |||||||
| @@ -69,7 +69,6 @@ module = [ | |||||||
|     "gitlint.*", |     "gitlint.*", | ||||||
|     "jsonref.*", |     "jsonref.*", | ||||||
|     "ldap.*", |     "ldap.*", | ||||||
|     "markdown_include.*", |  | ||||||
|     "moto.*", # https://github.com/spulec/moto/issues/4944 |     "moto.*", # https://github.com/spulec/moto/issues/4944 | ||||||
|     "onelogin.*", |     "onelogin.*", | ||||||
|     "openapi_core.*", |     "openapi_core.*", | ||||||
|   | |||||||
| @@ -61,9 +61,6 @@ premailer | |||||||
| # Needed for JWT-based auth | # Needed for JWT-based auth | ||||||
| PyJWT | PyJWT | ||||||
|  |  | ||||||
| # Needed for including other Markdown files for user docs |  | ||||||
| markdown-include |  | ||||||
|  |  | ||||||
| # Needed to access RabbitMQ | # Needed to access RabbitMQ | ||||||
| pika | pika | ||||||
|  |  | ||||||
|   | |||||||
| @@ -902,11 +902,6 @@ lxml-stubs==0.4.0 \ | |||||||
| markdown==3.3.7 \ | markdown==3.3.7 \ | ||||||
|     --hash=sha256:cbb516f16218e643d8e0a95b309f77eb118cb138d39a4f27851e6a63581db874 \ |     --hash=sha256:cbb516f16218e643d8e0a95b309f77eb118cb138d39a4f27851e6a63581db874 \ | ||||||
|     --hash=sha256:f5da449a6e1c989a4cea2631aa8ee67caa5a2ef855d551c88f9e309f4634c621 |     --hash=sha256:f5da449a6e1c989a4cea2631aa8ee67caa5a2ef855d551c88f9e309f4634c621 | ||||||
|     # via |  | ||||||
|     #   -r requirements/common.in |  | ||||||
|     #   markdown-include |  | ||||||
| markdown-include==0.6.0 \ |  | ||||||
|     --hash=sha256:6f5d680e36f7780c7f0f61dca53ca581bd50d1b56137ddcd6353efafa0c3e4a2 |  | ||||||
|     # via -r requirements/common.in |     # via -r requirements/common.in | ||||||
| markdown-it-py==2.1.0 \ | markdown-it-py==2.1.0 \ | ||||||
|     --hash=sha256:93de681e5c021a432c63147656fe21790bc01231e0cd2da73626f1aa3ac0fe27 \ |     --hash=sha256:93de681e5c021a432c63147656fe21790bc01231e0cd2da73626f1aa3ac0fe27 \ | ||||||
|   | |||||||
| @@ -584,11 +584,6 @@ lxml==4.6.5 \ | |||||||
| markdown==3.3.7 \ | markdown==3.3.7 \ | ||||||
|     --hash=sha256:cbb516f16218e643d8e0a95b309f77eb118cb138d39a4f27851e6a63581db874 \ |     --hash=sha256:cbb516f16218e643d8e0a95b309f77eb118cb138d39a4f27851e6a63581db874 \ | ||||||
|     --hash=sha256:f5da449a6e1c989a4cea2631aa8ee67caa5a2ef855d551c88f9e309f4634c621 |     --hash=sha256:f5da449a6e1c989a4cea2631aa8ee67caa5a2ef855d551c88f9e309f4634c621 | ||||||
|     # via |  | ||||||
|     #   -r requirements/common.in |  | ||||||
|     #   markdown-include |  | ||||||
| markdown-include==0.6.0 \ |  | ||||||
|     --hash=sha256:6f5d680e36f7780c7f0f61dca53ca581bd50d1b56137ddcd6353efafa0c3e4a2 |  | ||||||
|     # via -r requirements/common.in |     # via -r requirements/common.in | ||||||
| markupsafe==2.1.1 \ | markupsafe==2.1.1 \ | ||||||
|     --hash=sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003 \ |     --hash=sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003 \ | ||||||
|   | |||||||
| @@ -1,9 +0,0 @@ | |||||||
|     Open `/usr/local/share/zulip/integrations/{{ integration_name }}/zulip_{{ integration_name }}_config.py` |  | ||||||
|     with your favorite editor, and change the following lines to specify the |  | ||||||
|     email address and API key for your {{ integration_display_name }} bot: |  | ||||||
|  |  | ||||||
|     ``` |  | ||||||
|     ZULIP_USER = "{{ integration_name }}-bot@example.com" |  | ||||||
|     ZULIP_API_KEY = "0123456789abcdef0123456789abcdef" |  | ||||||
|     ZULIP_SITE = "{{ api_url }}" |  | ||||||
|     ``` |  | ||||||
| @@ -1,9 +1,9 @@ | |||||||
| On your {{ settings_html|safe }}, create a bot for | Open `/usr/local/share/zulip/integrations/{{ integration_name }}/zulip_{{ integration_name }}_config.py` | ||||||
| {{ integration_display_name }}. |  | ||||||
|  |  | ||||||
| Next, open |  | ||||||
| `/usr/local/share/zulip/integrations/{{ integration_name }}/zulip_{{ integration_name }}_config.py` |  | ||||||
| with your favorite editor, and change the following lines to specify the | with your favorite editor, and change the following lines to specify the | ||||||
| email address and API key for your {{ integration_display_name }} bot: | email address and API key for your {{ integration_display_name }} bot: | ||||||
|  |  | ||||||
| {!zulip-config.md!} | ``` | ||||||
|  | ZULIP_USER = "{{ integration_name }}-bot@example.com" | ||||||
|  | ZULIP_API_KEY = "0123456789abcdef0123456789abcdef" | ||||||
|  | ZULIP_SITE = "{{ api_url }}" | ||||||
|  | ``` | ||||||
|   | |||||||
| @@ -1,5 +0,0 @@ | |||||||
|     [Create a bot](/help/add-a-bot-or-integration) for |  | ||||||
|     {{ integration_display_name }}. Make sure that you select |  | ||||||
|     **Incoming webhook** as the **Bot type**: |  | ||||||
|  |  | ||||||
|      |  | ||||||
| @@ -1,15 +0,0 @@ | |||||||
|     {!create-a-bot-indented.md!} |  | ||||||
|  |  | ||||||
|     Construct the URL for the {{ integration_display_name }} |  | ||||||
|     bot using the bot's API key and the desired stream name: |  | ||||||
|  |  | ||||||
|     {!webhook-url.md!} |  | ||||||
|  |  | ||||||
|     Modify the parameters of the URL above, where `api_key` is the API key |  | ||||||
|     of your Zulip bot, and `stream` is the [URL-encoded](https://www.urlencoder.org/) |  | ||||||
|     stream name you want the notifications sent to. If you do not specify a |  | ||||||
|     `stream`, the bot will send notifications via PMs to the creator of the bot. |  | ||||||
|  |  | ||||||
|     If you'd like this integration to always send to a specific topic, |  | ||||||
|     just include the (URL-encoded) topic as an additional parameter |  | ||||||
|     (E.g. for `your topic`, append `&topic=your%20topic` to the URL). |  | ||||||
| @@ -1,4 +0,0 @@ | |||||||
|     You can also limit the branches you receive notifications for by |  | ||||||
|     specifying them in a comma-separated list at the end of the URL, |  | ||||||
|     like so: |  | ||||||
|     `{{ api_url }}{{ integration_url }}?api_key=abcdefgh&stream={{ recommended_stream_name }}&branches=main,development` |  | ||||||
| @@ -1,5 +1,4 @@ | |||||||
| You can also limit the branches you receive notifications for by | You can also limit the branches you receive notifications for by | ||||||
| specifying them in a comma-separated list at the end of the URL, | specifying them in a comma-separated list at the end of the URL, | ||||||
| like so: | like so: | ||||||
|  |  | ||||||
| `{{ api_url }}{{ integration_url }}?api_key=abcdefgh&stream={{ recommended_stream_name }}&branches=main,development` | `{{ api_url }}{{ integration_url }}?api_key=abcdefgh&stream={{ recommended_stream_name }}&branches=main,development` | ||||||
|   | |||||||
| @@ -1,9 +0,0 @@ | |||||||
|     Construct the URL for the {{ integration_display_name }} |  | ||||||
|     bot using the bot's API key and email address: |  | ||||||
|  |  | ||||||
|     `{{ external_uri_scheme }}bot_email:bot_api_key@{{ api_url_scheme_relative }}{{ integration_url }}` |  | ||||||
|  |  | ||||||
|     Modify the parameters of the URL above, where `bot_email` is |  | ||||||
|     the bot's URL-encoded email address and `bot_api_key` is the |  | ||||||
|     bot's API key.  To URL-encode the email address, you just need |  | ||||||
|     to replace `@` in the bot's email address with `%40`. |  | ||||||
| @@ -1,7 +1,9 @@ | |||||||
| In the URL field, enter: | Construct the URL for the {{ integration_display_name }} | ||||||
|  | bot using the bot's API key and email address: | ||||||
|  |  | ||||||
| `{{ external_uri_scheme }}bot_email:bot_api_key@{{ api_url_scheme_relative }}{{ integration_url }}` | `{{ external_uri_scheme }}bot_email:bot_api_key@{{ api_url_scheme_relative }}{{ integration_url }}` | ||||||
|  |  | ||||||
| Replace `bot_email` and `bot_api_key` above with the URL-encoded email | Modify the parameters of the URL above, where `bot_email` is | ||||||
| address and API key of the bot.  To URL-encode the email address, you | the bot's URL-encoded email address and `bot_api_key` is the | ||||||
| just need to replace `@` in the bot's email address with `%40`. | bot's API key.  To URL-encode the email address, you just need | ||||||
|  | to replace `@` in the bot's email address with `%40`. | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| Get Zulip notifications for your Capistrano deploys! | Get Zulip notifications for your Capistrano deploys! | ||||||
|  |  | ||||||
| 1.  {!create-a-bot-indented.md!} | 1.  {!create-a-bot.md!} | ||||||
|  |  | ||||||
| 1.  {!download-python-bindings.md!} | 1.  {!download-python-bindings.md!} | ||||||
|  |  | ||||||
|   | |||||||
| @@ -5,11 +5,11 @@ Get Codebase notifications in Zulip! | |||||||
|    updates. We recommend naming the streams `codebase` and `tickets`, respectively. |    updates. We recommend naming the streams `codebase` and `tickets`, respectively. | ||||||
|    After creating these streams, make sure to subscribe all interested parties. |    After creating these streams, make sure to subscribe all interested parties. | ||||||
|  |  | ||||||
| 1. {!create-a-bot-indented.md!} | 1. {!create-a-bot.md!} | ||||||
|  |  | ||||||
| 1. {!download-python-bindings.md!} | 1. {!download-python-bindings.md!} | ||||||
|  |  | ||||||
| 1. {!change-zulip-config-file-indented.md!} | 1. {!change-zulip-config-file.md!} | ||||||
|  |  | ||||||
|     You may also need to update the value of `ZULIP_TICKETS_STREAM_NAME` and |     You may also need to update the value of `ZULIP_TICKETS_STREAM_NAME` and | ||||||
|     `ZULIP_COMMITS_STREAM_NAME`. |     `ZULIP_COMMITS_STREAM_NAME`. | ||||||
|   | |||||||
| @@ -1,12 +1,12 @@ | |||||||
| Get Zulip notifications for your Git repositories! | Get Zulip notifications for your Git repositories! | ||||||
|  |  | ||||||
| 1. {!create-a-bot-indented.md!} | 1. {!create-a-bot.md!} | ||||||
|  |  | ||||||
| 1. {!download-python-bindings.md!} | 1. {!download-python-bindings.md!} | ||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!change-zulip-config-file-indented.md!} | 1. {!change-zulip-config-file.md!} | ||||||
|  |  | ||||||
|     You may also need to change the value of `STREAM_NAME`. |     You may also need to change the value of `STREAM_NAME`. | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-a-bot-indented.md!} | 1. {!create-a-bot.md!} | ||||||
|  |  | ||||||
| 1. Install the "Zulip" plugin by going to | 1. Install the "Zulip" plugin by going to | ||||||
|    **Manage Jenkins > Manage Plugins > Available**, |    **Manage Jenkins > Manage Plugins > Available**, | ||||||
|   | |||||||
| @@ -16,7 +16,7 @@ in an OpenShift instance. | |||||||
|  |  | ||||||
|      |      | ||||||
|  |  | ||||||
| 1.  {!change-zulip-config-file-indented.md!} | 1.  {!change-zulip-config-file.md!} | ||||||
|  |  | ||||||
| 1.  You can also specify which pushes will result in notifications and to | 1.  You can also specify which pushes will result in notifications and to | ||||||
|     what stream the notifications will be sent by modifying the |     what stream the notifications will be sent by modifying the | ||||||
|   | |||||||
| @@ -8,7 +8,7 @@ that fires once a changelist is submitted and committed. | |||||||
| 1.  The Perforce trigger will be installed to a location like | 1.  The Perforce trigger will be installed to a location like | ||||||
|     `/usr/local/share/zulip/integrations/perforce`. |     `/usr/local/share/zulip/integrations/perforce`. | ||||||
|  |  | ||||||
| 1.  {!change-zulip-config-file-indented.md!} | 1.  {!change-zulip-config-file.md!} | ||||||
|  |  | ||||||
| 1.  If you have a P4Web viewer set up, you may change `P4_WEB` | 1.  If you have a P4Web viewer set up, you may change `P4_WEB` | ||||||
|     to point at the base URL of the server. If this is configured, |     to point at the base URL of the server. If this is configured, | ||||||
|   | |||||||
| @@ -11,7 +11,7 @@ post-commit hook. To do this: | |||||||
|  |  | ||||||
|    [1]: http://pysvn.tigris.org/project_downloads.html |    [1]: http://pysvn.tigris.org/project_downloads.html | ||||||
|  |  | ||||||
| 1. {!change-zulip-config-file-indented.md!} | 1. {!change-zulip-config-file.md!} | ||||||
|  |  | ||||||
| 1. Copy `integrations/svn/zulip_svn_config.py` and | 1. Copy `integrations/svn/zulip_svn_config.py` and | ||||||
|    `integrations/svn/post-commit` from the API bindings directory |    `integrations/svn/post-commit` from the API bindings directory | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ | |||||||
|  |  | ||||||
| 1.  {!download-python-bindings.md!} | 1.  {!download-python-bindings.md!} | ||||||
|  |  | ||||||
| 1.  {!change-zulip-config-file-indented.md!} | 1.  {!change-zulip-config-file.md!} | ||||||
|  |  | ||||||
| 1.  Also, change the following lines: | 1.  Also, change the following lines: | ||||||
|  |  | ||||||
|   | |||||||
| @@ -48,4 +48,4 @@ API_FEATURE_LEVEL = 132 | |||||||
| #   historical commits sharing the same major version, in which case a | #   historical commits sharing the same major version, in which case a | ||||||
| #   minor version bump suffices. | #   minor version bump suffices. | ||||||
|  |  | ||||||
| PROVISION_VERSION = "191.1" | PROVISION_VERSION = "192.0" | ||||||
|   | |||||||
| @@ -2191,6 +2191,7 @@ class Markdown(markdown.Markdown): | |||||||
|         parser.blockprocessors.register(OListProcessor(parser), "olist", 65) |         parser.blockprocessors.register(OListProcessor(parser), "olist", 65) | ||||||
|         parser.blockprocessors.register(UListProcessor(parser), "ulist", 60) |         parser.blockprocessors.register(UListProcessor(parser), "ulist", 60) | ||||||
|         parser.blockprocessors.register(BlockQuoteProcessor(parser), "quote", 55) |         parser.blockprocessors.register(BlockQuoteProcessor(parser), "quote", 55) | ||||||
|  |         # We get priority 51 from our 'include' extension | ||||||
|         parser.blockprocessors.register( |         parser.blockprocessors.register( | ||||||
|             markdown.blockprocessors.ParagraphProcessor(parser), "paragraph", 50 |             markdown.blockprocessors.ParagraphProcessor(parser), "paragraph", 50 | ||||||
|         ) |         ) | ||||||
|   | |||||||
| @@ -1,70 +1,54 @@ | |||||||
| import os | import os | ||||||
| import re | import re | ||||||
| from typing import Any, List | from typing import List, Match | ||||||
|  | from xml.etree.ElementTree import Element | ||||||
|  |  | ||||||
| import markdown | from markdown import Extension, Markdown | ||||||
| from markdown_include.include import IncludePreprocessor, MarkdownInclude | from markdown.blockparser import BlockParser | ||||||
|  | from markdown.blockprocessors import BlockProcessor | ||||||
|  |  | ||||||
| from zerver.lib.exceptions import InvalidMarkdownIncludeStatement | from zerver.lib.exceptions import InvalidMarkdownIncludeStatement | ||||||
| from zerver.lib.markdown.priorities import PREPROCESSOR_PRIORITES | from zerver.lib.markdown.priorities import BLOCK_PROCESSOR_PRIORITIES | ||||||
|  |  | ||||||
| INC_SYNTAX = re.compile(r"\{!\s*(.+?)\s*!\}") |  | ||||||
|  |  | ||||||
|  |  | ||||||
| class MarkdownIncludeCustom(MarkdownInclude): | class IncludeExtension(Extension): | ||||||
|     def extendMarkdown(self, md: markdown.Markdown) -> None: |     def __init__(self, base_path: str) -> None: | ||||||
|         md.preprocessors.register( |         super().__init__() | ||||||
|             IncludeCustomPreprocessor(md, self.getConfigs()), |         self.base_path = base_path | ||||||
|             "include_wrapper", |  | ||||||
|             PREPROCESSOR_PRIORITES["include"], |     def extendMarkdown(self, md: Markdown) -> None: | ||||||
|  |         md.parser.blockprocessors.register( | ||||||
|  |             IncludeBlockProcessor(md.parser, self.base_path), | ||||||
|  |             "include", | ||||||
|  |             BLOCK_PROCESSOR_PRIORITIES["include"], | ||||||
|         ) |         ) | ||||||
|  |  | ||||||
|  |  | ||||||
| class IncludeCustomPreprocessor(IncludePreprocessor): | class IncludeBlockProcessor(BlockProcessor): | ||||||
|     """ |     RE = re.compile(r"^ {,3}\{!([^!]+)!\} *$", re.M) | ||||||
|     This is a custom implementation of the markdown_include |  | ||||||
|     extension that checks for include statements and if the included |  | ||||||
|     macro file does not exist or can't be opened, raises a custom |  | ||||||
|     JsonableError exception. The rest of the functionality is identical |  | ||||||
|     to the original markdown_include extension. |  | ||||||
|     """ |  | ||||||
|  |  | ||||||
|     def run(self, lines: List[str]) -> List[str]: |     def __init__(self, parser: BlockParser, base_path: str) -> None: | ||||||
|         done = False |         super().__init__(parser) | ||||||
|         while not done: |         self.base_path = base_path | ||||||
|             for line in lines: |  | ||||||
|                 loc = lines.index(line) |  | ||||||
|                 m = INC_SYNTAX.search(line) |  | ||||||
|  |  | ||||||
|                 if m: |     def test(self, parent: Element, block: str) -> bool:  # type: ignore[override] # https://github.com/python/typeshed/pull/8166 | ||||||
|                     filename = m.group(1) |         return bool(self.RE.search(block)) | ||||||
|                     filename = os.path.expanduser(filename) |  | ||||||
|                     if not os.path.isabs(filename): |     def expand_include(self, m: Match[str]) -> str: | ||||||
|                         filename = os.path.normpath( |  | ||||||
|                             os.path.join(self.base_path, filename), |  | ||||||
|                         ) |  | ||||||
|         try: |         try: | ||||||
|                         with open(filename, encoding=self.encoding) as r: |             with open(os.path.normpath(os.path.join(self.base_path, m[1]))) as f: | ||||||
|                             text = r.readlines() |                 lines = f.read().splitlines() | ||||||
|                     except Exception as e: |         except OSError as e: | ||||||
|                         print(f"Warning: could not find file {filename}. Error: {e}") |             raise InvalidMarkdownIncludeStatement(m[0].strip()) from e | ||||||
|                         lines[loc] = INC_SYNTAX.sub("", line) |  | ||||||
|                         raise InvalidMarkdownIncludeStatement(m.group(0).strip()) |  | ||||||
|  |  | ||||||
|                     line_split = INC_SYNTAX.split(line) |         for prep in self.parser.md.preprocessors: | ||||||
|                     if len(text) == 0: |             lines = prep.run(lines) | ||||||
|                         text.append("") |  | ||||||
|                     for i in range(len(text)): |  | ||||||
|                         text[i] = text[i].rstrip("\r\n") |  | ||||||
|                     text[0] = line_split[0] + text[0] |  | ||||||
|                     text[-1] = text[-1] + line_split[2] |  | ||||||
|                     lines = lines[:loc] + text + lines[loc + 1 :] |  | ||||||
|                     break |  | ||||||
|             else: |  | ||||||
|                 done = True |  | ||||||
|  |  | ||||||
|         return lines |         return "\n".join(lines) | ||||||
|  |  | ||||||
|  |     def run(self, parent: Element, blocks: List[str]) -> None: | ||||||
|  |         blocks[:1] = self.RE.sub(self.expand_include, blocks[0]).split("\n\n") | ||||||
|  |  | ||||||
|  |  | ||||||
| def makeExtension(*args: Any, **kwargs: str) -> MarkdownIncludeCustom: | def makeExtension(base_path: str) -> IncludeExtension: | ||||||
|     return MarkdownIncludeCustom(kwargs) |     return IncludeExtension(base_path=base_path) | ||||||
|   | |||||||
| @@ -10,8 +10,6 @@ PREPROCESSOR_PRIORITES = { | |||||||
|     "generate_code_example": 525, |     "generate_code_example": 525, | ||||||
|     "generate_return_values": 510, |     "generate_return_values": 510, | ||||||
|     "generate_api_arguments": 505, |     "generate_api_arguments": 505, | ||||||
|     "include": 500, |  | ||||||
|     # "include_wrapper": 500, |  | ||||||
|     "help_relative_links": 475, |     "help_relative_links": 475, | ||||||
|     "setting": 450, |     "setting": 450, | ||||||
|     # "normalize_whitespace": 30, |     # "normalize_whitespace": 30, | ||||||
| @@ -21,3 +19,7 @@ PREPROCESSOR_PRIORITES = { | |||||||
|     "nested_code_blocks": -500, |     "nested_code_blocks": -500, | ||||||
|     "emoticon_translations": -505, |     "emoticon_translations": -505, | ||||||
| } | } | ||||||
|  |  | ||||||
|  | BLOCK_PROCESSOR_PRIORITIES = { | ||||||
|  |     "include": 51, | ||||||
|  | } | ||||||
|   | |||||||
| @@ -1,5 +1,3 @@ | |||||||
| from unittest.mock import MagicMock, call, patch |  | ||||||
|  |  | ||||||
| from django.template.loader import get_template | from django.template.loader import get_template | ||||||
|  |  | ||||||
| from zerver.lib.exceptions import InvalidMarkdownIncludeStatement | from zerver.lib.exceptions import InvalidMarkdownIncludeStatement | ||||||
| @@ -118,8 +116,7 @@ footer | |||||||
|         ) |         ) | ||||||
|         self.assertEqual(content_sans_whitespace, expected) |         self.assertEqual(content_sans_whitespace, expected) | ||||||
|  |  | ||||||
|     @patch("builtins.print") |     def test_custom_markdown_include_extension(self) -> None: | ||||||
|     def test_custom_markdown_include_extension(self, mock_print: MagicMock) -> None: |  | ||||||
|         template = get_template("tests/test_markdown.html") |         template = get_template("tests/test_markdown.html") | ||||||
|         context = { |         context = { | ||||||
|             "markdown_test_file": "zerver/tests/markdown/test_custom_include_extension.md", |             "markdown_test_file": "zerver/tests/markdown/test_custom_include_extension.md", | ||||||
| @@ -129,14 +126,6 @@ footer | |||||||
|             InvalidMarkdownIncludeStatement, "Invalid Markdown include statement" |             InvalidMarkdownIncludeStatement, "Invalid Markdown include statement" | ||||||
|         ): |         ): | ||||||
|             template.render(context) |             template.render(context) | ||||||
|         self.assertEqual( |  | ||||||
|             mock_print.mock_calls, |  | ||||||
|             [ |  | ||||||
|                 call( |  | ||||||
|                     "Warning: could not find file templates/zerver/help/include/nonexistent-macro.md. Error: [Errno 2] No such file or directory: 'templates/zerver/help/include/nonexistent-macro.md'" |  | ||||||
|                 ) |  | ||||||
|             ], |  | ||||||
|         ) |  | ||||||
|  |  | ||||||
|     def test_custom_markdown_include_extension_empty_macro(self) -> None: |     def test_custom_markdown_include_extension_empty_macro(self) -> None: | ||||||
|         template = get_template("tests/test_markdown.html") |         template = get_template("tests/test_markdown.html") | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ Get Zulip notifications for your Airbrake bug tracker! | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| 1. Go to your project's settings on the Airbrake site. Click on the | 1. Go to your project's settings on the Airbrake site. Click on the | ||||||
|    **Integration** section, and select **Webhook**. |    **Integration** section, and select **Webhook**. | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ Get Zulip notifications from Alertmanager! | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
|     Additionally, you may specify URL parameters named `name` and `desc` to specify which labels |     Additionally, you may specify URL parameters named `name` and `desc` to specify which labels | ||||||
|     or annotations will be used to construct the alert message. This allows you to use arbitrary labels |     or annotations will be used to construct the alert message. This allows you to use arbitrary labels | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ Get Ansible Tower notifications in Zulip! | |||||||
|  |  | ||||||
|  1. {!create-stream.md!} |  1. {!create-stream.md!} | ||||||
|  |  | ||||||
|  1. {!create-bot-construct-url-indented.md!} |  1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
|  1. Go to your Ansible Tower or AWX Admin Portal. Click **Notifications** on |  1. Go to your Ansible Tower or AWX Admin Portal. Click **Notifications** on | ||||||
|     the left sidebar, and click **Add**. |     the left sidebar, and click **Add**. | ||||||
|   | |||||||
| @@ -3,7 +3,7 @@ using the Zulip AppFollow integration! | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| 1. In AppFollow, click on **Integrations** on the left sidebar, and click **Add new integration**. | 1. In AppFollow, click on **Integrations** on the left sidebar, and click **Add new integration**. | ||||||
| Click on your app under **Tracked apps**. | Click on your app under **Tracked apps**. | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ Receive AppVeyor notifications in Zulip! | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| 1. Go to your AppVeyor Project Settings, and click **Notifications**. | 1. Go to your AppVeyor Project Settings, and click **Notifications**. | ||||||
|    Click **Add notification** and select **Webhook**. |    Click **Add notification** and select **Webhook**. | ||||||
|   | |||||||
| @@ -3,7 +3,7 @@ events in Basecamp. | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| 1. Go to your project on Basecamp. From the **Settings** menu in | 1. Go to your project on Basecamp. From the **Settings** menu in | ||||||
|    the top right corner, choose **Set up webhooks**. Click on |    the top right corner, choose **Set up webhooks**. Click on | ||||||
|   | |||||||
| @@ -2,9 +2,9 @@ Zulip supports both SVN and Git notifications from Beanstalk. | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-a-bot-indented.md!} | 1. {!create-a-bot.md!} | ||||||
|  |  | ||||||
|    {!webhook-url-with-bot-email-indented.md!} |    {!webhook-url-with-bot-email.md!} | ||||||
|    {!git-append-branches.md!} |    {!git-append-branches.md!} | ||||||
|  |  | ||||||
| 1. On your repository's webpage, click on the **Settings** | 1. On your repository's webpage, click on the **Settings** | ||||||
|   | |||||||
| @@ -3,7 +3,7 @@ to derail from your goal! | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| 1. Go to your Beeminder **Reminders** settings. | 1. Go to your Beeminder **Reminders** settings. | ||||||
|  |  | ||||||
|   | |||||||
| @@ -8,8 +8,8 @@ Bitbucket Server click [here](./bitbucket3). | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|    {!git-webhook-url-with-branches-indented.md!} |    {!git-webhook-url-with-branches.md!} | ||||||
|  |  | ||||||
| 1. On your repository's web page, click on **Settings**. Select | 1. On your repository's web page, click on **Settings**. Select | ||||||
|    **Webhooks**, and click **Add webhook**. |    **Webhooks**, and click **Add webhook**. | ||||||
|   | |||||||
| @@ -8,8 +8,8 @@ Bitbucket Cloud (SAAS service) click [here](./bitbucket2). | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 2. {!create-bot-construct-url-indented.md!} | 2. {!create-bot-construct-url.md!} | ||||||
|    {!git-webhook-url-with-branches-indented.md!} |    {!git-webhook-url-with-branches.md!} | ||||||
|  |  | ||||||
| 3. On your repository's web page, click on **Settings**. Select | 3. On your repository's web page, click on **Settings**. Select | ||||||
|    **Webhooks**, and click **Add webhook**. |    **Webhooks**, and click **Add webhook**. | ||||||
|   | |||||||
| @@ -6,7 +6,7 @@ Get Zulip notifications for your Buildbot builds! | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-a-bot-indented.md!} | 1. {!create-a-bot.md!} | ||||||
|  |  | ||||||
| 1. Edit the Buildbot configuration file to add a new Zulip reporter | 1. Edit the Buildbot configuration file to add a new Zulip reporter | ||||||
|  ([or follow the steps listed here][1]): |  ([or follow the steps listed here][1]): | ||||||
|   | |||||||
| @@ -4,7 +4,7 @@ See your Thinkst Canarytoken alerts in Zulip! This integration works with Canary | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| 1. Go to [canarytokens.org][canarytokens], and select the type of | 1. Go to [canarytokens.org][canarytokens], and select the type of | ||||||
|    webhook that you want to create and add a reminder note. |    webhook that you want to create and add a reminder note. | ||||||
|   | |||||||
| @@ -3,7 +3,7 @@ your build statuses. | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| 1. Add the following to the bottom of your `circle.yml` file: | 1. Add the following to the bottom of your `circle.yml` file: | ||||||
|  |  | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ Get Zulip notifications for your Clubhouse Stories and Epics! | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| 1. Go to your Clubhouse Dashboard, and click on the settings icon in | 1. Go to your Clubhouse Dashboard, and click on the settings icon in | ||||||
|    the top-right corner. Click on **Integrations**, and select **Webhooks**. |    the top-right corner. Click on **Integrations**, and select **Webhooks**. | ||||||
|   | |||||||
| @@ -3,7 +3,7 @@ your build statuses. | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| 1. On your project's webpage, click on **Project Settings** in | 1. On your project's webpage, click on **Project Settings** in | ||||||
|    the top right corner. Click on the **Notifications** tab, and click on |    the top right corner. Click on the **Notifications** tab, and click on | ||||||
|   | |||||||
| @@ -3,7 +3,7 @@ about Crashlytics issues. | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| 1. Select the app you'd like to be notified about in your | 1. Select the app you'd like to be notified about in your | ||||||
|    [Crashlytics settings panel](https://fabric.io/settings/apps). |    [Crashlytics settings panel](https://fabric.io/settings/apps). | ||||||
|   | |||||||
| @@ -3,7 +3,7 @@ about updates in feedback responses organized by Delighted. | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| 1. On your Delighted dashboard, click on **Settings** in the | 1. On your Delighted dashboard, click on **Settings** in the | ||||||
|    top-right corner. Click on **Integrations**. Scroll down |    top-right corner. Click on **Integrations**. Scroll down | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ Get Dropbox notifications in Zulip! | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| 1. Go to your [Dropbox apps page](https://www.dropbox.com/developers/apps). | 1. Go to your [Dropbox apps page](https://www.dropbox.com/developers/apps). | ||||||
|    Click on **Create app** near the top-right corner, and follow the on-screen |    Click on **Create app** near the top-right corner, and follow the on-screen | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ Get Zulip notifications for the Errbit error tracker! | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| 1. Go to your project's settings on the Errbit site. Click on the | 1. Go to your project's settings on the Errbit site. Click on the | ||||||
|    **Edit** button for your Errbit app, and select **Webhook**. |    **Edit** button for your Errbit app, and select **Webhook**. | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ Get Zulip notifications from your Flock channels. | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| 1. Click on **Apps** in the bottom-right corner. | 1. Click on **Apps** in the bottom-right corner. | ||||||
|    Click on **Admin Panel**, and click on **Webhooks**. |    Click on **Admin Panel**, and click on **Webhooks**. | ||||||
|   | |||||||
| @@ -3,7 +3,7 @@ integration! | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| ### Add notifications for new Freshdesk tickets | ### Add notifications for new Freshdesk tickets | ||||||
|  |  | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ Receive Freshping notifications in Zulip! | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| 1. Go to your **Freshping** dashboard and click **Settings**. | 1. Go to your **Freshping** dashboard and click **Settings**. | ||||||
|    Click **Integrations** and then click **Create Integration** |    Click **Integrations** and then click **Create Integration** | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ Receive Freshstatus notifications in Zulip! | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| 1. On your Freshstatus dashboard, click **Settings** and click **Integrations**. | 1. On your Freshstatus dashboard, click **Settings** and click **Integrations**. | ||||||
|    Go to **Webhooks** and click **Manage**. Click **New Webhook** |    Go to **Webhooks** and click **Manage**. Click **New Webhook** | ||||||
|   | |||||||
| @@ -4,7 +4,7 @@ to receive Front notifications without leaving Zulip! | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| 1. Go to the **Settings** page of your Front organization. Click on the | 1. Go to the **Settings** page of your Front organization. Click on the | ||||||
| **Integrations** tab, and enable the **Webhooks** integration. Click on | **Integrations** tab, and enable the **Webhooks** integration. Click on | ||||||
|   | |||||||
| @@ -4,7 +4,7 @@ you can now get Task notifications in Zulip! | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| 1. Send an email to `gci-support@google.com` asking them to enable webhooks | 1. Send an email to `gci-support@google.com` asking them to enable webhooks | ||||||
|    for your organization. They'll need the name of your organization, and |    for your organization. They'll need the name of your organization, and | ||||||
|   | |||||||
| @@ -2,9 +2,9 @@ Receive Gitea notifications in Zulip! | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
|    {!git-webhook-url-with-branches-indented.md!} |    {!git-webhook-url-with-branches.md!} | ||||||
|  |  | ||||||
| 1. Go to your repository on Gitea and click on **Settings**. Select | 1. Go to your repository on Gitea and click on **Settings**. Select | ||||||
|    **Webhooks** on the left sidebar, and click **Add Webhook**. |    **Webhooks** on the left sidebar, and click **Add Webhook**. | ||||||
|   | |||||||
| @@ -2,9 +2,9 @@ Get GitHub notifications in Zulip! | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
|    {!git-webhook-url-with-branches-indented.md!} |    {!git-webhook-url-with-branches.md!} | ||||||
|  |  | ||||||
| 1. Go to your repository on GitHub and click on the **Settings** tab. | 1. Go to your repository on GitHub and click on the **Settings** tab. | ||||||
|    Select **Webhooks**. Click on **Add webhook**. GitHub may prompt |    Select **Webhooks**. Click on **Add webhook**. GitHub may prompt | ||||||
|   | |||||||
| @@ -2,13 +2,13 @@ Receive GitLab notifications in Zulip! | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
|     By default, the Zulip topics for merge requests will contain the |     By default, the Zulip topics for merge requests will contain the | ||||||
|     title of the GitLab merge request.  You can change the topic format to |     title of the GitLab merge request.  You can change the topic format to | ||||||
|     just contain the merge request ID by adding |     just contain the merge request ID by adding | ||||||
|     `&use_merge_request_title=false` at the end of the URL. |     `&use_merge_request_title=false` at the end of the URL. | ||||||
|     {!git-webhook-url-with-branches-indented.md!} |     {!git-webhook-url-with-branches.md!} | ||||||
|  |  | ||||||
| 1. Go to your repository on GitLab and click **Settings** on the left | 1. Go to your repository on GitLab and click **Settings** on the left | ||||||
|    sidebar.  Click on **Integrations**. |    sidebar.  Click on **Integrations**. | ||||||
|   | |||||||
| @@ -3,7 +3,7 @@ your build statuses. | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| 1. Add the following to your `Config.XML` file. | 1. Add the following to your `Config.XML` file. | ||||||
|  |  | ||||||
|   | |||||||
| @@ -2,9 +2,9 @@ Receive Gogs notifications in Zulip! | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
|    {!git-webhook-url-with-branches-indented.md!} |    {!git-webhook-url-with-branches.md!} | ||||||
|  |  | ||||||
| 1. Go to your repository on Gogs and click on **Settings**. Select | 1. Go to your repository on Gogs and click on **Settings**. Select | ||||||
|    **Webhooks** on the left sidebar, and click **Add Webhook**. |    **Webhooks** on the left sidebar, and click **Add Webhook**. | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ Receive GoSquared notifications in Zulip! | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| 1. Go to your project's **Settings** and click on **Services**. | 1. Go to your project's **Settings** and click on **Services**. | ||||||
|    Scroll down and next to **Webhook**, click on **Connect**. Click |    Scroll down and next to **Webhook**, click on **Connect**. Click | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ See your Grafana dashboard alerts in Zulip! | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| 1. In Grafana, go to **Alerting**. Click on **Notification channels**. | 1. In Grafana, go to **Alerting**. Click on **Notification channels**. | ||||||
|    Configure **Edit Notification Channel** as appropriate for your |    Configure **Edit Notification Channel** as appropriate for your | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ Receive Greenhouse notifications in Zulip! | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| 1. On your Greenhouse **Dashboard**, click on the | 1. On your Greenhouse **Dashboard**, click on the | ||||||
|    **gear** (<i class="fa fa-cog"></i>) icon in the upper right |    **gear** (<i class="fa fa-cog"></i>) icon in the upper right | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ Get Zulip notifications for your Groove events! | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| 1. On your Groove dashboard, click on **Settings**. Under **Company**, | 1. On your Groove dashboard, click on **Settings**. Under **Company**, | ||||||
|    click on **API**. Open the **Add Webhook** dropdown and select an |    click on **API**. Open the **Add Webhook** dropdown and select an | ||||||
|   | |||||||
| @@ -4,7 +4,7 @@ Harbor's webhooks feature is available in version 1.9 and later. | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| 1. Go to your Harbor **Projects** page. Open a project and click on the **Webhooks** tab. | 1. Go to your Harbor **Projects** page. Open a project and click on the **Webhooks** tab. | ||||||
|  |  | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ Configuring the HelloSign integration is easy! | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| 1. Go to your HelloSign account **Settings**. Select **Integrations** and | 1. Go to your HelloSign account **Settings**. Select **Integrations** and | ||||||
|    click on **API**. |    click on **API**. | ||||||
|   | |||||||
| @@ -3,7 +3,7 @@ is pushed to Heroku using the Zulip Heroku plugin! | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| 1. Go to your project on Heroku | 1. Go to your project on Heroku | ||||||
|    and click the **Resources** tab. Add the **Deploy Hooks** add-on. |    and click the **Resources** tab. Add the **Deploy Hooks** add-on. | ||||||
|   | |||||||
| @@ -5,7 +5,7 @@ in Zulip. | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| 1. Create an [IFTTT account](https://ifttt.com/join). Select the service you'd like | 1. Create an [IFTTT account](https://ifttt.com/join). Select the service you'd like | ||||||
|    to receive notifications from as `this`. Select **Webhooks** as |    to receive notifications from as `this`. Select **Webhooks** as | ||||||
|   | |||||||
| @@ -4,7 +4,7 @@ a website or service is up and running or down. | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| 1. On your Insping **Dashboard**, click on **Integrations**. Click | 1. On your Insping **Dashboard**, click on **Integrations**. Click | ||||||
|    on **Create Webhook**. |    on **Create Webhook**. | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ Get Intercom notifications in Zulip! | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| 1. Go to your Intercom account's **Settings** page and click on **Developers** | 1. Go to your Intercom account's **Settings** page and click on **Developers** | ||||||
|    on the left sidebar. Click on **Developer Hub** and click **New app**. |    on the left sidebar. Click on **Developer Hub** and click **New app**. | ||||||
|   | |||||||
| @@ -5,7 +5,7 @@ These instructions apply to Atlassian Cloud's hosted Jira, and Jira Server versi | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| 1. Go to your Jira **Site administration** page. Click **Jira** on the left. | 1. Go to your Jira **Site administration** page. Click **Jira** on the left. | ||||||
|    On the left sidebar, scroll down, and under **Advanced**, click **WebHooks**. |    On the left sidebar, scroll down, and under **Advanced**, click **WebHooks**. | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ Get Zulip notifications for your Jotform responses! | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|    By default, the integration will use the form's title as the topic. |    By default, the integration will use the form's title as the topic. | ||||||
|  |  | ||||||
| 1. In Jotform, go to **Form Builder**, and click on **Settings** tab. | 1. In Jotform, go to **Form Builder**, and click on **Settings** tab. | ||||||
|   | |||||||
| @@ -5,7 +5,7 @@ integration](/api/incoming-webhooks-overview). | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| 1.  Configure your application to send the webhook | 1.  Configure your application to send the webhook | ||||||
|     payload to the **URL** generated above. |     payload to the **URL** generated above. | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ Get Zulip notifications for your Librato/AppOptics alerts! | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|    By default, the integration will use the name of the alert. |    By default, the integration will use the name of the alert. | ||||||
|  |  | ||||||
| 1. Go to your AppOptics/Librato homepage, and click on **Settings** | 1. Go to your AppOptics/Librato homepage, and click on **Settings** | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ Receive Lidarr notifications in Zulip! | |||||||
|  |  | ||||||
| 1.  {!create-stream.md!} | 1.  {!create-stream.md!} | ||||||
|  |  | ||||||
| 1.  {!create-bot-construct-url-indented.md!} | 1.  {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| 1.  Go to your Lidarr dashboard. Click **Settings** and | 1.  Go to your Lidarr dashboard. Click **Settings** and | ||||||
|     click **Connect**. Click the **+** icon. |     click **Connect**. Click the **+** icon. | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ Get Mention notifications within Zulip via Zapier! | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| 1. Go to your Mention feed, and click on your profile in the top-right | 1. Go to your Mention feed, and click on your profile in the top-right | ||||||
|    corner. Select **Settings**. Click on **Integrations**. Select the |    corner. Select **Settings**. Click on **Integrations**. Select the | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ Get Zulip notifications for your Netlify deployments! | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 2. {!create-bot-construct-url-indented.md!} | 2. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| 3. Go to your Netlify project, and click **Settings**. Click **Build & deploy**, and select **Deploy notifications**. | 3. Go to your Netlify project, and click **Settings**. Click **Build & deploy**, and select **Deploy notifications**. | ||||||
|    Click **Add Notification**, and select **Outgoing webhook**. |    Click **Add Notification**, and select **Outgoing webhook**. | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ New Relic can send messages to a Zulip stream for incidents. | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| 1. On [New Relic](https://one.newrelic.com), | 1. On [New Relic](https://one.newrelic.com), | ||||||
|   select **Alerts & AI**. |   select **Alerts & AI**. | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ Get Zulip notifications for your Opbeat events! | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| 1. Go to your Opbeat **Organization Settings**. | 1. Go to your Opbeat **Organization Settings**. | ||||||
|  |  | ||||||
|   | |||||||
| @@ -3,7 +3,7 @@ when a new member signs-up on an **Open Collective** page. | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| 1. Go to [Open Collective Website](https://opencollective.com/), find | 1. Go to [Open Collective Website](https://opencollective.com/), find | ||||||
| your desired collective page, then go to *Settings* -> *Webhooks*, paste the | your desired collective page, then go to *Settings* -> *Webhooks*, paste the | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ Get Zulip notifications for your Opsgenie events! | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| 1. Go to <https://app.opsgenie.com/integration>. Click on | 1. Go to <https://app.opsgenie.com/integration>. Click on | ||||||
|    **Add New Integrations**, and select **Webhook**. |    **Add New Integrations**, and select **Webhook**. | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ Get Zulip notifications for your PagerDuty services! | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| 1. Open the **Integrations** tab, and click **Generic Webhooks (v3)**. | 1. Open the **Integrations** tab, and click **Generic Webhooks (v3)**. | ||||||
|  |  | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ Get Zulip notifications for your Papertrail logs! | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| 1. On your Papertrail dashboard, search for the logs you'd like | 1. On your Papertrail dashboard, search for the logs you'd like | ||||||
|    to set up alerts for, and click on **Save Search**. Provide a |    to set up alerts for, and click on **Save Search**. Provide a | ||||||
|   | |||||||
| @@ -3,7 +3,7 @@ uptime status changes from your Pingdom dashboard. | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| 1.  Next, go to the following URL: | 1.  Next, go to the following URL: | ||||||
|  |  | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ Get Zulip notifications for the stories in your Pivotal Tracker project! | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| 1. Go to your Pivotal project's **Settings** page, and click on **Webhooks**. | 1. Go to your Pivotal project's **Settings** page, and click on **Webhooks**. | ||||||
|  |  | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ Receive Radarr notifications in Zulip! | |||||||
|  |  | ||||||
| 1.  {!create-stream.md!} | 1.  {!create-stream.md!} | ||||||
|  |  | ||||||
| 1.  {!create-bot-construct-url-indented.md!} | 1.  {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| 1.  Go to your Radarr dashboard. Click **Settings** and click **Connect**. | 1.  Go to your Radarr dashboard. Click **Settings** and click **Connect**. | ||||||
|     Click the **+** icon. |     Click the **+** icon. | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ Get Zulip notifications for your Raygun events! | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| 1. Go to your Raygun dashboard, and click on **Integrations**. | 1. Go to your Raygun dashboard, and click on **Integrations**. | ||||||
|    Click on **Webhook**, and click on the **Setup** tab. |    Click on **Webhook**, and click on the **Setup** tab. | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ Get Review Board notifications in Zulip! | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| 1. On your Review Board **Dashboard**, click your team's name in the top-right | 1. On your Review Board **Dashboard**, click your team's name in the top-right | ||||||
|    corner, and click **Team administration**. Select **WebHooks** on the |    corner, and click **Team administration**. Select **WebHooks** on the | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ Get Zulip notifications for your Semaphore builds! | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| 1. In Semaphore 2.0, under **Configuration** select **Notifications**. Click on | 1. In Semaphore 2.0, under **Configuration** select **Notifications**. Click on | ||||||
|    **Create New Notification**. Add the the URL constructed above to the Webhook |    **Create New Notification**. Add the the URL constructed above to the Webhook | ||||||
|   | |||||||
| @@ -6,7 +6,7 @@ us](/help/contact-support) if a platform you care about is missing. | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 2. {!create-bot-construct-url-indented.md!} | 2. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
|     The default topic, if not set in the URL, will be the title of the |     The default topic, if not set in the URL, will be the title of the | ||||||
|     issue or event. |     issue or event. | ||||||
|   | |||||||
| @@ -5,7 +5,7 @@ See also the [Slack-compatible webhook](/integrations/doc/slack_incoming). | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
|     If you'd like to map Slack channels to different topics within the same |     If you'd like to map Slack channels to different topics within the same | ||||||
|     stream, add `&channels_map_to_topics=1` to the end of the URL. The `topic` |     stream, add `&channels_map_to_topics=1` to the end of the URL. The `topic` | ||||||
|   | |||||||
| @@ -4,7 +4,7 @@ API](https://api.slack.com/messaging/webhooks). | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| 1. Use your new webhook URL any place that you would use a Slack webhook. | 1. Use your new webhook URL any place that you would use a Slack webhook. | ||||||
|  |  | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ Get Zulip notifications for your Solano CI builds! | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| 1. Go to your Solano CI **Organizations** page, and click on | 1. Go to your Solano CI **Organizations** page, and click on | ||||||
|    **Organization Settings**. Click on **Web Hooks**. |    **Organization Settings**. Click on **Web Hooks**. | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ Get Zulip notifications for your Sonarqube code analysis! | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| 1. To configure webhooks for a specific SonarQube project, go to the project and select **Administration**. Select | 1. To configure webhooks for a specific SonarQube project, go to the project and select **Administration**. Select | ||||||
|  **Webhooks** and click **Create**. **Note**: you can also configure webhooks globally by going to **Configurations** -> |  **Webhooks** and click **Create**. **Note**: you can also configure webhooks globally by going to **Configurations** -> | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ Receive Sonarr notifications in Zulip! | |||||||
|  |  | ||||||
| 1.  {!create-stream.md!} | 1.  {!create-stream.md!} | ||||||
|  |  | ||||||
| 1.  {!create-bot-construct-url-indented.md!} | 1.  {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| 1.  Go to your Sonarr dashboard. Click **Settings** and click **Connect**. | 1.  Go to your Sonarr dashboard. Click **Settings** and click **Connect**. | ||||||
|     Click the **+** icon. |     Click the **+** icon. | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ See your Splunk Search alerts in Zulip! | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
|     If you do not specify a topic, the name of the search is used |     If you do not specify a topic, the name of the search is used | ||||||
|     (truncated to fit if needed). |     (truncated to fit if needed). | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ Get Zulip notifications for your Statuspage.io subscriptions! | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| 1. Go to your Statuspage Dashboard, and click on **Notifications** | 1. Go to your Statuspage Dashboard, and click on **Notifications** | ||||||
|    near the bottom-left corner. Select the **Webhook** tab. If webhook |    near the bottom-left corner. Select the **Webhook** tab. If webhook | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ Get Zulip notifications for Stripe events! | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| 1. On your Stripe Dashboard, click on **Developers** on the left | 1. On your Stripe Dashboard, click on **Developers** on the left | ||||||
|    sidebar. Click on **Webhooks**, and click on **+ Add endpoint**. |    sidebar. Click on **Webhooks**, and click on **+ Add endpoint**. | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ Receive Zulip notifications for your Taiga projects! | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
|     Make sure to specify the topic in the URL above. Otherwise, the |     Make sure to specify the topic in the URL above. Otherwise, the | ||||||
|     default topic `General` will be used. |     default topic `General` will be used. | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ Get Zulip notifications for your TeamCity builds! | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| 1. Install the [tcWebHooks plugin](https://github.com/tcplugins/tcWebHooks/releases) | 1. Install the [tcWebHooks plugin](https://github.com/tcplugins/tcWebHooks/releases) | ||||||
|    onto your TeamCity server. Follow the plugin instructions in your |    onto your TeamCity server. Follow the plugin instructions in your | ||||||
|   | |||||||
| @@ -4,7 +4,7 @@ Canarytokens from Thinkst's paid product, not [canarytokens.org][canarytokens] - | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| 1. Go to your Thinkst Canary settings, and click on **Webhooks** on | 1. Go to your Thinkst Canary settings, and click on **Webhooks** on | ||||||
|    the left sidebar. Select the **Generic** tab. Press |    the left sidebar. Select the **Generic** tab. Press | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ Get Transifex notifications in Zulip! | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| 1. On your Transifex Dashboard, select your project, and click on | 1. On your Transifex Dashboard, select your project, and click on | ||||||
|    **Settings**. Click on the **Webhooks** tab, and click |    **Settings**. Click on the **Webhooks** tab, and click | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ See your Travis CI build notifications in Zulip! | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|    By default, pull request events are ignored since most people |    By default, pull request events are ignored since most people | ||||||
|    don't want notifications for new pushes to pull requests.  To |    don't want notifications for new pushes to pull requests.  To | ||||||
|    enable notifications for pull request builds, just |    enable notifications for pull request builds, just | ||||||
|   | |||||||
| @@ -9,7 +9,7 @@ Get Zulip notifications from your Trello boards! | |||||||
|  |  | ||||||
| 1. {!create-stream.md!} | 1. {!create-stream.md!} | ||||||
|  |  | ||||||
| 1. {!create-bot-construct-url-indented.md!} | 1. {!create-bot-construct-url.md!} | ||||||
|  |  | ||||||
| 1. **Log in to Trello**, and collect the following three items: | 1. **Log in to Trello**, and collect the following three items: | ||||||
|  |  | ||||||
|   | |||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user