Skip to content

Commit d75cd8f

Browse files
committed
コメントから句点を外し、README と「はじめに」を書き直す
コメント: - 全言語のコメントから句点を取り除いた(2,666 行) 文が続くものは行を分けて表す - check_comments.py に句点の検査を足した - Python の docstring は閉じ引用符を独立行にした ドキュメント: - 公開先やビルドの経緯にあたる記述を落とした - README の表を 1 つにまとめ、太字を必要な箇所だけに絞った - 「はじめに」5 ファイルの文体を「です・ます」で揃えた 全言語のテスト 743 件と適合性 779 件は変わらず通っている。
1 parent 6e87c7d commit d75cd8f

144 files changed

Lines changed: 4337 additions & 2832 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎.github/release-notes.md‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
Minecraft **Java版 26.2**(DataVersion `4903`)のワールドデータ・NBTファイルを
22
読み書きするライブラリです。
33

4-
パッケージレジストリへは公開していません。**下の成果物をダウンロードして、
5-
自分のプロジェクトへ組み込んでください。**
4+
下の成果物をダウンロードして、自分のプロジェクトへ組み込んでください。
65

76
## 成果物
87

‎README.md‎

Lines changed: 36 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -4,86 +4,60 @@
44
[![lint](https://github.com/ScriptArts/SpringNBTLibrary/actions/workflows/lint.yml/badge.svg)](https://github.com/ScriptArts/SpringNBTLibrary/actions/workflows/lint.yml)
55
[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
66

7-
Minecraft **Java版 26.2**(DataVersion `4903`)のワールドデータ・NBTファイルを読み書きするライブラリ。
8-
9-
**複数の言語へ、同じ概念モデルと同じ挙動のものを提供する。**
7+
Minecraft Java版 26.2(DataVersion `4903`)のワールドデータ・NBTファイルを読み書きするライブラリです。
8+
複数の言語に、同じ概念モデルと同じ挙動のものを用意しています。
109

1110
## 対応言語
1211

13-
対応言語は今後も追加していく。現在対応しているのは次のとおり。
12+
[Releases](https://github.com/ScriptArts/SpringNBTLibrary/releases) から落として、自分のプロジェクトに組み込んでください。
1413

15-
| 言語 | パッケージ名 | 必要環境 | はじめに |
14+
| 言語 | 必要環境 | 入手するもの | 組み込み方 |
1615
|---|---|---|---|
17-
| C# | `SpringNBTLibrary` | .NET 8 / C# 12 | [導入と最小サンプル](docs/getting-started/csharp.md) |
18-
| Java | `io.github.scriptarts:spring-nbt-library` | Java 21 (LTS) | [導入と最小サンプル](docs/getting-started/java.md) |
19-
| TypeScript | `spring-nbt-library` | Node.js 20+ / TypeScript 5.7+ | [導入と最小サンプル](docs/getting-started/typescript.md) |
20-
| Python | `spring-nbt-library` | Python 3.10+ | [導入と最小サンプル](docs/getting-started/python.md) |
21-
| Rust | `spring-nbt-library` | Rust 1.75+ (2021 edition) | [導入と最小サンプル](docs/getting-started/rust.md) |
16+
| [C#](docs/getting-started/csharp.md) | .NET 8 / C# 12 | `SpringNBTLibrary-<版>-dotnet8.zip` | 展開して `.dll` を参照に追加 |
17+
| [Java](docs/getting-started/java.md) | Java 21 (LTS) | `spring-nbt-library-<版>.jar` | クラスパスへ追加 |
18+
| [TypeScript](docs/getting-started/typescript.md) | Node.js 20+ | `spring-nbt-library-<版>.tgz` | `npm install ./<ファイル>` |
19+
| [Python](docs/getting-started/python.md) | Python 3.10+ | `spring_nbt_library-<版>-py3-none-any.whl` | `pip install <ファイル>` |
20+
| [Rust](docs/getting-started/rust.md) | Rust 1.75+ | — | `Cargo.toml` で git 参照 |
2221

23-
新しい言語を足す手順は [移植ガイド](docs/contributing/porting-guide.md) にまとめてある。
24-
言語が増えても、仕様書とテストベクタは共通のものを使う。
22+
同梱の `SHA256SUMS.txt` でファイルの整合を確認できます。
2523

26-
## 入手
24+
対応言語は今後も増やします。手順は [移植ガイド](docs/contributing/porting-guide.md) にあります。
2725

28-
パッケージレジストリへは公開していない。
29-
**[Releases](https://github.com/ScriptArts/SpringNBTLibrary/releases) から
30-
ビルド済みの成果物を落として、自分のプロジェクトへ組み込む。**
26+
## 何が違うのか
3127

32-
| 言語 | ファイル | 組み込み方 |
33-
|---|---|---|
34-
| C# | `SpringNBTLibrary-<版>-dotnet8.zip` | 展開して `.dll` を参照に追加 |
35-
| Java | `spring-nbt-library-<版>.jar` | クラスパスへ追加 |
36-
| TypeScript | `spring-nbt-library-<版>.tgz` | `npm install ./<ファイル>` |
37-
| Python | `spring_nbt_library-<版>-py3-none-any.whl` | `pip install <ファイル>` |
38-
| Rust | — | `Cargo.toml` で git 参照(`.crate` も置いてある) |
28+
NBT や Anvil を扱うライブラリは各言語にあります。
29+
このライブラリは、同じ仕様書と同じテストベクタから対応言語すべてを同時に作っています。
3930

40-
同梱の `SHA256SUMS.txt` で、落としたファイルが壊れていないか確かめられる。
41-
言語ごとの詳しい手順は上の表の「はじめに」を参照。
31+
Rust のツールと Java のプラグインで同じワールドを触るとき、
32+
言語ごとに挙動の違うライブラリを組み合わせて悩まずに済むことを狙っています。
4233

43-
## このライブラリの立ち位置
34+
そのために次を守っています。
4435

45-
NBT や Anvil を扱うライブラリは各言語に既に存在する。
46-
本ライブラリの違いは、**同じ設計者が、同じ仕様書と同じテストベクタから、
47-
対応言語すべての実装を同時に提供している**点にある。
36+
- `docs/spec/` を唯一の正とし、各言語はその実装にすぎない
37+
- 挙動の一致は目視ではなく[適合性テスト](docs/spec/90-conformance.md)で確かめる
38+
- [機能一覧](docs/features.md)が実装からずれないよう CI で検査する
4839

49-
複数言語が絡むプロジェクト(Rust のツールと Java のプラグインで同じワールドを扱う、など)で、
50-
言語ごとに挙動の違うライブラリを組み合わせて悩む必要をなくすことを狙っている。
40+
## ドキュメント
5141

52-
そのため次を最優先で維持している。
42+
[目次](docs/README.md)から辿れます。
5343

54-
1. `docs/spec/` が唯一の正であり、各言語実装はその実装であること
55-
2. 対応言語すべての挙動一致を、人手のレビューではなく**適合性テストで機械的に保証**すること
56-
3. [機能一覧](docs/features.md)が実装と乖離しないよう CI で検証すること
44+
| 読みたいこと | 場所 |
45+
|---|---|
46+
| 何ができるか | [機能一覧](docs/features.md) |
47+
| とりあえず動かす | [はじめに](docs/getting-started/) |
48+
| 使い方 | [ガイド](docs/guide/) |
49+
| 他言語版との対応 | [API対応表](docs/api/overview.md) |
50+
| 自分で実装・移植する | [仕様](docs/spec/00-conventions.md) |
51+
| 設計の理由 | [ADR](docs/adr/) |
5752

58-
## ドキュメント
53+
## 検証
5954

60-
**[ドキュメントの目次はこちら](docs/README.md)**
55+
NBT・Anvil・World の3レイヤを Java版 26.2 の実ワールドで確かめています。
56+
`.dat` 23個とチャンク 3,717個のすべてで、読み込みとバイト一致の書き戻しが通りました。
57+
World レイヤでも 3,481 チャンク(83,544 セクション)の再エンコードが原本と一致し、
58+
393万ブロックの読み出しに成功しています。
6159

62-
| 目的 | 読むもの |
63-
|---|---|
64-
| 何ができるのか知りたい | [機能一覧](docs/features.md) |
65-
| とりあえず動かしたい | [はじめに](docs/getting-started/) |
66-
| 使い方を調べたい | [ガイド](docs/guide/) |
67-
| 他の言語版の対応するAPIを知りたい | [API対応表](docs/api/overview.md) |
68-
| 自分で実装・移植したい | [仕様](docs/spec/00-conventions.md) |
69-
| なぜその設計なのか知りたい | [設計判断の記録](docs/adr/) |
70-
71-
## 対応状況
72-
73-
| レイヤ | 内容 | 状態 |
74-
|---|---|---|
75-
| 1. NBT | 全13タグ・MUTF-8・圧縮・SNBT | ✅ 対応言語すべてで完成 |
76-
| 2. Anvil | `.mca` リージョンファイルの読み書き | ✅ 対応言語すべてで完成 |
77-
| 3. World / Block | `level.dat`・チャンク・ブロック操作 | ✅ 対応言語すべてで完成 |
78-
79-
機能ごと・言語ごとの詳細は [機能一覧](docs/features.md) を参照。
80-
81-
3レイヤすべて **Java版 26.2 の実ワールドで検証済み**。
82-
`.dat` 23個 + チャンク 3,717個 = 3,740件すべてで読み込みとバイト一致のラウンドトリップに成功し、
83-
World レイヤでも 3,481 チャンク(83,544 セクション)の再エンコードが原本と一致、
84-
393万ブロックの読み出しも通っています。
85-
代表ファイルは対応言語すべてで出力が完全一致することも確認済みです。
86-
自分のワールドで試すには:
60+
自分のワールドで試すこともできます。読み取りしかしません。
8761

8862
```bash
8963
python3 spec/tools/scan_world.py "<ワールドのパス>"

‎csharp/src/SpringNBTLibrary/Anvil/ChunkCompression.cs‎

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,47 @@
11
namespace SpringNBTLibrary.Anvil;
22

33
/// <summary>
4-
/// リージョンファイル内でチャンクに使われる圧縮方式。値は仕様が定める圧縮方式IDと一致する。
4+
/// リージョンファイル内でチャンクに使われる圧縮方式
5+
/// 値は仕様が定める圧縮方式IDと一致する
56
/// </summary>
67
/// <remarks>
78
/// <para>
8-
/// NBT 層の <see cref="Nbt.Compression"/> とは別物であることに注意。
9-
/// あちらはファイル全体の圧縮を表し、こちらはリージョン内の 1 チャンクに付く 1 バイトのIDを表す。
9+
/// NBT 層の <see cref="Nbt.Compression"/> とは別物であることに注意
10+
/// あちらはファイル全体の圧縮を表し、こちらはリージョン内の 1 チャンクに付く 1 バイトのIDを表す
1011
/// </para>
1112
/// <para>仕様: <c>docs/spec/20-anvil-region.md</c> 3.1章</para>
1213
/// </remarks>
1314
public enum ChunkCompression
1415
{
15-
/// <summary>GZip (RFC 1952)。ID=1。実データではほぼ使われない。</summary>
16+
/// <summary>GZip (RFC 1952)
17+
/// ID=1
18+
/// 実データではほぼ使われない</summary>
1619
Gzip = 1,
1720

18-
/// <summary>Zlib (RFC 1950)。ID=2。Minecraft が実際に書き出す方式。</summary>
21+
/// <summary>Zlib (RFC 1950)
22+
/// ID=2
23+
/// Minecraft が実際に書き出す方式</summary>
1924
Zlib = 2,
2025

21-
/// <summary>無圧縮。ID=3。</summary>
26+
/// <summary>無圧縮
27+
/// ID=3</summary>
2228
None = 3,
2329

24-
/// <summary>LZ4(ブロック形式)。ID=4。任意依存。</summary>
30+
/// <summary>LZ4(ブロック形式)
31+
/// ID=4
32+
/// 任意依存</summary>
2533
Lz4 = 4,
2634

27-
/// <summary>サードパーティ製サーバのカスタム方式。ID=127。中身は解釈できない。</summary>
35+
/// <summary>サードパーティ製サーバのカスタム方式
36+
/// ID=127
37+
/// 中身は解釈できない</summary>
2838
Custom = 127,
2939
}
3040

31-
/// <summary><see cref="ChunkCompression"/> の拡張メソッド。</summary>
41+
/// <summary><see cref="ChunkCompression"/> の拡張メソッド</summary>
3242
public static class ChunkCompressionExtensions
3343
{
34-
/// <summary>適合性テストで言語間比較に使う識別子を返す。</summary>
44+
/// <summary>適合性テストで言語間比較に使う識別子を返す</summary>
3545
public static string AsString(this ChunkCompression compression)
3646
{
3747
switch (compression)
@@ -53,9 +63,9 @@ public static string AsString(this ChunkCompression compression)
5363
}
5464

5565
/// <summary>
56-
/// 圧縮方式IDから <see cref="ChunkCompression"/> を得る。
66+
/// 圧縮方式IDから <see cref="ChunkCompression"/> を得る
5767
/// </summary>
58-
/// <exception cref="SpringNbtException">未知のIDの場合(<see cref="ErrorCode.MalformedData"/>)。</exception>
68+
/// <exception cref="SpringNbtException">未知のIDの場合(<see cref="ErrorCode.MalformedData"/>)</exception>
5969
public static ChunkCompression FromId(int id)
6070
{
6171
// 仕様が定めるのは 1・2・3・4・127 の 5 種類だけ

‎csharp/src/SpringNBTLibrary/Anvil/ChunkPos.cs‎

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,35 +3,35 @@
33
namespace SpringNBTLibrary.Anvil;
44

55
/// <summary>
6-
/// チャンクの絶対座標。
6+
/// チャンクの絶対座標
77
/// </summary>
88
/// <remarks>仕様: <c>docs/spec/20-anvil-region.md</c> 1章</remarks>
99
public readonly struct ChunkPos : IEquatable<ChunkPos>
1010
{
11-
/// <summary>座標を指定して作る。</summary>
11+
/// <summary>座標を指定して作る</summary>
1212
public ChunkPos(int x, int z)
1313
{
1414
X = x;
1515
Z = z;
1616
}
1717

18-
/// <summary>絶対チャンクX座標。</summary>
18+
/// <summary>絶対チャンクX座標</summary>
1919
public int X { get; }
2020

21-
/// <summary>絶対チャンクZ座標。</summary>
21+
/// <summary>絶対チャンクZ座標</summary>
2222
public int Z { get; }
2323

24-
/// <summary>このチャンクを含むリージョンの座標。</summary>
25-
/// <remarks>算術右シフトなので負の座標でも正しく求まる。</remarks>
24+
/// <summary>このチャンクを含むリージョンの座標</summary>
25+
/// <remarks>算術右シフトなので負の座標でも正しく求まる</remarks>
2626
public RegionPos Region => new RegionPos(X >> 5, Z >> 5);
2727

28-
/// <summary>リージョン内でのX位置 (0..31)。</summary>
28+
/// <summary>リージョン内でのX位置 (0..31)</summary>
2929
public int LocalX => X & 31;
3030

31-
/// <summary>リージョン内でのZ位置 (0..31)。</summary>
31+
/// <summary>リージョン内でのZ位置 (0..31)</summary>
3232
public int LocalZ => Z & 31;
3333

34-
/// <summary>ロケーションテーブル内の添字 (0..1023)。</summary>
34+
/// <summary>ロケーションテーブル内の添字 (0..1023)</summary>
3535
public int Index => LocalX + (LocalZ * 32);
3636

3737
/// <inheritdoc/>
@@ -43,10 +43,10 @@ public ChunkPos(int x, int z)
4343
/// <inheritdoc/>
4444
public override int GetHashCode() => HashCode.Combine(X, Z);
4545

46-
/// <summary>2つの座標が等しいか。</summary>
46+
/// <summary>2つの座標が等しいか</summary>
4747
public static bool operator ==(ChunkPos left, ChunkPos right) => left.Equals(right);
4848

49-
/// <summary>2つの座標が異なるか。</summary>
49+
/// <summary>2つの座標が異なるか</summary>
5050
public static bool operator !=(ChunkPos left, ChunkPos right) => !left.Equals(right);
5151

5252
/// <inheritdoc/>
@@ -55,29 +55,31 @@ public override string ToString() =>
5555
}
5656

5757
/// <summary>
58-
/// リージョンの座標。1リージョンは 32×32 チャンクを担当する。
58+
/// リージョンの座標
59+
/// 1リージョンは 32×32 チャンクを担当する
5960
/// </summary>
6061
public readonly struct RegionPos : IEquatable<RegionPos>
6162
{
62-
/// <summary>座標を指定して作る。</summary>
63+
/// <summary>座標を指定して作る</summary>
6364
public RegionPos(int x, int z)
6465
{
6566
X = x;
6667
Z = z;
6768
}
6869

69-
/// <summary>リージョンX座標。</summary>
70+
/// <summary>リージョンX座標</summary>
7071
public int X { get; }
7172

72-
/// <summary>リージョンZ座標。</summary>
73+
/// <summary>リージョンZ座標</summary>
7374
public int Z { get; }
7475

75-
/// <summary>このリージョンのファイル名(<c>r.X.Z.mca</c>)。</summary>
76+
/// <summary>このリージョンのファイル名(<c>r.X.Z.mca</c>)</summary>
7677
public string FileName =>
7778
string.Create(CultureInfo.InvariantCulture, $"r.{X}.{Z}.mca");
7879

7980
/// <summary>
80-
/// <c>r.X.Z.mca</c> 形式のファイル名から座標を得る。解釈できなければ null。
81+
/// <c>r.X.Z.mca</c> 形式のファイル名から座標を得る
82+
/// 解釈できなければ null
8183
/// </summary>
8284
public static RegionPos? FromFileName(string fileName)
8385
{
@@ -113,10 +115,10 @@ public RegionPos(int x, int z)
113115
/// <inheritdoc/>
114116
public override int GetHashCode() => HashCode.Combine(X, Z);
115117

116-
/// <summary>2つの座標が等しいか。</summary>
118+
/// <summary>2つの座標が等しいか</summary>
117119
public static bool operator ==(RegionPos left, RegionPos right) => left.Equals(right);
118120

119-
/// <summary>2つの座標が異なるか。</summary>
121+
/// <summary>2つの座標が異なるか</summary>
120122
public static bool operator !=(RegionPos left, RegionPos right) => !left.Equals(right);
121123

122124
/// <inheritdoc/>

‎csharp/src/SpringNBTLibrary/Anvil/RawChunk.cs‎

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,19 @@
11
namespace SpringNBTLibrary.Anvil;
22

33
/// <summary>
4-
/// リージョンファイルに格納されたままの、圧縮済みチャンクデータ。
4+
/// リージョンファイルに格納されたままの、圧縮済みチャンクデータ
55
/// </summary>
66
/// <remarks>
77
/// <para>
88
/// 本ライブラリが解釈できない圧縮方式(LZ4 未導入、カスタム方式)でも
9-
/// これなら取り出せる。バックアップや別ツールへの受け渡しに使う。
9+
/// これなら取り出せる
10+
/// バックアップや別ツールへの受け渡しに使う
1011
/// </para>
1112
/// <para>仕様: <c>docs/spec/20-anvil-region.md</c> 5章</para>
1213
/// </remarks>
1314
public sealed class RawChunk
1415
{
15-
/// <summary>圧縮方式と本体を指定して作る。</summary>
16+
/// <summary>圧縮方式と本体を指定して作る</summary>
1617
public RawChunk(ChunkCompression compression, byte[] data, bool external = false)
1718
{
1819
ArgumentNullException.ThrowIfNull(data);
@@ -21,18 +22,18 @@ public RawChunk(ChunkCompression compression, byte[] data, bool external = false
2122
External = external;
2223
}
2324

24-
/// <summary>この本体に使われている圧縮方式。</summary>
25+
/// <summary>この本体に使われている圧縮方式</summary>
2526
public ChunkCompression Compression { get; }
2627

27-
/// <summary>圧縮されたままの本体。</summary>
28+
/// <summary>圧縮されたままの本体</summary>
2829
public byte[] Data { get; }
2930

3031
/// <summary>
31-
/// 外部ファイル <c>c.X.Z.mcc</c> に格納されていたか。
32+
/// 外部ファイル <c>c.X.Z.mcc</c> に格納されていたか
3233
/// </summary>
3334
/// <remarks>
34-
/// 書き込み時にこの値を指定する必要はない。
35-
/// サイズに応じて <see cref="RegionFile"/> が自動的に判断する。
35+
/// 書き込み時にこの値を指定する必要はない
36+
/// サイズに応じて <see cref="RegionFile"/> が自動的に判断する
3637
/// </remarks>
3738
public bool External { get; }
3839

0 commit comments

Comments
 (0)