@@ -371,22 +371,22 @@ def link_html(
371371
372372# The builtin re doesn't support variable-width lookbehind,
373373# so instead we use a match groups in all pre patterns to remove the non-content.
374- no_dot_prere = r'(?<!<span class="o">\.</span>)()'
374+ no_dot_pre = r'(?<!<span class="o">\.</span>)()'
375375# Potentially instead assert an initial closing parenthesis followed by a dot.
376- call_dot_prere = r'(\)</span>\s*<span class="o">\.</span>\s*)'
377- # Pygments 2.19 changed import whitespace highlighting
378- # so we need to support both for now (see #152)
379- import_prere = (
380- r'((<span class="kn">import</span>(<span class="w">\s+</span>)|(/s+)(<span class="p">\(</span>\s*)?)'
381- r'|(<span class="[op]">,</span>(<span class="w">\s*</span>)|(\s*)))'
376+ call_dot_pre = r'(\)</span>\s*<span class="o">\.</span>\s*)'
377+ no_dot_post = r'(?!(<span class="o">\.)|(</a>))'
378+
379+ # Pygments 2.19 changed import whitespace highlighting so we need to support both
380+ # with "w" class and raw whitespace for now (see #152)
381+ whitespace = r'(<span class="w">\s*</span>)|(\s*)'
382+ import_pre = (
383+ rf'((<span class="kn">import</span>{ whitespace } (<span class="p">\(</span>\s*)?)'
384+ rf'|(<span class="[op]">,</span>{ whitespace } ))'
382385)
383- from_prere = r'(<span class="kn">from</span>( <span class="w">\s+</span>)|(\s+) )'
386+ import_post = r'(?=($)|(\s+)|( <span class="[opw]">))(?!</a> )'
384387
385- no_dot_postre = r'(?!(<span class="o">\.)|(</a>))'
386- import_postre = (
387- r'(?=($)|(\s+)|(<span class="w">)|(<span class="[op]">,</span>)|(<span class="p">\)))(?!</a>)'
388- )
389- from_postre = r'(?=(<span class="w">\s*</span>)|(\s*)<span class="kn">import</span>)'
388+ from_pre = rf'(<span class="kn">from</span>{ whitespace } )'
389+ from_post = rf'(?={ whitespace } <span class="kn">import</span>)'
390390
391391
392392def construct_name_pattern (name : Name ) -> str :
@@ -397,17 +397,17 @@ def construct_name_pattern(name: Name) -> str:
397397 [first_name_pattern .format (name = parts [0 ])]
398398 + [name_pattern .format (name = p ) for p in parts [1 :]]
399399 )
400- return no_dot_prere + pattern + no_dot_postre
400+ return no_dot_pre + pattern + no_dot_post
401401 elif name .context == LinkContext .after_call :
402402 parts = name .code_str .split ("." )
403403 pattern = period .join (
404404 [first_name_pattern .format (name = parts [0 ])]
405405 + [name_pattern .format (name = p ) for p in parts [1 :]]
406406 )
407- return call_dot_prere + pattern + no_dot_postre
407+ return call_dot_pre + pattern + no_dot_post
408408 elif name .context == LinkContext .import_from :
409409 pattern = import_from_pattern .format (name = name .code_str )
410- return from_prere + pattern + from_postre
410+ return from_pre + pattern + from_post
411411 elif name .context == LinkContext .import_target :
412412 pattern = import_target_pattern .format (name = name .code_str )
413- return import_prere + pattern + import_postre
413+ return import_pre + pattern + import_post
0 commit comments