mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-04 05:53:43 +00:00 
			
		
		
		
	bugdown: Match up to 8 groups of nested parens
(imported from commit e3d61ec644fdb293322cab0a4449d8e1a27a513a)
This commit is contained in:
		@@ -532,6 +532,41 @@
 | 
			
		||||
      "sorry,http://example.com/",
 | 
			
		||||
      "<p>sorry,%s</p>",
 | 
			
		||||
      "http://example.com/"
 | 
			
		||||
    ],
 | 
			
		||||
    [
 | 
			
		||||
      "two nested parens https://zulip.com/(we_like_(to_nest_)_nest)_nest",
 | 
			
		||||
      "<p>two nested parens %s</p>",
 | 
			
		||||
      "https://zulip.com/(we_like_(to_nest_)_nest)_nest"
 | 
			
		||||
    ],
 | 
			
		||||
    [
 | 
			
		||||
      "three nested parens https://zulip.com/(we_like_(to_(and_)nest_)_nest)_nest",
 | 
			
		||||
      "<p>three nested parens %s</p>",
 | 
			
		||||
      "https://zulip.com/(we_like_(to_(and_)nest_)_nest)_nest"
 | 
			
		||||
    ],
 | 
			
		||||
    [
 | 
			
		||||
      "four nested parens https://zulip.com/(we_like_(to_n(e)st_)_n(es)t)_nest",
 | 
			
		||||
      "<p>four nested parens %s</p>",
 | 
			
		||||
      "https://zulip.com/(we_like_(to_n(e)st_)_n(es)t)_nest"
 | 
			
		||||
    ],
 | 
			
		||||
    [
 | 
			
		||||
      "six nested parens https://zulip.com/(we_like_((t(d(o(___)o)o))o_nest_)_nest)_nest",
 | 
			
		||||
      "<p>six nested parens %s</p>",
 | 
			
		||||
      "https://zulip.com/(we_like_((t(d(o(___)o)o))o_nest_)_nest)_nest"
 | 
			
		||||
    ],
 | 
			
		||||
    [
 | 
			
		||||
      "eight is too many https://zulip.com/(we_like_((t(d(o(_(1(2)1)__)o)o))o_nest_)_nest)_nest",
 | 
			
		||||
      "<p>eight is too many https://zulip.com/(we_like_((t(d(o(_(1(2)1)__)o)o))o_nest_)_nest)_nest</p>",
 | 
			
		||||
      ""
 | 
			
		||||
    ],
 | 
			
		||||
    [
 | 
			
		||||
      "nested with autodetection zulip.us/(we_like_(to_n(e)st_)_n(es)t)_nest",
 | 
			
		||||
      "<p>nested with autodetection %s</p>",
 | 
			
		||||
      "zulip.us/(we_like_(to_n(e)st_)_n(es)t)_nest"
 | 
			
		||||
    ],
 | 
			
		||||
    [
 | 
			
		||||
      "quora http://generate.quora.net/render?width=700&from=-4hours&until=now&height=400&bgcolor=black&lineMode=connected&title=arb%20hint%20status&target=alias(ans.hintland.hand.arb.enhint_rate%2C%22enhint%20rate%22)&target=alias(ans.hintland.hand.arb.unhint_rate%2C%22unhint%20rate%22)&target=alias(ans.hintland.hand.arb.size%2C%22hint%20size%22)&target=alias(scale(ans.vagabond.dingarb_cube_count%2C10000)%2C%22cube%20count%20x%2010K%22)&target=alias(scale(hnumbers.time.ding.gegevens.query.count%2C10)%2C%22ding%20gegevens%20query%20count%20x%2010%22)&fgcolor=white&uniq=0.44046106841415167",
 | 
			
		||||
      "<p>quora %s</p>",
 | 
			
		||||
      "http://generate.quora.net/render?width=700&from=-4hours&until=now&height=400&bgcolor=black&lineMode=connected&title=arb%20hint%20status&target=alias(ans.hintland.hand.arb.enhint_rate%2C%22enhint%20rate%22)&target=alias(ans.hintland.hand.arb.unhint_rate%2C%22unhint%20rate%22)&target=alias(ans.hintland.hand.arb.size%2C%22hint%20size%22)&target=alias(scale(ans.vagabond.dingarb_cube_count%2C10000)%2C%22cube%20count%20x%2010K%22)&target=alias(scale(hnumbers.time.ding.gegevens.query.count%2C10)%2C%22ding%20gegevens%20query%20count%20x%2010%22)&fgcolor=white&uniq=0.44046106841415167"
 | 
			
		||||
    ]
 | 
			
		||||
  ]
 | 
			
		||||
}
 | 
			
		||||
@@ -845,6 +845,23 @@ class Bugdown(markdown.Extension):
 | 
			
		||||
        # A link starts at a word boundary, and ends at space, punctuation, or end-of-input.
 | 
			
		||||
        #
 | 
			
		||||
        # We detect a url either by the `https?://` or by building around the TLD.
 | 
			
		||||
 | 
			
		||||
        # In lieu of having a recursive regex (which python doesn't support) to match
 | 
			
		||||
        # arbitrary numbers of nested matching parenthesis, we manually build a regexp that
 | 
			
		||||
        # can match up to six
 | 
			
		||||
        # The inner_paren_contents chunk matches the innermore non-parenthesis-holding text,
 | 
			
		||||
        # and the paren_group matches text with, optionally, a matching set of parens
 | 
			
		||||
        inner_paren_contents = r"[^\s()\"]*"
 | 
			
		||||
        paren_group = r"""
 | 
			
		||||
                        [^\s()\"]*?            # Containing characters that won't end the URL
 | 
			
		||||
                        (?: \( %s \)           # and more characters in matched parens
 | 
			
		||||
                            [^\s()\"]*?        # followed by more characters
 | 
			
		||||
                        )*                     # zero-or-more sets of paired parens
 | 
			
		||||
                       """
 | 
			
		||||
        nested_paren_chunk = paren_group
 | 
			
		||||
        for i in range(6):
 | 
			
		||||
            nested_paren_chunk = nested_paren_chunk % (paren_group,)
 | 
			
		||||
        nested_paren_chunk = nested_paren_chunk % (inner_paren_contents,)
 | 
			
		||||
        tlds = '|'.join(list_of_tlds())
 | 
			
		||||
        link_regex = r"""
 | 
			
		||||
            (?<![^\s'"\(,:<])    # Start after whitespace or specified chars
 | 
			
		||||
@@ -858,10 +875,7 @@ class Bugdown(markdown.Extension):
 | 
			
		||||
                    )
 | 
			
		||||
                )
 | 
			
		||||
                (?:/             # A path, beginning with /
 | 
			
		||||
                    [^\s()\"]*?            # Containing characters that won't end the URL
 | 
			
		||||
                    (?: \( [^\s()\"]* \)   # and more characters in matched parens
 | 
			
		||||
                        [^\s()\"]*?        # followed by more characters
 | 
			
		||||
                    )*                     # zero-or-more sets of paired parens
 | 
			
		||||
                    %s           # zero-to-6 sets of paired parens
 | 
			
		||||
                )?)              # Path is optional
 | 
			
		||||
                | (?:[\w.-]+\@[\w.-]+\.[\w]+) # Email is separate, since it can't have a path
 | 
			
		||||
            )
 | 
			
		||||
@@ -869,7 +883,7 @@ class Bugdown(markdown.Extension):
 | 
			
		||||
                [:;\?\),\.\'\"\>]*         # Optional punctuation characters
 | 
			
		||||
                (?:\Z|\s)                  # followed by whitespace or end of string
 | 
			
		||||
            )
 | 
			
		||||
            """ % (tlds,)
 | 
			
		||||
            """ % (tlds, nested_paren_chunk)
 | 
			
		||||
        md.inlinePatterns.add('autolink', AutoLink(link_regex), '>link')
 | 
			
		||||
 | 
			
		||||
        md.preprocessors.add('hanging_ulists',
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user