From fe4c280f7c55954ac160313ad732cfb075cdeac0 Mon Sep 17 00:00:00 2001 From: Zhengshou Lai Date: Fri, 26 Jun 2026 22:57:55 +0800 Subject: [PATCH] refactor: rename bin/ package to mytoolkit/ --- {bin => mytoolkit}/__init__.py | 0 {bin => mytoolkit}/api/__init__.py | 0 {bin => mytoolkit}/api/image.py | 0 {bin => mytoolkit}/api/voice.py | 2 +- {bin => mytoolkit}/cli.py | 23 +++++---- {bin => mytoolkit}/commands/__init__.py | 0 {bin => mytoolkit}/commands/bib.py | 4 +- {bin => mytoolkit}/commands/convert.py | 6 +-- mytoolkit/commands/docx.py | 51 +++++++++++++++++++ {bin => mytoolkit}/commands/env.py | 2 +- {bin => mytoolkit}/commands/git.py | 2 +- {bin => mytoolkit}/commands/image.py | 6 +-- {bin => mytoolkit}/commands/latex.py | 2 +- {bin => mytoolkit}/commands/mail.py | 2 +- {bin => mytoolkit}/commands/mycv.py | 2 +- {bin => mytoolkit}/commands/pdf.py | 4 +- .../commands/protocols/__init__.py | 0 .../commands/protocols/protocols.py | 0 {bin => mytoolkit}/commands/self_mgmt.py | 0 {bin => mytoolkit}/commands/server.py | 0 {bin => mytoolkit}/commands/ssh.py | 4 +- {bin => mytoolkit}/commands/templates.py | 2 +- {bin => mytoolkit}/commands/video.py | 2 +- {bin => mytoolkit}/commands/voice.py | 6 +-- {bin => mytoolkit}/commands/webpage.py | 2 +- {bin => mytoolkit}/config.py | 0 {bin => mytoolkit}/md_to_pdf.py | 4 +- {bin => mytoolkit}/templates_registry.py | 0 {bin => mytoolkit}/utils.py | 0 pyproject.toml | 4 +- 30 files changed, 91 insertions(+), 39 deletions(-) rename {bin => mytoolkit}/__init__.py (100%) rename {bin => mytoolkit}/api/__init__.py (100%) rename {bin => mytoolkit}/api/image.py (100%) rename {bin => mytoolkit}/api/voice.py (96%) rename {bin => mytoolkit}/cli.py (56%) rename {bin => mytoolkit}/commands/__init__.py (100%) rename {bin => mytoolkit}/commands/bib.py (94%) rename {bin => mytoolkit}/commands/convert.py (99%) create mode 100644 mytoolkit/commands/docx.py rename {bin => mytoolkit}/commands/env.py (97%) rename {bin => mytoolkit}/commands/git.py (99%) rename {bin => mytoolkit}/commands/image.py (98%) rename {bin => mytoolkit}/commands/latex.py (95%) rename {bin => mytoolkit}/commands/mail.py (99%) rename {bin => mytoolkit}/commands/mycv.py (97%) rename {bin => mytoolkit}/commands/pdf.py (98%) rename {bin => mytoolkit}/commands/protocols/__init__.py (100%) rename {bin => mytoolkit}/commands/protocols/protocols.py (100%) rename {bin => mytoolkit}/commands/self_mgmt.py (100%) rename {bin => mytoolkit}/commands/server.py (100%) rename {bin => mytoolkit}/commands/ssh.py (97%) rename {bin => mytoolkit}/commands/templates.py (98%) rename {bin => mytoolkit}/commands/video.py (94%) rename {bin => mytoolkit}/commands/voice.py (95%) rename {bin => mytoolkit}/commands/webpage.py (99%) rename {bin => mytoolkit}/config.py (100%) rename {bin => mytoolkit}/md_to_pdf.py (99%) rename {bin => mytoolkit}/templates_registry.py (100%) rename {bin => mytoolkit}/utils.py (100%) diff --git a/bin/__init__.py b/mytoolkit/__init__.py similarity index 100% rename from bin/__init__.py rename to mytoolkit/__init__.py diff --git a/bin/api/__init__.py b/mytoolkit/api/__init__.py similarity index 100% rename from bin/api/__init__.py rename to mytoolkit/api/__init__.py diff --git a/bin/api/image.py b/mytoolkit/api/image.py similarity index 100% rename from bin/api/image.py rename to mytoolkit/api/image.py diff --git a/bin/api/voice.py b/mytoolkit/api/voice.py similarity index 96% rename from bin/api/voice.py rename to mytoolkit/api/voice.py index 68c1eb1..818157f 100644 --- a/bin/api/voice.py +++ b/mytoolkit/api/voice.py @@ -32,7 +32,7 @@ def synthesize_tts( Returns absolute path to the output audio file. """ # Delayed import to avoid circular dependency when bin.commands is not yet loaded - from bin.commands.protocols import EventType, MsgType, full_client_request, receive_message + from mytoolkit.commands.protocols import EventType, MsgType, full_client_request, receive_message try: import websockets diff --git a/bin/cli.py b/mytoolkit/cli.py similarity index 56% rename from bin/cli.py rename to mytoolkit/cli.py index e2b1d4b..3ed0698 100644 --- a/bin/cli.py +++ b/mytoolkit/cli.py @@ -4,17 +4,17 @@ from pathlib import Path import click -from bin.commands import pdf, image, latex, video, bib, voice -from bin.commands.convert import convert_cmd -from bin.commands.env import env_cmd -from bin.commands.templates import templates_cmd -from bin.commands.ssh import ssh_cmd -from bin.commands.git import git_cmd -from bin.commands.server import server_cmd -from bin.commands.webpage import webpage_cmd -from bin.commands.mycv import mycv_cmd -from bin.commands.mail import mail -from bin.commands.self_mgmt import update_cmd, uninstall_cmd +from mytoolkit.commands import pdf, image, latex, video, bib, voice, docx +from mytoolkit.commands.convert import convert_cmd +from mytoolkit.commands.env import env_cmd +from mytoolkit.commands.templates import templates_cmd +from mytoolkit.commands.ssh import ssh_cmd +from mytoolkit.commands.git import git_cmd +from mytoolkit.commands.server import server_cmd +from mytoolkit.commands.webpage import webpage_cmd +from mytoolkit.commands.mycv import mycv_cmd +from mytoolkit.commands.mail import mail +from mytoolkit.commands.self_mgmt import update_cmd, uninstall_cmd @click.group() @@ -27,6 +27,7 @@ def cli(): # Register command groups cli.add_command(convert_cmd) cli.add_command(pdf.pdf) +cli.add_command(docx.docx) cli.add_command(image.image) cli.add_command(voice.voice) cli.add_command(latex.latex) diff --git a/bin/commands/__init__.py b/mytoolkit/commands/__init__.py similarity index 100% rename from bin/commands/__init__.py rename to mytoolkit/commands/__init__.py diff --git a/bin/commands/bib.py b/mytoolkit/commands/bib.py similarity index 94% rename from bin/commands/bib.py rename to mytoolkit/commands/bib.py index 0915086..aa465b3 100644 --- a/bin/commands/bib.py +++ b/mytoolkit/commands/bib.py @@ -5,8 +5,8 @@ from pathlib import Path import click -from bin.config import config -from bin.utils import handle_errors, run_command +from mytoolkit.config import config +from mytoolkit.utils import handle_errors, run_command @click.group() diff --git a/bin/commands/convert.py b/mytoolkit/commands/convert.py similarity index 99% rename from bin/commands/convert.py rename to mytoolkit/commands/convert.py index 48ed490..0275556 100644 --- a/bin/commands/convert.py +++ b/mytoolkit/commands/convert.py @@ -6,9 +6,9 @@ import click from pypdf import PdfReader, PdfWriter from PIL import Image -from bin.md_to_pdf import build_pdf -from bin import templates_registry -from bin.utils import handle_errors, run_command +from mytoolkit.md_to_pdf import build_pdf +from mytoolkit import templates_registry +from mytoolkit.utils import handle_errors, run_command @click.command("convert") diff --git a/mytoolkit/commands/docx.py b/mytoolkit/commands/docx.py new file mode 100644 index 0000000..8f80c9e --- /dev/null +++ b/mytoolkit/commands/docx.py @@ -0,0 +1,51 @@ +"""DOCX utilities.""" + +from pathlib import Path + +import click +from docx import Document + +from mytoolkit.utils import handle_errors + + +@click.group() +def docx(): + """DOCX manipulation commands.""" + pass + + +@docx.command("extract-text") +@click.argument("input_file", type=click.Path(exists=True, dir_okay=False, path_type=Path)) +@click.option( + "-o", + "--output", + type=click.Path(dir_okay=False, path_type=Path), + help="Output text file. Defaults to stdout.", +) +@click.option( + "--preserve-empty/--no-preserve-empty", + default=False, + help="Preserve empty paragraphs as blank lines.", +) +@handle_errors +def extract_text(input_file, output, preserve_empty): + """Extract text from a DOCX file. + + Extracts all paragraph text from the document, with one paragraph per line. + Tables are not extracted by default. + """ + document = Document(str(input_file)) + + paragraphs = [] + for para in document.paragraphs: + text = para.text.strip() + if text or preserve_empty: + paragraphs.append(para.text) + + result = "\n".join(paragraphs) + + if output: + output.write_text(result, encoding="utf-8") + click.echo(f"Extracted text to {output}") + else: + click.echo(result) diff --git a/bin/commands/env.py b/mytoolkit/commands/env.py similarity index 97% rename from bin/commands/env.py rename to mytoolkit/commands/env.py index b14922a..4905634 100644 --- a/bin/commands/env.py +++ b/mytoolkit/commands/env.py @@ -2,7 +2,7 @@ import click -from bin.config import CONFIG_PATH, config +from mytoolkit.config import CONFIG_PATH, config @click.group(name="env") diff --git a/bin/commands/git.py b/mytoolkit/commands/git.py similarity index 99% rename from bin/commands/git.py rename to mytoolkit/commands/git.py index e6221cd..c735515 100644 --- a/bin/commands/git.py +++ b/mytoolkit/commands/git.py @@ -7,7 +7,7 @@ import sys import click -from bin.config import config +from mytoolkit.config import config def _get_proxies() -> dict[str, str]: diff --git a/bin/commands/image.py b/mytoolkit/commands/image.py similarity index 98% rename from bin/commands/image.py rename to mytoolkit/commands/image.py index ba6689e..f986f9b 100644 --- a/bin/commands/image.py +++ b/mytoolkit/commands/image.py @@ -5,9 +5,9 @@ from pathlib import Path import click -from bin.api.image import _RATIO_MAP, generate_image -from bin.config import config -from bin.utils import handle_errors, run_command +from mytoolkit.api.image import _RATIO_MAP, generate_image +from mytoolkit.config import config +from mytoolkit.utils import handle_errors, run_command @click.group() diff --git a/bin/commands/latex.py b/mytoolkit/commands/latex.py similarity index 95% rename from bin/commands/latex.py rename to mytoolkit/commands/latex.py index aa1e1fd..6710d33 100644 --- a/bin/commands/latex.py +++ b/mytoolkit/commands/latex.py @@ -5,7 +5,7 @@ from pathlib import Path import click -from bin.utils import handle_errors, run_command +from mytoolkit.utils import handle_errors, run_command @click.group() diff --git a/bin/commands/mail.py b/mytoolkit/commands/mail.py similarity index 99% rename from bin/commands/mail.py rename to mytoolkit/commands/mail.py index f9c8870..1ee036a 100644 --- a/bin/commands/mail.py +++ b/mytoolkit/commands/mail.py @@ -19,7 +19,7 @@ from pathlib import Path import click -from bin.utils import handle_errors +from mytoolkit.utils import handle_errors _HOME = Path(os.environ.get("MYTOOLKIT_HOME", Path.home() / ".mytoolkit")) CONFIG_PATH = _HOME / "mail.json" diff --git a/bin/commands/mycv.py b/mytoolkit/commands/mycv.py similarity index 97% rename from bin/commands/mycv.py rename to mytoolkit/commands/mycv.py index 7645cee..57b2f66 100644 --- a/bin/commands/mycv.py +++ b/mytoolkit/commands/mycv.py @@ -5,7 +5,7 @@ from pathlib import Path import click -from bin.md_to_pdf import build_pdf +from mytoolkit.md_to_pdf import build_pdf _CV_DIR = ( diff --git a/bin/commands/pdf.py b/mytoolkit/commands/pdf.py similarity index 98% rename from bin/commands/pdf.py rename to mytoolkit/commands/pdf.py index 13416a7..d9b45fe 100644 --- a/bin/commands/pdf.py +++ b/mytoolkit/commands/pdf.py @@ -8,8 +8,8 @@ import click from pypdf import PdfReader, PdfWriter from PIL import Image -from bin.md_to_pdf import expand_bookmarks -from bin.utils import handle_errors, run_command +from mytoolkit.md_to_pdf import expand_bookmarks +from mytoolkit.utils import handle_errors, run_command @click.group() diff --git a/bin/commands/protocols/__init__.py b/mytoolkit/commands/protocols/__init__.py similarity index 100% rename from bin/commands/protocols/__init__.py rename to mytoolkit/commands/protocols/__init__.py diff --git a/bin/commands/protocols/protocols.py b/mytoolkit/commands/protocols/protocols.py similarity index 100% rename from bin/commands/protocols/protocols.py rename to mytoolkit/commands/protocols/protocols.py diff --git a/bin/commands/self_mgmt.py b/mytoolkit/commands/self_mgmt.py similarity index 100% rename from bin/commands/self_mgmt.py rename to mytoolkit/commands/self_mgmt.py diff --git a/bin/commands/server.py b/mytoolkit/commands/server.py similarity index 100% rename from bin/commands/server.py rename to mytoolkit/commands/server.py diff --git a/bin/commands/ssh.py b/mytoolkit/commands/ssh.py similarity index 97% rename from bin/commands/ssh.py rename to mytoolkit/commands/ssh.py index 0c8bf29..ff19cf0 100644 --- a/bin/commands/ssh.py +++ b/mytoolkit/commands/ssh.py @@ -5,8 +5,8 @@ from pathlib import Path import click -from bin.config import config -from bin.utils import handle_errors +from mytoolkit.config import config +from mytoolkit.utils import handle_errors def _get_hosts() -> dict: diff --git a/bin/commands/templates.py b/mytoolkit/commands/templates.py similarity index 98% rename from bin/commands/templates.py rename to mytoolkit/commands/templates.py index 13ffc06..2421028 100644 --- a/bin/commands/templates.py +++ b/mytoolkit/commands/templates.py @@ -4,7 +4,7 @@ from pathlib import Path import click -from bin import templates_registry +from mytoolkit import templates_registry @click.group(name="templates") diff --git a/bin/commands/video.py b/mytoolkit/commands/video.py similarity index 94% rename from bin/commands/video.py rename to mytoolkit/commands/video.py index e560145..64766ef 100644 --- a/bin/commands/video.py +++ b/mytoolkit/commands/video.py @@ -5,7 +5,7 @@ from pathlib import Path import click -from bin.utils import handle_errors, run_command +from mytoolkit.utils import handle_errors, run_command @click.group() diff --git a/bin/commands/voice.py b/mytoolkit/commands/voice.py similarity index 95% rename from bin/commands/voice.py rename to mytoolkit/commands/voice.py index b399fe9..333e8c5 100644 --- a/bin/commands/voice.py +++ b/mytoolkit/commands/voice.py @@ -5,9 +5,9 @@ from pathlib import Path import click -from bin.api.voice import synthesize_tts -from bin.config import config -from bin.utils import handle_errors +from mytoolkit.api.voice import synthesize_tts +from mytoolkit.config import config +from mytoolkit.utils import handle_errors _VOICE_CHOICES = [ "zh_female_cancan_mars_bigtts", diff --git a/bin/commands/webpage.py b/mytoolkit/commands/webpage.py similarity index 99% rename from bin/commands/webpage.py rename to mytoolkit/commands/webpage.py index 40401fd..65d63a5 100644 --- a/bin/commands/webpage.py +++ b/mytoolkit/commands/webpage.py @@ -13,7 +13,7 @@ import time import click -from bin.commands.server import ( +from mytoolkit.commands.server import ( manageable_services, get_service, no_color_env, diff --git a/bin/config.py b/mytoolkit/config.py similarity index 100% rename from bin/config.py rename to mytoolkit/config.py diff --git a/bin/md_to_pdf.py b/mytoolkit/md_to_pdf.py similarity index 99% rename from bin/md_to_pdf.py rename to mytoolkit/md_to_pdf.py index 09bec06..d58e888 100644 --- a/bin/md_to_pdf.py +++ b/mytoolkit/md_to_pdf.py @@ -6,8 +6,8 @@ from pathlib import Path import click -from bin import templates_registry -from bin.utils import run_command +from mytoolkit import templates_registry +from mytoolkit.utils import run_command # Typst callouts exported by templates/md-to-pdf/{textbook,manual}/template.typ. # Keep this tuple and _extra_imports (below) in sync when adding or removing `#let` callouts. diff --git a/bin/templates_registry.py b/mytoolkit/templates_registry.py similarity index 100% rename from bin/templates_registry.py rename to mytoolkit/templates_registry.py diff --git a/bin/utils.py b/mytoolkit/utils.py similarity index 100% rename from bin/utils.py rename to mytoolkit/utils.py diff --git a/pyproject.toml b/pyproject.toml index 9c01d78..50d59a1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,10 +13,10 @@ dependencies = [ ] [project.scripts] -mytoolkit = "bin.cli:main" +mytoolkit = "mytoolkit.cli:main" [tool.hatch.build.targets.wheel] -packages = ["bin"] +packages = ["mytoolkit"] [build-system] requires = ["hatchling"]