workpytools 0.1.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. workpytools-0.1.4/LICENSE +21 -0
  2. workpytools-0.1.4/PKG-INFO +458 -0
  3. workpytools-0.1.4/README.md +426 -0
  4. workpytools-0.1.4/pyproject.toml +84 -0
  5. workpytools-0.1.4/setup.cfg +4 -0
  6. workpytools-0.1.4/src/workpytools/__init__.py +1 -0
  7. workpytools-0.1.4/src/workpytools/cli.py +76 -0
  8. workpytools-0.1.4/src/workpytools/common/__init__.py +0 -0
  9. workpytools-0.1.4/src/workpytools/common/browser_preview.py +40 -0
  10. workpytools-0.1.4/src/workpytools/common/clipboard.py +318 -0
  11. workpytools-0.1.4/src/workpytools/common/clustering.py +85 -0
  12. workpytools-0.1.4/src/workpytools/common/config.py +44 -0
  13. workpytools-0.1.4/src/workpytools/common/embedding.py +101 -0
  14. workpytools-0.1.4/src/workpytools/common/help_gen.py +542 -0
  15. workpytools-0.1.4/src/workpytools/common/logging.py +12 -0
  16. workpytools-0.1.4/src/workpytools/common/markdown_html.py +15 -0
  17. workpytools-0.1.4/src/workpytools/common/outline_parse.py +81 -0
  18. workpytools-0.1.4/src/workpytools/common/output.py +71 -0
  19. workpytools-0.1.4/src/workpytools/common/powerpoint.py +43 -0
  20. workpytools-0.1.4/src/workpytools/common/shape_cluster.py +75 -0
  21. workpytools-0.1.4/src/workpytools/common/table_shapes.py +157 -0
  22. workpytools-0.1.4/src/workpytools/common/tabular.py +248 -0
  23. workpytools-0.1.4/src/workpytools/common/textfile.py +90 -0
  24. workpytools-0.1.4/src/workpytools/common/walk.py +133 -0
  25. workpytools-0.1.4/src/workpytools/data/__init__.py +0 -0
  26. workpytools-0.1.4/src/workpytools/data/synonym.tsv +3 -0
  27. workpytools-0.1.4/src/workpytools/data/user.dic +2 -0
  28. workpytools-0.1.4/src/workpytools/processing/__init__.py +0 -0
  29. workpytools-0.1.4/src/workpytools/processing/base.py +23 -0
  30. workpytools-0.1.4/src/workpytools/processing/clipfmt.py +143 -0
  31. workpytools-0.1.4/src/workpytools/processing/clipmd.py +237 -0
  32. workpytools-0.1.4/src/workpytools/processing/clipview.py +194 -0
  33. workpytools-0.1.4/src/workpytools/processing/cwc.py +427 -0
  34. workpytools-0.1.4/src/workpytools/processing/denoise.py +81 -0
  35. workpytools-0.1.4/src/workpytools/processing/help.py +47 -0
  36. workpytools-0.1.4/src/workpytools/processing/ikko.py +205 -0
  37. workpytools-0.1.4/src/workpytools/processing/kukiri.py +94 -0
  38. workpytools-0.1.4/src/workpytools/processing/lsdir.py +218 -0
  39. workpytools-0.1.4/src/workpytools/processing/mdtsv.py +177 -0
  40. workpytools-0.1.4/src/workpytools/processing/mokuji.py +91 -0
  41. workpytools-0.1.4/src/workpytools/processing/nagasa.py +94 -0
  42. workpytools-0.1.4/src/workpytools/processing/outline.py +85 -0
  43. workpytools-0.1.4/src/workpytools/processing/profiler.py +277 -0
  44. workpytools-0.1.4/src/workpytools/processing/seiretsu.py +111 -0
  45. workpytools-0.1.4/src/workpytools/processing/tbl.py +358 -0
  46. workpytools-0.1.4/src/workpytools/processing/touka.py +52 -0
  47. workpytools-0.1.4/src/workpytools/processing/vv.py +147 -0
  48. workpytools-0.1.4/src/workpytools.egg-info/PKG-INFO +458 -0
  49. workpytools-0.1.4/src/workpytools.egg-info/SOURCES.txt +52 -0
  50. workpytools-0.1.4/src/workpytools.egg-info/dependency_links.txt +1 -0
  51. workpytools-0.1.4/src/workpytools.egg-info/entry_points.txt +20 -0
  52. workpytools-0.1.4/src/workpytools.egg-info/requires.txt +23 -0
  53. workpytools-0.1.4/src/workpytools.egg-info/top_level.txt +1 -0
  54. workpytools-0.1.4/tests/test_cli.py +68 -0
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 kirin123
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,458 @@
1
+ Metadata-Version: 2.4
2
+ Name: workpytools
3
+ Version: 0.1.4
4
+ Summary: Collection of Python processing utilities
5
+ License: MIT
6
+ Requires-Python: >=3.11
7
+ Description-Content-Type: text/markdown
8
+ License-File: LICENSE
9
+ Requires-Dist: pillow>=10
10
+ Requires-Dist: rembg[cpu]>=2.0
11
+ Requires-Dist: opencv-python-headless>=4.9
12
+ Requires-Dist: numpy>=1.26
13
+ Requires-Dist: pywin32>=306
14
+ Requires-Dist: janome>=0.5
15
+ Requires-Dist: wordcloud>=1.9
16
+ Requires-Dist: tokenizers>=0.15
17
+ Requires-Dist: onnxruntime>=1.17
18
+ Requires-Dist: markdown-it-py>=3
19
+ Requires-Dist: markdownify>=0.13
20
+ Requires-Dist: beautifulsoup4>=4.12
21
+ Requires-Dist: mdformat>=0.7
22
+ Requires-Dist: mdformat-tables>=1
23
+ Requires-Dist: openpyxl>=3.1
24
+ Requires-Dist: xlsxwriter>=3
25
+ Provides-Extra: dev
26
+ Requires-Dist: pytest>=8; extra == "dev"
27
+ Requires-Dist: pytest-cov>=5; extra == "dev"
28
+ Requires-Dist: ruff>=0.6; extra == "dev"
29
+ Requires-Dist: mypy>=1.11; extra == "dev"
30
+ Requires-Dist: scikit-learn>=1.4; extra == "dev"
31
+ Dynamic: license-file
32
+
33
+ # workpytools
34
+
35
+ さまざまな処理をコマンドとして追加していくためのPythonプロジェクト。
36
+
37
+ **動作環境: Windows 11 専用**(クリップボード連携等はWindows APIに依存するため、他OSは考慮しない)
38
+
39
+ ## 構成
40
+
41
+ ```
42
+ workpytools/
43
+ ├── pyproject.toml # 依存関係・lint(ruff)・型チェック(mypy)・pytest設定
44
+ ├── src/
45
+ │ └── workpytools/
46
+ │ ├── cli.py # エントリポイント。processing/配下を自動探索してサブコマンド化
47
+ │ ├── common/ # 処理間で使い回す共通機能
48
+ │ │ ├── logging.py
49
+ │ │ ├── config.py
50
+ │ │ └── clipboard.py # クリップボードからの画像/ファイル取得(Windows専用)
51
+ │ └── processing/ # 個々の処理。1ファイル=1処理
52
+ │ ├── base.py # Processor基底クラス
53
+ │ ├── touka.py # 画像背景透過ツール
54
+ │ ├── denoise.py # 画像ノイズ除去ツール(OpenCV Non-local Means)
55
+ │ ├── kukiri.py # JPEG輪郭滲み除去・境界強調ツール(バイラテラル+アンシャープマスク)
56
+ │ ├── cwc.py # テキストからワードクラウド画像を生成するツール
57
+ │ ├── clipmd.py # クリップボードのMarkdown↔リッチテキスト変換
58
+ │ ├── mdtsv.py # クリップボードのMarkdownの表↔TSV変換
59
+ │ ├── clipview.py # クリップボードのMarkdown/HTMLをブラウザでプレビュー
60
+ │ ├── clipfmt.py # クリップボードのMarkdown整形
61
+ │ ├── vv.py # 定型プロンプトをクリップボードにコピー
62
+ │ ├── profiler.py # 表形式データの列プロファイリング(欠損・一意性・主キー候補)
63
+ │ ├── lsdir.py # フォルダ配下をExcelで集計できる表形式で一覧化
64
+ │ ├── outline.py # クリップボードのアウトラインからPowerPointにスライドを追加
65
+ │ ├── ikko.py # PowerPointのバラバラなテキストボックスを1つに合体
66
+ │ ├── mokuji.py # PowerPointの全スライドタイトルを一覧化してクリップボードへ
67
+ │ ├── tbl.py # PowerPointの表とシェイプ群を相互変換(分解/合成/行分割)
68
+ │ ├── seiretsu.py # PowerPointのシェイプを表に変換せず格子状に整列
69
+ │ ├── nagasa.py # PowerPointのシェイプの幅・高さを最大値に統一
70
+ │ └── help.py # 全コマンドのヘルプ一覧をブラウザで開く
71
+ ├── tests/ # src/workpytools と同じ階層構造でテストを配置
72
+ ├── configs/ # 処理ごとの設定ファイル(TOML)を置く場所(common/config.py で読み込み)
73
+ ├── scripts/ # 動作確認用の使い捨てスクリプト(.gitignore対象。
74
+ │ # ただし gen_help.py と pre-commit は例外的にバージョン管理する)
75
+ └── tmp/ # 一時ファイル・実行結果ダンプなど(.gitignore対象)
76
+ ```
77
+
78
+ ## 新しい処理の追加方法
79
+
80
+ 1. `src/workpytools/processing/` に新しいモジュールを作成する
81
+ 2. `Processor` を継承したクラスを定義し、`name`(サブコマンド名)と
82
+ `add_arguments` / `run` を実装する(`touka.py` や `denoise.py` を参照)
83
+ 3. それだけで`tools <name>`としてCLIに自動登録される(`cli.py` の編集は不要)
84
+ 4. **単体実行用のエントリーポイントも追加する**: `pyproject.toml` の
85
+ `[project.scripts]` に `name`(`Processor.name`と同じ文字列)を
86
+ `workpytools.cli:run_as_subcommand` として登録する。これにより
87
+ `pip install -e .` 後、`tools <name> ...` に加えて `<name> ...`
88
+ (Windowsでは `<name>.exe ...`)としても直接実行できるようになる。
89
+
90
+ ```toml
91
+ [project.scripts]
92
+ my-process = "workpytools.cli:run_as_subcommand"
93
+ ```
94
+
95
+ ```python
96
+ # src/workpytools/processing/my_process.py
97
+ from workpytools.processing.base import Processor
98
+
99
+
100
+ class MyProcess(Processor):
101
+ name = "my-process"
102
+ help = "何をする処理か"
103
+
104
+ def add_arguments(self, parser):
105
+ parser.add_argument("input")
106
+
107
+ def run(self, args) -> int:
108
+ ...
109
+ return 0
110
+ ```
111
+
112
+ ## セットアップ(Windows / PowerShell)
113
+
114
+ ```powershell
115
+ python -m venv .venv
116
+ .venv\Scripts\activate
117
+ pip install -e ".[dev]"
118
+ ```
119
+
120
+ ### pre-commitフックの導入(`doc/help.html`の自動更新)
121
+
122
+ `doc/help.html`(全コマンドのヘルプ一覧、`help`/`toolh.exe`が開くページ)は
123
+ コミット時に自動再生成されるようにしています。`.git/hooks/`はリポジトリに含まれないため、
124
+ クローン後に一度だけ導入してください。
125
+
126
+ ```powershell
127
+ Copy-Item scripts\pre-commit .git\hooks\pre-commit
128
+ ```
129
+
130
+ 以降、`git commit`のたびに `python scripts/gen_help.py` が実行され、
131
+ `doc/help.html`に変更があればコミットに自動で含まれます。
132
+
133
+ ## 実行
134
+
135
+ ```powershell
136
+ # 画像の背景を透過(ファイルパス指定)
137
+ tools touka C:\path\to\photo.jpg
138
+
139
+ # 画像の背景を透過(クリップボードから取得)
140
+ # - 画像編集ソフトで「画像をコピー」した場合、または
141
+ # - Explorerで画像ファイルをコピー(Ctrl+C)した場合
142
+ tools touka
143
+
144
+ # 出力先を指定
145
+ tools touka C:\path\to\photo.jpg -o C:\path\to\out.png
146
+
147
+ # 画像のノイズ除去(ファイルパス指定)
148
+ tools denoise C:\path\to\photo.jpg
149
+
150
+ # 画像のノイズ除去(クリップボードから取得)
151
+ tools denoise
152
+
153
+ # ノイズ除去強度を指定(デフォルト: 10.0、大きいほど強くノイズを除去)
154
+ tools denoise C:\path\to\photo.jpg --strength 15
155
+
156
+ # 出力先を指定
157
+ tools denoise C:\path\to\photo.jpg -o C:\path\to\out.png
158
+
159
+ # JPEGの輪郭滲みを除去し境界をくっきりさせる(フラットイラスト向け)
160
+ tools kukiri C:\path\to\illustration.jpg
161
+
162
+ # 平滑化・シャープ強度を指定(デフォルト: smooth=75.0, sharpen=0.5)
163
+ tools kukiri C:\path\to\illustration.jpg --smooth 90 --sharpen 0.8
164
+
165
+ # 出力先を指定
166
+ tools kukiri C:\path\to\illustration.jpg -o C:\path\to\out.png
167
+
168
+ # テキストからワードクラウド画像を生成(ファイルパス指定)
169
+ tools cwc C:\path\to\memo.txt
170
+
171
+ # クリップボードのテキストから生成
172
+ tools cwc
173
+
174
+ # Janomeによる分かち書きで分割
175
+ tools cwc C:\path\to\memo.txt -w
176
+
177
+ # 名詞・動詞のみを集計(分かち書きを自動的に使用)
178
+ tools cwc C:\path\to\memo.txt --hinshi 名詞 動詞
179
+
180
+ # 同義語辞書で表記ゆれを1語に寄せる(既定の区切り文字分割専用)
181
+ tools cwc C:\path\to\memo.txt --semantic
182
+
183
+ # 集計単位を文にし、埋め込みベクトルの類似度で似た文をまとめる
184
+ # (アンケート自由記述など、表現違いの同趣旨回答をまとめたい場合向け)
185
+ tools cwc C:\path\to\answers.txt --similar
186
+
187
+ # 出力先を指定
188
+ tools cwc C:\path\to\memo.txt -o C:\path\to\out.png
189
+
190
+ # クリップボードのMarkdownとリッチテキストを相互変換(クリップボードの状態から自動判別)
191
+ # - リッチテキストがコピーされていればMarkdownに変換
192
+ # - Markdown(プレーンテキスト)がコピーされていればリッチテキストに変換
193
+ tools clipmd
194
+
195
+ # 変換方向を明示指定
196
+ tools clipmd --to-markdown
197
+ tools clipmd --to-rich
198
+
199
+ # クリップボードのMarkdownの表とTSVを相互変換(Excelとのやり取り用)
200
+ tools mdtsv
201
+
202
+ # クリップボードのMarkdown/HTMLをブラウザでプレビュー
203
+ tools clipview
204
+
205
+ # クリップボードのMarkdownを整形(表の桁揃え、見出し統一、リスト記号統一など)
206
+ tools clipfmt
207
+
208
+ # 定型プロンプトの一覧を表示(クリップボードには何も入れない)
209
+ tools vv
210
+
211
+ # 番号を指定して、そのプロンプトをクリップボードにコピー(あとはCtrl+Vで貼るだけ)
212
+ tools vv 3
213
+
214
+ # 表形式データ(CSV/TSV/Excel/JSON)の各列をプロファイル(ファイルパス指定)
215
+ tools profiler C:\path\to\data.csv
216
+
217
+ # クリップボードのTSV(Excelで範囲コピーしたものなど)をプロファイル
218
+ tools profiler
219
+
220
+ # 結果をExcelファイルに書き出す(欠損・重複が疑わしいセルを赤塗り)
221
+ tools profiler C:\path\to\data.xlsx -o C:\path\to\profile.xlsx
222
+
223
+ # 結果をブラウザでプレビュー
224
+ tools profiler C:\path\to\data.csv --view
225
+
226
+ # フォルダ配下をExcelで集計できる表形式で一覧化
227
+ tools lsdir C:\path\to\folder
228
+
229
+ # ファイルのみ/フォルダのみに絞り込む
230
+ tools lsdir C:\path\to\folder --files-only
231
+ tools lsdir C:\path\to\folder --dirs-only
232
+
233
+ # フォルダ配下の合計サイズも計算する(全走査後に出力するため待ち時間が発生する)
234
+ tools lsdir C:\path\to\folder --total-size
235
+
236
+ # .lnkショートカットのリンク先も解決する
237
+ tools lsdir C:\path\to\folder --resolve-link
238
+
239
+ # 結果をExcelファイルに書き出す
240
+ tools lsdir C:\path\to\folder -o C:\path\to\list.xlsx
241
+
242
+ # クリップボードのアウトライン(Markdown見出し/タブ区切り/空行区切り)から
243
+ # アクティブなPowerPointにスライドを追加する
244
+ tools outline
245
+
246
+ # PowerPointのスライド上でバラバラなテキストボックスを1つに合体する
247
+ # (選択中ならその範囲のみ、未選択ならアクティブスライド全体が対象)
248
+ tools ikko
249
+
250
+ # 実際には変更せず、合体対象になる組み合わせだけを確認する
251
+ tools ikko --dry-run
252
+
253
+ # アクティブなPowerPointの全スライドタイトルを一覧化してクリップボードにコピーする
254
+ tools mokuji
255
+
256
+ # PowerPointの表とシェイプ群を相互変換する(選択状態から自動判定)
257
+ # - 表を選択 → セルごとの四角形に分解
258
+ # - 四角形群を2つ以上選択 → 座標から表を推定して合成
259
+ # - 複数行テキストのシェイプを1つ選択 → 行ごとのシェイプに分割
260
+ tools tbl
261
+
262
+ # 選択したシェイプを表に変換せず、位置だけを格子状に整列する
263
+ tools seiretsu
264
+
265
+ # 選択したシェイプの幅・高さを最大値に統一する(中心を保ったまま拡大)
266
+ tools nagasa
267
+
268
+ # 全コマンドのヘルプ一覧(doc/help.html)をブラウザで開く
269
+ tools help
270
+ # 単体実行ファイルはtoolh.exe(他コマンドと違いhelp.exeという名前ではない)
271
+ toolh
272
+ ```
273
+
274
+ `touka` は初回実行時に背景除去モデル(U2Net, rembg)をインターネットからダウンロードします。
275
+ `denoise`・`kukiri`はOpenCVの古典的アルゴリズムのみを使用し、モデルダウンロードは行いません(外部通信なし)。
276
+
277
+ `kukiri`は`denoise`とは異なり、ランダムノイズではなくJPEG圧縮特有の輪郭のにじみ・リンギングを
278
+ 対象にしています。バイラテラルフィルタ(輪郭を保ったまま平滑化)→アンシャープマスク(輪郭強調)
279
+ の順に処理し、フラットデザインのイラストなど「境界をくっきりさせたい」用途向けです。
280
+
281
+ `cwc`はテキストを単語に分割して頻度を集計し、`wordcloud`ライブラリでワードクラウド画像を
282
+ 生成します。既定は句点・かっこ・空白類による単純な区切り文字分割で、外部モデルのダウンロードは
283
+ 不要です。日本語を分かち書きしたい場合は`-w`(Janome、純Python実装で外部辞書のインストール不要)
284
+ を指定します。フォントは既定でWindows標準搭載のメイリオ(`C:\Windows\Fonts\meiryo.ttc`)を使うため、
285
+ 別途フォントの用意は不要です。
286
+
287
+ `--similar`は集計単位を語ではなく文にし、埋め込みベクトルの類似度で似た文をまとめて集計します。
288
+ **初回実行時にのみ**埋め込みモデル(ONNX形式、`Xenova/paraphrase-multilingual-MiniLM-L12-v2`の
289
+ 量子化版、約120MB)を `https://huggingface.co` からダウンロードします。IT部門でプロキシ/EDRの
290
+ アローリスト登録が必要な場合は、このホストを登録してください。ダウンロードしたモデルは
291
+ `%LOCALAPPDATA%\workpytools\models\` にキャッシュされ、2回目以降は再ダウンロードしません。
292
+
293
+ `clipmd`/`mdtsv`/`clipview`/`clipfmt`はクリップボードの内容をその場で変換・表示するツール群です。
294
+ 入力も出力もファイルではなくクリップボード経由(`clipview`のみプレビュー用に一時HTMLを生成)で、
295
+ `tools <name>` を実行した瞬間にクリップボードの中身を読み書きします(バックグラウンド監視はしません)。
296
+ 役割の違いは以下の通りです。
297
+
298
+ | コマンド | 役割 |
299
+ |---|---|
300
+ | `clipmd` | Markdown ↔ リッチテキスト の文書全体の形式変換 |
301
+ | `mdtsv` | Markdownの表 ↔ TSV の表だけの変換(Excelとの橋渡し) |
302
+ | `clipview` | Markdown/HTML をブラウザでプレビュー(クリップボードは変更しない) |
303
+ | `clipfmt` | Markdown の整形(表の桁揃え、見出し・リスト記号の統一など) |
304
+
305
+ `clipview`のみ、プレビュー用に `%TEMP%\workpytools_clipview_preview.html` を固定名で生成します
306
+ (毎回上書きするためファイルは増殖しません)。
307
+
308
+ ### vv(定型プロンプトの呼び出し)
309
+
310
+ よく使う長文プロンプトを、フォルダを開いて探して全選択コピーする手間なしに
311
+ クリップボードへ入れるコマンドです。
312
+
313
+ `%APPDATA%\workpytools\vv\` に **1ファイル1プロンプトの `.txt`** を置いておくと、
314
+ ファイル名がそのままプロンプト名として一覧に出ます。
315
+
316
+ ```powershell
317
+ # 一覧を見る(クリップボードには何も入らない)
318
+ vv
319
+ # 1: 01_企画書雛形 以下の要件で企画書のドラフトを作成してくだ...
320
+ # 2: 02_謝罪メール 下記の状況について、取引先向けの謝罪メール...
321
+
322
+ # 番号を指定して即コピー(一覧は出ない)→ あとは貼りたい場所で Ctrl+V
323
+ vv 1
324
+ ```
325
+
326
+ - 並び順はファイル名順です。よく使うものを上に出したい場合は
327
+ `01_` のような接頭辞をファイル名に付けてください
328
+ (日本語名はUnicode順のため五十音順にはなりません)
329
+ - 貼り付け(Ctrl+V)は利用者が行います。キー入力の自動送信は行いません
330
+ - 改行はWindowsの慣習に合わせてCRLFに統一してクリップボードへ入れます
331
+
332
+ ### profiler(表形式データのプロファイリング)
333
+
334
+ CSV/TSV/Excel/JSONの各列について、行数・欠損数・充填率・一意数・一意率・
335
+ 頻度上位・主キー候補らしさ(`key_score`、充填率と一意率の調和平均)を算出します。
336
+ ファイルパスを指定しない場合はクリップボードのTSV(Excelで範囲コピーした内容など)を読みます。
337
+ Excel入力を含むときのみ`sheet`列が追加されます。`--clip`でクリップボードへ、
338
+ `--view`でブラウザプレビュー、`-o`でTSV/xlsxファイルへ出力できます
339
+ (既定は標準出力)。
340
+
341
+ ### lsdir(フォルダ一覧のExcel向け表形式出力)
342
+
343
+ 指定フォルダ配下を再帰的に走査し、`source, type, name, fullpath, parent, ext,
344
+ size, mtime, depth`の固定列で一覧化します。サイズは既定でKB(小数第2位)、
345
+ `--unit b/kb/mb/gb`で切り替え可能です(1KB=1024)。`--total-size`は
346
+ フォルダ配下の合計サイズも計算しますが、全走査完了後でないと出せないため
347
+ オプトインです。`.lnk`ショートカットのリンク先は`--resolve-link`を指定した
348
+ 場合のみ解決します(`WScript.Shell`経由)。複数フォルダを指定して起点が
349
+ 重複する場合はフルパスで自動的に重複除去されます。
350
+
351
+ ### PowerPointをCOM操作するコマンド(outline / ikko / mokuji / tbl / seiretsu / nagasa)
352
+
353
+ いずれも実行中のPowerPointを対象にします(`pywin32`経由、`python-pptx`は
354
+ 「開いているファイル」を操作できないため使いません)。役割は以下の通りです。
355
+
356
+ | コマンド | 役割 |
357
+ | --- | --- |
358
+ | `outline` | クリップボードのアウトラインからスライドを新規に追加する |
359
+ | `ikko` | すでにあるスライド上のバラバラなテキストボックスを1つに合体する |
360
+ | `mokuji` | 全スライドのタイトルを一覧化してクリップボードにコピーする |
361
+ | `tbl` | PowerPointの表とシェイプ群を相互変換する(選択状態から自動判定) |
362
+ | `seiretsu` | 選択したシェイプを表に変換せず格子状の位置に整列する |
363
+ | `nagasa` | 選択したシェイプの幅・高さを最大値に統一する |
364
+
365
+ - `outline`はクリップボードのテキストを**Markdown見出し(`#`等)/タブ区切り
366
+ /空行区切り**の3形式から自動判別し、抽出した項目ぶんのスライドを
367
+ アクティブなプレゼンテーションの末尾に追加します。PowerPointが
368
+ 起動していない場合は新規に起動し、新規プレゼンテーションを作成して
369
+ 続行します。目次スライドの生成は行いません(`mokuji`が担います)
370
+ - `ikko`はSVGを「図形に変換」した際に1行ずつ分割されてしまった
371
+ テキストボックス群を、フォント・座標・行送りが揃った隣接シェイプの
372
+ かたまりとして検出し、1つのテキストボックス(複数段落)に合体します。
373
+ 処理直前に必ずUndo境界を打つため、**Ctrl+Zひと押しで合体前の状態に
374
+ 戻せます**。`--dry-run`で実際に変更せず対象を確認できます。
375
+ PowerPointが起動していない、またはプレゼンテーションが開かれていない
376
+ 場合は新規起動せずエラーになります(既存のスライドを加工する
377
+ コマンドのため)
378
+ - `mokuji`はタイトルプレースホルダーが空でも、スライド上で最も上にある
379
+ テキストを代用してタイトルを推定します。結果はタイトルのみを1行1件で
380
+ クリップボードにコピーします(番号は付きません)。`ikko`と同じく
381
+ PowerPointが起動していない場合はエラーになります
382
+ - `tbl`は選択状態から変換方向を自動判定します。**表を選択**すればセルごとの
383
+ 四角形に分解し(隣接シェイプ同士が重ならないよう、セルサイズの5%を目安に
384
+ 上下左右へ間隔を空けます)、**四角形群を2つ以上選択**すれば座標から行・列を
385
+ 推定して表に合成します(間隔が不揃いでも推定できます)。**複数行テキストの
386
+ シェイプを1つだけ選択**した場合は行ごとに独立したシェイプへ分割します
387
+ (空行はスキップ)。`ikko`と同じくUndo境界を必ず打つため、Ctrl+Z一回で
388
+ 元に戻せます。何も選択していない場合はエラーになります(分解・合成・
389
+ 行分割のどれを行うか自動推測しないため)
390
+ - `seiretsu`は`tbl`の合成方向と似た状況(座標がバラバラなシェイプ群)を
391
+ 対象にしますが、**表オブジェクトへの変換は行わず**、選択したシェイプの
392
+ 個数・形状・書式をそのまま保ったうえで**位置(`Left`/`Top`)だけ**を
393
+ 格子状に並べ直します。各列・各行のセルサイズはその列・行内で最大の
394
+ シェイプに合わせるため、サイズが大きく異なるシェイプが混在していても
395
+ 重なりません。2つ以上選択されていない場合はエラーになります
396
+ - `nagasa`は選択したシェイプの幅・高さを、それぞれの最大値へ統一します。
397
+ 各シェイプは**中心座標を固定**したまま拡大するため、`seiretsu`で
398
+ 整列した後に使っても位置関係が崩れません。**「テキストに合わせて図形の
399
+ サイズを調整する」設定(`AutoSize`)が有効だと、リサイズ後にテキストを
400
+ 編集した際にサイズが自動調整で巻き戻る事故が実機で確認されたため、
401
+ リサイズ前に対象シェイプの`AutoSize`を無効化します**。2つ以上選択
402
+ されていない場合はエラーになります
403
+
404
+ 各サブコマンドは `tools <name>` の他に、単体の実行ファイルとしても呼び出せます
405
+ (`pip install -e .` でインストールされる `touka.exe` / `denoise.exe` / `kukiri.exe` / `cwc.exe` /
406
+ `clipmd.exe` / `mdtsv.exe` / `clipview.exe` / `clipfmt.exe` / `vv.exe` /
407
+ `profiler.exe` / `lsdir.exe` / `outline.exe` / `ikko.exe` / `mokuji.exe` /
408
+ `tbl.exe` / `seiretsu.exe` / `nagasa.exe` など)。
409
+
410
+ ### 出力先のデフォルト(`-o`省略時)
411
+
412
+ 入力パターンごとに、出力の扱いが異なります(`cwc`は入力がテキストになりますが同じ規約に従います)。
413
+
414
+ | 入力パターン | デフォルトの挙動 |
415
+ |---|---|
416
+ | ファイルパス指定 | 元ファイルと同じ場所に `{元のファイル名}_<コマンド名>.png` を保存 |
417
+ | クリップボードのファイルオブジェクト(Explorerでコピーした実ファイル) | OS一時ディレクトリ(`%TEMP%`)に `{元のファイル名}_<コマンド名>.png` を保存し、そのファイルをクリップボードにコピー(Ctrl+Vで貼り付け可能な状態にする) |
418
+ | クリップボードの画像データ(画像ソフトの「コピー」等、元ファイルなし) | ファイルには保存せず、処理後の画像データをそのままクリップボードにコピー(Ctrl+Vで貼り付け可能な状態にする) |
419
+
420
+ ```powershell
421
+ denoise C:\path\to\photo.jpg
422
+ touka C:\path\to\photo.jpg
423
+ kukiri C:\path\to\illustration.jpg
424
+ ```
425
+
426
+ ## テスト・lint
427
+
428
+ ```bash
429
+ pytest
430
+ ruff check .
431
+ mypy src
432
+ ```
433
+
434
+ ## バージョン管理
435
+
436
+ [Semantic Versioning](https://semver.org/lang/ja/)(`MAJOR.MINOR.PATCH`)を採用する。
437
+
438
+ - バージョン番号は `pyproject.toml` の `version` で管理する
439
+ - **コミットのたびにパッチ番号(`PATCH`)を+1する運用**とする
440
+ (例: `0.1.0` → `0.1.1`)。MINOR/MAJORの繰り上げは、破壊的変更や
441
+ まとまった機能追加の際に人間が明示的に指示した場合のみ行う
442
+ - コミットのたびに以下を同時に行う
443
+ 1. `pyproject.toml` の `version` のパッチ番号を+1する
444
+ 2. `CHANGELOG.md` に変更内容を追記する
445
+ 3. コミット後、`git tag -a vX.Y.Z -m "..."` でタグを打つ
446
+ (`pyproject.toml`のversionとgit tagは常に一致させる)
447
+ - 変更履歴は [CHANGELOG.md](CHANGELOG.md) を参照
448
+
449
+ ## ライセンス
450
+
451
+ MIT License([LICENSE](LICENSE)を参照)。
452
+
453
+ 依存ライブラリはMIT/BSD/Apache 2.0などの寛容型ライセンスのみで構成しており、
454
+ 本プロジェクトをMITとすること自体に支障はない。ただし`opencv-python-headless`・
455
+ `janome`・`tokenizers`はApache 2.0であり、**exe化して配布する場合**は
456
+ 同梱ライブラリとしてその旨・著作権表示を配布物に添付することが望ましい
457
+ (PyPI経由でインストールして使うだけの開発環境では、各パッケージの
458
+ `dist-info`がライセンス表示を担うため追加対応は不要)。