Skip to content

Commit 2273c72

Browse files
committed
表示崩れチェックのCIとして、箇条書きのインデントをチェック #1362
1 parent d609dd1 commit 2273c72

39 files changed

+236
-159
lines changed
+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
name: display error check
2+
3+
on: [push, pull_request, workflow_dispatch]
4+
5+
jobs:
6+
build:
7+
runs-on: ubuntu-latest
8+
steps:
9+
- name: Set up Python
10+
uses: actions/setup-python@v5
11+
with:
12+
python-version: '3.x'
13+
- name: Install dependencies
14+
run: |
15+
python -m pip install --upgrade pip
16+
pip install requests
17+
- uses: actions/checkout@v4
18+
- name: check
19+
run: python3 .github/workflows/script/display_error_check.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import glob
2+
import os
3+
import sys
4+
import re
5+
6+
# consider tab
7+
def indent_length(s: str) -> int:
8+
length = 0
9+
for x in s:
10+
length += 1 if x == " " else 4
11+
return length
12+
13+
def check_item_indent(line: str, line_no: int, filename: str) -> bool:
14+
m = re.match(r'^(\s*?)([0-9] \.\s)', line)
15+
if m:
16+
indent: int = indent_length(m[1])
17+
if indent > 0 and indent % 4 != 0:
18+
print("{}:{}: number item indent {} shoule be 4. line:{}".format(filename, line_no, indent, line))
19+
return False
20+
return True
21+
22+
m = re.match(r'^(\s*?)([+-]\s)', line)
23+
if m:
24+
indent: int = indent_length(m[1])
25+
if indent > 0 and indent % 4 != 0:
26+
print("{}:{}: item indent {} shoule be 4. line:{}".format(filename, line_no, indent, line))
27+
return False
28+
return True
29+
30+
def check_display_error(text: str, filename: str) -> bool:
31+
found_error: bool = False
32+
in_code_block: bool = False
33+
34+
for i, line in enumerate(text.split("\n")):
35+
is_code_block = line.strip().startswith("```")
36+
if is_code_block:
37+
in_code_block = not in_code_block
38+
continue
39+
if in_code_block:
40+
continue
41+
42+
if not check_item_indent(line, i + 1, filename):
43+
found_error = True
44+
45+
return not found_error
46+
47+
if __name__ == '__main__':
48+
found_error = False
49+
for p in sorted(list(glob.glob("**/*.md", recursive=True))):
50+
with open(p) as f:
51+
text = f.read()
52+
53+
if not check_display_error(text, p):
54+
found_error = True
55+
56+
if found_error:
57+
sys.exit(1)

lang/cpp11/static_assert.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ static_assert(定数式, 文字列リテラル);
3737
- 定数式が真であると評価された場合は何も効果がない。定数式が偽であると評価された場合は、指定された文字列リテラルを含む診断メッセージがコンパイラによって問題報告される。ただし、基本ソース文字集合に含まれない文字集合は、診断メッセージに表示することはコンパイラに要求されない
3838
- `static_assert`宣言では、新たな型やオブジェクトは宣言しない。また、実行時にサイズや時間コストは発生しない
3939
- (CWG 2518が適用された環境): template文(もしくは適切な特殊化や[C++17 constexpr if 文](/lang/cpp17/if_constexpr.md)の中の文)が実際にインスタンス化されるまで、`static_assert`文の宣言は遅延される。
40-
- [C++17 constexpr if 文](/lang/cpp17/if_constexpr.md)の解説を参照
40+
- [C++17 constexpr if 文](/lang/cpp17/if_constexpr.md)の解説を参照
4141

4242
##
4343
```cpp example
@@ -99,4 +99,4 @@ Boost Static Assertion Libraryが開発されたときに、コンパイル時
9999
- [N1617 Proposal to Add Static Assertions to the Core Language (Revision 2)](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1617.html)
100100
- [N1720 Proposal to Add Static Assertions to the Core Language (Revision 3)](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1720.html)
101101
- [P2593R1: Allowing static_assert(false)](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2593r1.html)
102-
- [Issue 2518: Conformance requirements and #error/#warning - WG21 CWG Issues](https://wg21.cmeerw.net/cwg/issue2518)
102+
- [Issue 2518: Conformance requirements and #error/#warning - WG21 CWG Issues](https://wg21.cmeerw.net/cwg/issue2518)

lang/cpp17/guaranteed_copy_elision.md

+9-9
Original file line numberDiff line numberDiff line change
@@ -35,20 +35,20 @@ int k = X().n; // ok, X() prvalue は xvalue に変換される
3535
3636
不必要な一時オブジェクトの作成を避けるために、一時オブジェクトの実体化は一般に可能な限り遅らせる。
3737
注:一時オブジェクトは次のとき実体化されている。
38-
39-
- 参照を`prvalue`にバインドするとき
40-
- クラス`prvalue`でメンバアクセスを実行するとき
41-
- 配列からポインタへの変換を実行するとき、または配列`prvalue`をサブスクライブするとき
42-
- `braced-init-list`から`std::initializer_list<T>`型のオブジェクトを初期化するとき
43-
- 特定の未評価のオペランド、および`prvalue`が廃棄値式(`discarded-value expression`)として現れる場合
38+
39+
- 参照を`prvalue`にバインドするとき
40+
- クラス`prvalue`でメンバアクセスを実行するとき
41+
- 配列からポインタへの変換を実行するとき、または配列`prvalue`をサブスクライブするとき
42+
- `braced-init-list`から`std::initializer_list<T>`型のオブジェクトを初期化するとき
43+
- 特定の未評価のオペランド、および`prvalue`が廃棄値式(`discarded-value expression`)として現れる場合
4444
4545
これより、上の例は「クラス`prvalue`でメンバアクセスを実行するとき」にあたり、`xvalue`として一時オブジェクトを生成している。
4646
4747
また、`prvalue`から`prvalue`への変換は、上記の「一時オブジェクトの実体化は一般に可能な限り遅らせられる」ことより、一時オブジェクトを実体化しない。よって、次の例における`prvalue`の`T`型の戻り値は、呼び出し元の`t`を直接初期化する。
4848
4949
```cpp
50-
T Func() {return T();}
51-
T t = Func(); // 直接初期化
50+
T Func() {return T();}
51+
T t = Func(); // 直接初期化
5252
```
5353

5454
##
@@ -178,4 +178,4 @@ Foo x = foo(); // error Foo型のコピーコンストラクタが必要
178178
- [Guaranteed Copy Elision](https://jonasdevlieghere.com/guaranteed-copy-elision/)
179179
180180
## 注釈
181-
1. **<a id="note-1" href="#note_ref-1">^</a>** <cite>[右辺値、左辺値などの細かい定義 - Qiita](https://qiita.com/rinse_/items/cffa87016b7de49391ae)</cite>を参照
181+
1. **<a id="note-1" href="#note_ref-1">^</a>** <cite>[右辺値、左辺値などの細かい定義 - Qiita](https://qiita.com/rinse_/items/cffa87016b7de49391ae)</cite>を参照

lang/cpp23/lifetime_extension_in_range_based_for_loop.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ void foo() {
134134
- この `t` は "一時オブジェクトの寿命が `for-range-initializer` 完全式の終わりではない場合" にも該当すると考えられる
135135
- この `t` は、構文的に見ると `for-range-initializer` の中で生じたとは言えないという意見もある
136136
- "`for-range-initializer` の中" を実行時のことだと解釈すると、そこから呼び出された関数の中なども含むことになるが、それを排除する規定が "一時オブジェクトの寿命が `for-range-initializer` 完全式の終わりではない場合" ではないか
137-
- インライン展開されたときなどに効いてくるのかもしれない
137+
- インライン展開されたときなどに効いてくるのかもしれない
138138
139139
## 検討されたほかの選択肢
140140
@@ -149,4 +149,4 @@ void foo() {
149149
- [地に足のついた範囲for文 - 地面を見下ろす少年の足蹴にされる私](https://onihusube.hatenablog.com/entry/2022/12/05/000923)
150150
- [範囲for文範囲初期化子内の一時オブジェクト延命の説明見直し
151151
#1246](https://github.com/cpprefjp/site/issues/1246)
152-
- [Are function parameter objects temporary objects?](https://stackoverflow.com/questions/77676199/are-function-parameter-objects-temporary-objects/77676480)
152+
- [Are function parameter objects temporary objects?](https://stackoverflow.com/questions/77676199/are-function-parameter-objects-temporary-objects/77676480)

reference/algorithm.md

+4-4
Original file line numberDiff line numberDiff line change
@@ -273,11 +273,11 @@ ranges::sort(pv, {}, &Person::name);
273273
- `comp(a, b) && comp(b, c)` は `comp(a, c)` を意味する
274274
- `equiv(a, b) && equiv(b, c)` は `equiv(a, c)` を意味する
275275
276-
これらの前提のもと、以下を示すことができる。
276+
これらの前提のもと、以下を示すことができる。
277277
278-
- `equiv` は同値関係 (equivalence relation) である
279-
- `comp` は `equiv` によって決まる同値類 (equivalence class) の間での明確な関係を示す
280-
- その示される関係は狭義の全順序 (strict total ordering) である
278+
- `equiv` は同値関係 (equivalence relation) である
279+
- `comp` は `equiv` によって決まる同値類 (equivalence class) の間での明確な関係を示す
280+
- その示される関係は狭義の全順序 (strict total ordering) である
281281
282282
数学用語の日本語訳として "equivalence relation" には「同値関係」 "equivalence class" には「同値類」が定着しており、同じく数学的な文脈では上記 `equiv` を満たす2つの値を「同値」 (equivalent) であると言う。しかし特に数学的でない文脈で「同値」と言った場合は `operator==` による "equal" の関係と誤解される可能性が高いと考えられるため、本サイトでは上記 `equiv` による "equivalent" の関係を「等価」 `operator==` による "equal" の関係を「等値」として区別する。
283283

reference/compare/partial_ordering/op_equal.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,9 @@ friend constexpr bool operator==(/*unspecified*/, partial_ordering v) noexcept;
3434
## 備考
3535
この演算子により、以下の演算子が使用可能になる:
3636

37-
- `bool operator!=(partial_ordering v, partial_ordering w) noexcept;`
38-
- `bool operator!=(partial_ordering v, /*unspecified*/) noexcept;`
39-
- `bool operator!=(/*unspecified*/, partial_ordering w) noexcept;`
37+
- `bool operator!=(partial_ordering v, partial_ordering w) noexcept;`
38+
- `bool operator!=(partial_ordering v, /*unspecified*/) noexcept;`
39+
- `bool operator!=(/*unspecified*/, partial_ordering w) noexcept;`
4040

4141
*unspecified*となっている片側の引数には`0`リテラルのみが使用できる。それ以外の物を渡した場合、動作は未定義。
4242

reference/compare/strong_ordering/op_equal.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,9 @@ friend constexpr bool operator==(/*unspecified*/, strong_ordering v) noexcept;
3434
## 備考
3535
この演算子により、以下の演算子が使用可能になる:
3636

37-
- `bool operator!=(strong_ordering v, strong_ordering w) noexcept;`
38-
- `bool operator!=(strong_ordering v, /*unspecified*/) noexcept;`
39-
- `bool operator!=(/*unspecified*/, strong_ordering w) noexcept;`
37+
- `bool operator!=(strong_ordering v, strong_ordering w) noexcept;`
38+
- `bool operator!=(strong_ordering v, /*unspecified*/) noexcept;`
39+
- `bool operator!=(/*unspecified*/, strong_ordering w) noexcept;`
4040

4141
*unspecified*となっている片側の引数には`0`リテラルのみが使用できる。それ以外の物を渡した場合、動作は未定義。
4242

reference/compare/weak_ordering/op_equal.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,9 @@ friend constexpr bool operator==(/*unspecified*/, weak_ordering v) noexcept; /
3434
## 備考
3535
この演算子により、以下の演算子が使用可能になる:
3636

37-
- `bool operator!=(weak_ordering v, weak_ordering w) noexcept;`
38-
- `bool operator!=(weak_ordering v, /*unspecified*/) noexcept;`
39-
- `bool operator!=(/*unspecified*/, weak_ordering w) noexcept;`
37+
- `bool operator!=(weak_ordering v, weak_ordering w) noexcept;`
38+
- `bool operator!=(weak_ordering v, /*unspecified*/) noexcept;`
39+
- `bool operator!=(/*unspecified*/, weak_ordering w) noexcept;`
4040

4141
*unspecified*となっている片側の引数には`0`リテラルのみが使用できる。それ以外の物を渡した場合、動作は未定義。
4242

reference/concepts/swap.md

+4-4
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ namespace std::ranges {
2929
```
3030

3131
2. `a, b`が共に同じ長さの配列型の左辺値であり、`ranges::swap(*a, *b)`が呼び出し可能ならば`ranges::swap_ranges(a, b)`
32-
- 1か3に委譲して要素毎に`swap`される
32+
- 1か3に委譲して要素毎に`swap`される
3333

3434
3. `a, b`が共に同じ型`T`の左辺値であり、`T``T&`[`move_constructible<T>`](move_constructible.md)及び[`assignable_from<T&, T>`](assignable_from.md)のモデルとなる場合、[`std::swap()`](/reference/utility/swap.md)相当の操作によって`a, b`の値を交換する。
3535

@@ -56,9 +56,9 @@ namespace std::ranges {
5656
1. 呼び出される`swap(a, b)`(及び、もし返されるのならば戻り値のデストラクタ)が定数評価可能であるかに従う。
5757
2. `a, b`の要素型によって、1か3に従う
5858
3. 以下の条件を全て満たす場合に定数評価可能
59-
- `T`はリテラル型である
60-
- `a = std::move(b), b = std::move(a)`は共に定数評価可能
61-
- 次のような初期化式が定数評価可能
59+
- `T`はリテラル型である
60+
- `a = std::move(b), b = std::move(a)`は共に定数評価可能
61+
- 次のような初期化式が定数評価可能
6262
```cpp
6363
T t1(std::move(a));
6464
T t2(std::move(b));

reference/functional/copyable_function/op_constructor.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,8 @@ explicit copyable_function(in_place_type_t<T>, initializer_list<U>, Args&&...);
6666
## 効果
6767
- (1), (2) : 関数を持たない空の`copyable_function`オブジェクトを構築する。この方法で構築した後、[`operator bool`](op_bool.md)は`false`を返す。
6868
- (3) : `*this`の格納オブジェクトを
69-
- `f`が値を保持していない場合、値を保持しない。
70-
- そうでなければ、`f`が保持する値をコピーして保持する。
69+
- `f`が値を保持していない場合、値を保持しない。
70+
- そうでなければ、`f`が保持する値をコピーして保持する。
7171
- (4) : `f`が保持する状態を`*this`に移動する。移動された後の`f`は、未規定な値を持つ有効な状態となる。
7272
- (5) : `*this`の格納オブジェクトを
7373
- `f`が関数ポインタ型、メンバ関数ポインタ型、メンバ変数ポインタ型いずれかのヌルポインタ値の場合、値を保持しない。

reference/iterator/data.md

+12-12
Original file line numberDiff line numberDiff line change
@@ -34,18 +34,18 @@ namespace std {
3434
## 備考
3535
- [機能テストマクロ](../../lang/cpp17/feature_test_macros.md)は`__cpp_lib_nonmember_container_access`で値は`201411`
3636
- `<iterator>`ヘッダを読み込む以外では、以下のヘッダが読み込まれている場合に、この関数を使用できる:
37-
- [`<array>`](../array.md)
38-
- [`<deque>`](../deque.md)
39-
- [`<forward_list>`](../forward_list.md)
40-
- [`<list>`](../list.md)
41-
- [`<map>`](../map.md)
42-
- [`<regex>`](../regex.md)
43-
- [`<set>`](../set.md)
44-
- [`<string>`](../string.md)
45-
- [`<string_view>`](../string_view.md) (C++20)
46-
- [`<unordered_map>`](../unordered_map.md)
47-
- [`<unordered_set>`](../unordered_set.md)
48-
- [`<vector>`](../vector.md)
37+
- [`<array>`](../array.md)
38+
- [`<deque>`](../deque.md)
39+
- [`<forward_list>`](../forward_list.md)
40+
- [`<list>`](../list.md)
41+
- [`<map>`](../map.md)
42+
- [`<regex>`](../regex.md)
43+
- [`<set>`](../set.md)
44+
- [`<string>`](../string.md)
45+
- [`<string_view>`](../string_view.md) (C++20)
46+
- [`<unordered_map>`](../unordered_map.md)
47+
- [`<unordered_set>`](../unordered_set.md)
48+
- [`<vector>`](../vector.md)
4949
5050
5151
## 例

reference/iterator/empty.md

+12-12
Original file line numberDiff line numberDiff line change
@@ -40,18 +40,18 @@ namespace std {
4040
## 備考
4141
- [機能テストマクロ](../../lang/cpp17/feature_test_macros.md)は`__cpp_lib_nonmember_container_access`で値は`201411`
4242
- `<iterator>`ヘッダを読み込む以外では、以下のヘッダが読み込まれている場合に、この関数を使用できる:
43-
- [`<array>`](../array.md)
44-
- [`<deque>`](../deque.md)
45-
- [`<forward_list>`](../forward_list.md)
46-
- [`<list>`](../list.md)
47-
- [`<map>`](../map.md)
48-
- [`<regex>`](../regex.md)
49-
- [`<set>`](../set.md)
50-
- [`<string>`](../string.md)
51-
- [`<string_view>`](../string_view.md) (C++20)
52-
- [`<unordered_map>`](../unordered_map.md)
53-
- [`<unordered_set>`](../unordered_set.md)
54-
- [`<vector>`](../vector.md)
43+
- [`<array>`](../array.md)
44+
- [`<deque>`](../deque.md)
45+
- [`<forward_list>`](../forward_list.md)
46+
- [`<list>`](../list.md)
47+
- [`<map>`](../map.md)
48+
- [`<regex>`](../regex.md)
49+
- [`<set>`](../set.md)
50+
- [`<string>`](../string.md)
51+
- [`<string_view>`](../string_view.md) (C++20)
52+
- [`<unordered_map>`](../unordered_map.md)
53+
- [`<unordered_set>`](../unordered_set.md)
54+
- [`<vector>`](../vector.md)
5555
5656
5757
## 例

reference/iterator/move_iterator/op_assign.md

+5-5
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,12 @@ constexpr move_iterator& operator=(move_iterator&&) = default; // (3) C++17
2424
## テンプレートパラメータ制約
2525

2626
- C++17まで
27-
- (1) : `U``Iterator`に変換可能であること
27+
- (1) : `U``Iterator`に変換可能であること
2828
- C++20
29-
- (1) : 次の両方を満たす
30-
- `is_same_v<U, Iterator> == false`であること。
31-
- `const U&`[`convertible_to<Iterator>`](/reference/concepts/convertible_to.md)のモデルとなること。
32-
- `Iterator&, const U&`[`assignable_from<Iterator&, const U&>`](/reference/concepts/assignable_from.md)のモデルとなること。
29+
- (1) : 次の両方を満たす
30+
- `is_same_v<U, Iterator> == false`であること。
31+
- `const U&`[`convertible_to<Iterator>`](/reference/concepts/convertible_to.md)のモデルとなること。
32+
- `Iterator&, const U&`[`assignable_from<Iterator&, const U&>`](/reference/concepts/assignable_from.md)のモデルとなること。
3333

3434

3535
##

reference/iterator/move_iterator/op_constructor.md

+4-4
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,11 @@ constexpr move_iterator(move_iterator&&) noexcept = default; // (4) C++17
3131
## テンプレートパラメータ制約
3232
3333
- C++17まで
34-
- (3) : `U`が`Iterator`に変換可能であること
34+
- (3) : `U`が`Iterator`に変換可能であること
3535
- C++20
36-
- (3) : 次の全てを満たす
37-
- `is_same_v<U, Iterator> == false`であること。
38-
- `const U&, Iterator`が[`convertible_to<Iterator>`](/reference/concepts/convertible_to.md)のモデルとなること。
36+
- (3) : 次の全てを満たす
37+
- `is_same_v<U, Iterator> == false`であること。
38+
- `const U&, Iterator`が[`convertible_to<Iterator>`](/reference/concepts/convertible_to.md)のモデルとなること。
3939
4040
## 例
4141
```cpp example

reference/iterator/reverse_iterator/op_assign.md

+5-5
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,12 @@ constexpr reverse_iterator& operator=(const reverse_iterator<U>& u); // (
2020
## テンプレートパラメータ制約
2121

2222
- C++17まで
23-
- (2) : `U``Iterator`に変換可能であること
23+
- (2) : `U``Iterator`に変換可能であること
2424
- C++20
25-
- (2) : 次の両方を満たす
26-
- `is_same_v<U, Iterator> == false`であること。
27-
- `const U&, Iterator`[`convertible_to<Iterator>`](/reference/concepts/convertible_to.md)のモデルとなること。
28-
- `Iterator&, const U&`[`assignable_from<Iterator&, const U&>`](/reference/concepts/assignable_from.md)のモデルとなること。
25+
- (2) : 次の両方を満たす
26+
- `is_same_v<U, Iterator> == false`であること。
27+
- `const U&, Iterator`[`convertible_to<Iterator>`](/reference/concepts/convertible_to.md)のモデルとなること。
28+
- `Iterator&, const U&`[`assignable_from<Iterator&, const U&>`](/reference/concepts/assignable_from.md)のモデルとなること。
2929

3030

3131
## 戻り値

reference/iterator/reverse_iterator/op_constructor.md

+4-4
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,11 @@ constexpr reverse_iterator(const reverse_iterator<U>& u); // (3) C++17
2828
## テンプレートパラメータ制約
2929
3030
- C++17まで
31-
- (3) : `U`が`Iterator`に変換可能であること
31+
- (3) : `U`が`Iterator`に変換可能であること
3232
- C++20
33-
- (3) : 次の両方を満たす
34-
- `is_same_v<U, Iterator> == false`であること。
35-
- `const U&, Iterator`が[`convertible_to<Iterator>`](/reference/concepts/convertible_to.md)のモデルとなること。
33+
- (3) : 次の両方を満たす
34+
- `is_same_v<U, Iterator> == false`であること。
35+
- `const U&, Iterator`が[`convertible_to<Iterator>`](/reference/concepts/convertible_to.md)のモデルとなること。
3636
3737
## 要件
3838
- (3) : `U`が`Iterator`に変換可能であること

0 commit comments

Comments
 (0)