Repository: pre-commit/pre-commit-hooks

Issue:
Extend check for illegal Windows filenames
The `check-illegal-windows-names` hook does not check for every illegal filename on Windows. For example, filenames with "double" quotes are still allowed. 

Update the regex so that all illegal filenames get detected. Illegal Windows filenames are defined [here](https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file?wt.mc_id=studentamb_357056).

Discussion:

Solution patch:
diff --git a/.pre-commit-hooks.yaml b/.pre-commit-hooks.yaml
index 4242ef85..b71169bb 100644
--- a/.pre-commit-hooks.yaml
+++ b/.pre-commit-hooks.yaml
@@ -44,9 +44,9 @@
     minimum_pre_commit_version: 3.2.0
 -   id: check-illegal-windows-names
     name: check illegal windows names
-    entry: Illegal windows filenames detected
+    entry: Illegal Windows filenames detected
     language: fail
-    files: '(?i)((^|/)(CON|PRN|AUX|NUL|COM[1-9]|LPT[1-9])(\.|/|$)|:)'
+    files: '(?i)((^|/)(CON|PRN|AUX|NUL|COM[\d¹²³]|LPT[\d¹²³])(\.|/|$)|[<>:\"\\|?*\x00-\x1F]|/[^/]*[\.\s]/|[^/]*[\.\s]$)'
 -   id: check-json
     name: check json
     description: checks json files for parseable syntax.


Test patch:
diff --git a/tests/check_illegal_windows_names_test.py b/tests/check_illegal_windows_names_test.py
index 35a5be3b..82d75322 100644
--- a/tests/check_illegal_windows_names_test.py
+++ b/tests/check_illegal_windows_names_test.py
@@ -30,6 +30,17 @@ def hook_re():
         pytest.param('com7.dat', id='com with digit'),
         pytest.param(':', id='bare colon'),
         pytest.param('file:Zone.Identifier', id='mid colon'),
+        pytest.param('path/COM¹.json', id='com with superscript'),
+        pytest.param('dir/LPT³.toml', id='lpt with superscript'),
+        pytest.param('with < less than', id='with less than'),
+        pytest.param('Fast or Slow?.md', id='with question mark'),
+        pytest.param('with "double" quotes', id='with double quotes'),
+        pytest.param('with_null\x00byte', id='with null byte'),
+        pytest.param('ends_with.', id='ends with period'),
+        pytest.param('ends_with ', id='ends with space'),
+        pytest.param('ends_with\t', id='ends with tab'),
+        pytest.param('dir/ends./with.txt', id='directory ends with period'),
+        pytest.param('dir/ends /with.txt', id='directory ends with space'),
     ),
 )
 def test_check_illegal_windows_names_matches(hook_re, s):
@@ -42,6 +53,10 @@ def test_check_illegal_windows_names_matches(hook_re, s):
         pytest.param('README.md', id='standard file'),
         pytest.param('foo.aux', id='as ext'),
         pytest.param('com.dat', id='com without digit'),
+        pytest.param('.python-version', id='starts with period'),
+        pytest.param(' pseudo nan', id='with spaces'),
+        pytest.param('!@#$%^&;=≤\'~`¡¿€🤗', id='with allowed characters'),
+        pytest.param('path.to/file.py', id='standard path'),
     ),
 )
 def test_check_illegal_windows_names_does_not_match(hook_re, s):