Repository: spikeinterface/spikeinterface
Issue: Sphinx (6.1.3) Fails to build documentation

Sphinx throws an exception when trying to build the docs.  Looks like the issue is in widgets.  See traceback:
```
>>> make html
...
updating environment: [new config] 81 added, 0 changed, 0 removed
/Users/pauladkisson/Documents/CatalystNeuro/spikeinterface_select_peaks_bug/spikeinterface/spikeinterface/widgets/base.py:docstring of spikeinterface.widgets.base.define_widget_function_from_class.<locals>.widget_func:94: WARNING: Inline strong start-string without end-string.

Exception occurred:
  File "/opt/anaconda3/envs/sienv_selectpeaks/lib/python3.9/site-packages/sphinx/ext/extlinks.py", line 98, in role
    full_url = base_url % part
TypeError: not all arguments converted during string formatting
```

Note: Previous version of sphinx (5.0.2) raises a warning about this exact error:
```
>>> make html
...
loading intersphinx inventory from https://probeinterface.readthedocs.io/en/stable/objects.inv...
WARNING: extlinks: Sphinx-6.0 will require base URL to contain exactly one '%s' and all other '%' need to be escaped as '%%'.
building [mo]: targets for 0 po files that are out of date
building [html]: targets for 81 source files that are out of date
updating environment: [new config] 81 added, 0 changed, 0 removed
reading sources... [100%] whatisnew                                                                                                            
/Users/pauladkisson/Documents/CatalystNeuro/spikeinterface_select_peaks_bug/spikeinterface/spikeinterface/widgets/base.py:docstring of spikeinterface.widgets.base.define_widget_function_from_class.<locals>.widget_func:99: WARNING: Inline strong start-string without end-string.
...
```

Changed files:
spikeinterface/core/sparsity.py, doc/conf.py

diff --git a/doc/conf.py b/doc/conf.py
index 16088ea6..2d18f1f0 100644
--- a/doc/conf.py
+++ b/doc/conf.py
@@ -130,5 +130,5 @@ intersphinx_mapping = {
 }
 
 extlinks = {
-    "probeinterface": ("https://probeinterface.readthedocs.io/", "%s"),
+    "probeinterface": ("https://probeinterface.readthedocs.io/%s", None),
 }
\\ No newline at end of file
diff --git a/spikeinterface/core/sparsity.py b/spikeinterface/core/sparsity.py
index 1f43f406..af6eb555 100644
--- a/spikeinterface/core/sparsity.py
+++ b/spikeinterface/core/sparsity.py
@@ -38,9 +38,11 @@ class ChannelSparsity:
         * ChannelSparsity.unit_id_to_channel_indices : unit_id channel_inds
 
     By default it is constructed with a boolean array:
+
     >>> sparsity = ChannelSparsity(mask, unit_ids, channel_ids)
 
     But can be also constructed from a dictionary:
+
     >>> sparsity = ChannelSparsity.from_unit_id_to_channel_ids(unit_id_to_channel_ids, unit_ids, channel_ids)
 
     Parameters
@@ -59,15 +61,19 @@ class ChannelSparsity:
     with several methods:
 
     Using the N best channels (largest template amplitude):
+
     >>> sparsity = ChannelSparsity.from_best_channels(we, num_channels, peak_sign='neg')
 
     Using a neighborhood by radius:
+
     >>> sparsity = ChannelSparsity.from_radius(we, radius_um, peak_sign='neg')
 
     Using a SNR threshold:
+
     >>> sparsity = ChannelSparsity.from_threshold(we, threshold, peak_sign='neg')
 
     Using a recording/sorting property (e.g. 'group'):
+    
     >>> sparsity = ChannelSparsity.from_property(we, by_property="group")
 
     """