Skip to content

Commit 5b26921

Browse files
committed
ゼロ幅文字を削除し、禁止文字をチェック・削除するスクリプトを追加 #1487
1 parent 9402b83 commit 5b26921

File tree

7 files changed

+87
-9
lines changed

7 files changed

+87
-9
lines changed

.github/workflows/script/check.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import sys
22
import code_qualify_check
33
import display_error_check
4+
import forbidden_character_check
45
import global_qualify_check
56
import link_check
67
import meta_header_check
@@ -13,6 +14,9 @@
1314
if not display_error_check.check():
1415
print("display_error_check failed")
1516
sys.exit(1)
17+
if not forbidden_character_check.check():
18+
print("forbidden_character_check failed")
19+
sys.exit(1)
1620
if not global_qualify_check.check():
1721
print("global_qualify_check failed")
1822
sys.exit(1)
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import glob
2+
import os
3+
import sys
4+
import re
5+
import unicodedata
6+
7+
FORBIDDEN_CHARACTERS = [
8+
'\u00ad', # Soft hyphen (ソフトハイフン)
9+
'\u200b', # Zero width space (ゼロ幅スペース)
10+
]
11+
12+
def check_forbidden_character(text: str, filename: str) -> bool:
13+
found_error: bool = False
14+
15+
for char in FORBIDDEN_CHARACTERS:
16+
m = re.search(char, text)
17+
if m:
18+
code_point = ord(char)
19+
name = unicodedata.name(chr(code_point))
20+
print("{}: the file includes forbidden character \"U+{:X}\" ({}).".format(filename, code_point, name))
21+
found_error = True
22+
return not found_error
23+
24+
def check() -> bool:
25+
found_error = False
26+
for p in sorted(list(glob.glob("**/*.md", recursive=True))):
27+
with open(p) as f:
28+
text = f.read()
29+
30+
if not check_forbidden_character(text, p):
31+
found_error = True
32+
33+
return not found_error
34+
35+
if __name__ == '__main__':
36+
if not check():
37+
sys.exit(1)
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
# 禁止された不可視文字を削除するスクリプト。
2+
# トップディレクトリで以下を実行する:
3+
# python3 .github/workflows/script/remove_forbidden_character.py
4+
5+
import os
6+
import glob
7+
8+
FORBIDDEN_CHARACTERS = [
9+
'\u00ad', # Soft hyphen (ソフトハイフン)
10+
'\u200b', # Zero width space (ゼロ幅スペース)
11+
]
12+
13+
def remove_forbidden_characters(p) -> bool:
14+
try:
15+
with open(p, 'r', encoding='utf-8') as f:
16+
content = f.read()
17+
18+
original_content = content
19+
for char in FORBIDDEN_CHARACTERS:
20+
content = content.replace(char, '')
21+
22+
if content != original_content:
23+
with open(p, 'w', encoding='utf-8') as f:
24+
f.write(content)
25+
return True
26+
27+
return False
28+
29+
except Exception as e:
30+
print(f"Error processing {file_path}: {e}")
31+
return False
32+
33+
if __name__ == '__main__':
34+
for p in sorted(list(glob.glob("**/*.md", recursive=True))):
35+
if remove_forbidden_characters(p):
36+
print(f"{p} -> Modified")
37+

reference/spanstream/basic_ispanstream/op_constructor.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,13 @@ explicit basic_ispanstream(ROS&& s); // (4)
2929
3030
3131
## テンプレートパラメータ制約
32-
- (4) : `ROS` が [`ranges​::​borrowed_range`](/reference/ranges/borrowed_range.md) の要求を満たすこと (`(!convertible_to<ROS, std​::​span<charT>>) && convertible_to<ROS, std​::​span<const charT>>`が`true`であること)。
32+
- (4) : `ROS` が [`ranges::borrowed_range`](/reference/ranges/borrowed_range.md) の要求を満たすこと (`(!convertible_to<ROS, std::span<charT>>) && convertible_to<ROS, std::span<const charT>>`が`true`であること)。
3333
3434
## 効果
35-
- (1) : 内部で保持している [`basic_spanbuf<charT, traits>`](/reference/spanstream/basic_spanbuf.md) 型の固定長バッファを `sb` とすると、ベースクラスを `basic_istream<charT, traits>(addressof(sb))` で構築し、さらに `sb` を `basic_spanbuf<charT, traits>(s, which | ios_base​::​in)` で初期化する
35+
- (1) : 内部で保持している [`basic_spanbuf<charT, traits>`](/reference/spanstream/basic_spanbuf.md) 型の固定長バッファを `sb` とすると、ベースクラスを `basic_istream<charT, traits>(addressof(sb))` で構築し、さらに `sb` を `basic_spanbuf<charT, traits>(s, which | ios_base::in)` で初期化する
3636
- (2) : (削除)
37-
- (3) : 内部で保持している [`basic_spanbuf<charT, traits>`](/reference/spanstream/basic_spanbuf.md) 型の固定長バッファを `sb` とすると、ベースクラスを `std​::​move(rhs)` で構築し、さらに `sb` を `std​::​move(rhs.sb)` で初期化する。続いて、`basic_istream<charT, traits>​::​set_rdbuf(addressof(sb))` を呼び、[`basic_spanbuf`](/reference/spanstream/basic_spanbuf.md) を設定する。
38-
- (4) : `std​::​span<const charT>(std​::​forward<ROS>(s))` を `sp` とした時、`basic_ispanstream(std::span<charT>(const_cast<charT*>(sp.data()), sp.size()))` と同等
37+
- (3) : 内部で保持している [`basic_spanbuf<charT, traits>`](/reference/spanstream/basic_spanbuf.md) 型の固定長バッファを `sb` とすると、ベースクラスを `std::move(rhs)` で構築し、さらに `sb` を `std::move(rhs.sb)` で初期化する。続いて、`basic_istream<charT, traits>::set_rdbuf(addressof(sb))` を呼び、[`basic_spanbuf`](/reference/spanstream/basic_spanbuf.md) を設定する。
38+
- (4) : `std::span<const charT>(std::forward<ROS>(s))` を `sp` とした時、`basic_ispanstream(std::span<charT>(const_cast<charT*>(sp.data()), sp.size()))` と同等
3939
4040
4141
## 例

reference/spanstream/basic_ispanstream/span.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,13 @@ void span(ROS&& s) noexcept; // (3)
2323
2424
2525
## テンプレートパラメータ制約
26-
- (3) : `ROS` が [`ranges​::​borrowed_range`](/reference/ranges/borrowed_range.md) の要求を満たすこと (`(!convertible_to<ROS, std​::​span<charT>>) && convertible_to<ROS, std​::​span<const charT>>`が`true`であること)。
26+
- (3) : `ROS` が [`ranges::borrowed_range`](/reference/ranges/borrowed_range.md) の要求を満たすこと (`(!convertible_to<ROS, std::span<charT>>) && convertible_to<ROS, std::span<const charT>>`が`true`であること)。
2727
2828
2929
## 効果
3030
- (1) : `return rdbuf()->span();` と同等
3131
- (2) : `rdbuf()->span(s)` と同等
32-
- (3) : `std​::​span<const charT>(std​::​forward<ROS>(s))` を `sp` とした時、`this->span(std::span<charT>(const_cast<charT*>(sp.data()), sp.size()))` と同等
32+
- (3) : `std::span<const charT>(std::forward<ROS>(s))` を `sp` とした時、`this->span(std::span<charT>(const_cast<charT*>(sp.data()), sp.size()))` と同等
3333
3434
## 例
3535
```cpp example

reference/spanstream/basic_ospanstream/op_constructor.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@ basic_ospanstream(basic_ospanstream&& rhs); // (3)
2424
- (3) : ムーブコンストラクタ
2525
2626
## 効果
27-
- (1) : 内部で保持している [`basic_spanbuf<charT, traits>`](/reference/spanstream/basic_spanbuf.md) 型の固定長バッファを `sb` とすると、ベースクラスを `basic_ostream<charT, traits>(addressof(sb))` で構築し、さらに `sb` を `basic_spanbuf<charT, traits>(s, which | ios_base​::​out)` で初期化する
27+
- (1) : 内部で保持している [`basic_spanbuf<charT, traits>`](/reference/spanstream/basic_spanbuf.md) 型の固定長バッファを `sb` とすると、ベースクラスを `basic_ostream<charT, traits>(addressof(sb))` で構築し、さらに `sb` を `basic_spanbuf<charT, traits>(s, which | ios_base::out)` で初期化する
2828
- (2) : (削除)
29-
- (3) : 内部で保持している [`basic_spanbuf<charT, traits>`](/reference/spanstream/basic_spanbuf.md) 型の固定長バッファを `sb` とすると、ベースクラスを `std​::​move(rhs)` で構築し、さらに `sb` を `std​::​move(rhs.sb)` で初期化する。続いて、`basic_ostream<charT, traits>​::​set_rdbuf(addressof(sb))` を呼び、[`basic_spanbuf`](/reference/spanstream/basic_spanbuf.md) を設定する。
29+
- (3) : 内部で保持している [`basic_spanbuf<charT, traits>`](/reference/spanstream/basic_spanbuf.md) 型の固定長バッファを `sb` とすると、ベースクラスを `std::move(rhs)` で構築し、さらに `sb` を `std::move(rhs.sb)` で初期化する。続いて、`basic_ostream<charT, traits>::set_rdbuf(addressof(sb))` を呼び、[`basic_spanbuf`](/reference/spanstream/basic_spanbuf.md) を設定する。
3030
3131
3232
## 例

reference/spanstream/basic_spanstream/op_constructor.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ basic_spanstream(basic_spanstream&& rhs); // (3)
2828
## 効果
2929
- (1) : 内部で保持している [`basic_spanbuf<charT, traits>`](/reference/spanstream/basic_spanbuf.md) 型の固定長バッファを `sb` とすると、ベースクラスを `basic_iostream<charT, traits>(addressof(sb))` で構築し、さらに `sb` を `basic_spanbuf<charT, traits>(s, which)` で初期化する
3030
- (2) : (削除)
31-
- (3) : 内部で保持している [`basic_spanbuf<charT, traits>`](/reference/spanstream/basic_spanbuf.md) 型の固定長バッファを `sb` とすると、ベースクラスを `std​::​move(rhs)` で構築し、さらに `sb` を `std​::​move(rhs.sb)` で初期化する。続いて、`basic_ostream<charT, traits>​::​set_rdbuf(addressof(sb))` を呼び、[`basic_spanbuf`](/reference/spanstream/basic_spanbuf.md) を設定する。
31+
- (3) : 内部で保持している [`basic_spanbuf<charT, traits>`](/reference/spanstream/basic_spanbuf.md) 型の固定長バッファを `sb` とすると、ベースクラスを `std::move(rhs)` で構築し、さらに `sb` を `std::move(rhs.sb)` で初期化する。続いて、`basic_ostream<charT, traits>::set_rdbuf(addressof(sb))` を呼び、[`basic_spanbuf`](/reference/spanstream/basic_spanbuf.md) を設定する。
3232
3333
3434
## 例

0 commit comments

Comments
 (0)