diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index dded42a..0a563c5 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -29,7 +29,7 @@ jobs: python -m pip install pip --upgrade python -m pip install -r requirements.txt - name: Build - run: python -m tools.build_www + run: python -m tools.cli --cleanup --font-formats woff2 --html - name: Setup Pages uses: actions/configure-pages@v5 - name: Upload artifact diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 22e0cd8..09b83bc 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -8,6 +8,12 @@ jobs: release: permissions: contents: write + strategy: + matrix: + font-size: [8, 10, 12] + width-mode: [monospaced, proportional] + font-format: [otf, woff2, ttf, bdf, pcf, otc, ttc] + fail-fast: false runs-on: ubuntu-latest steps: - name: Checkout @@ -21,7 +27,7 @@ jobs: python -m pip install pip --upgrade python -m pip install -r requirements.txt - name: Build - run: python -m tools.build + run: python -m tools.cli --cleanup --font-sizes ${{ matrix.font-size }} --width-modes ${{ matrix.width-mode }} --font-formats ${{ matrix.font-format }} --release - name: Release uses: softprops/action-gh-release@v2 with: diff --git a/README.md b/README.md index d2b03f5..5ead1b3 100644 --- a/README.md +++ b/README.md @@ -112,6 +112,7 @@ Logo 捏他自 [《游戏王》](https://zh.wikipedia.org/wiki/%E9%81%8A%E6%88%B - [Jinja](https://github.com/pallets/jinja) - [HTTPX](https://github.com/encode/httpx) - [Loguru](https://github.com/Delgan/loguru) +- [Cyclopts](https://github.com/BrianPugh/cyclopts) ## 赞助 diff --git a/requirements.txt b/requirements.txt index 9daf64b..9013301 100644 --- a/requirements.txt +++ b/requirements.txt @@ -9,3 +9,4 @@ beautifulsoup4==4.12.3 Jinja2==3.1.4 httpx==0.27.0 loguru==0.7.2 +cyclopts==2.9.3 diff --git a/tools/build.py b/tools/build.py index 3d7f5ec..0f0ff1f 100644 --- a/tools/build.py +++ b/tools/build.py @@ -1,45 +1,12 @@ -import itertools -import shutil - -from tools import configs -from tools.configs import path_define -from tools.configs.dump import DumpConfig -from tools.configs.fallback import FallbackConfig -from tools.configs.font import FontConfig -from tools.services import update_service, dump_service, publish_service, info_service, template_service, image_service -from tools.services.font_service import DesignContext +from tools import cli def main(): - if path_define.build_dir.exists(): - shutil.rmtree(path_define.build_dir) - - update_service.setup_ark_pixel_glyphs() - - dump_configs = DumpConfig.load() - fallback_configs = FallbackConfig.load() - font_configs = {} - - for font_size in configs.font_sizes: - for dump_config in dump_configs[font_size]: - dump_service.dump_font(dump_config) - - for fallback_config in fallback_configs[font_size]: - dump_service.apply_fallback(fallback_config) - - font_config = FontConfig.load(font_size) - font_configs[font_size] = font_config - design_context = DesignContext.load(font_config) - for width_mode in configs.width_modes: - for font_format in itertools.chain(configs.font_formats, configs.font_collection_formats): - design_context.make_fonts(width_mode, font_format) - publish_service.make_release_zip(font_size, width_mode, font_format) - info_service.make_font_info(design_context, width_mode) - template_service.make_alphabet_html(design_context, width_mode) - template_service.make_demo_html(design_context) - image_service.make_preview_image(font_config) - template_service.make_index_html(font_configs) - template_service.make_playground_html(font_configs) + cli.main( + cleanup=True, + release=True, + all_attachments=True, + ) if __name__ == '__main__': diff --git a/tools/build_www.py b/tools/build_www.py deleted file mode 100644 index 228d0d0..0000000 --- a/tools/build_www.py +++ /dev/null @@ -1,35 +0,0 @@ -from tools import configs -from tools.configs.dump import DumpConfig -from tools.configs.fallback import FallbackConfig -from tools.configs.font import FontConfig -from tools.services import update_service, dump_service, template_service -from tools.services.font_service import DesignContext - - -def main(): - update_service.setup_ark_pixel_glyphs() - - dump_configs = DumpConfig.load() - fallback_configs = FallbackConfig.load() - font_configs = {} - - for font_size in configs.font_sizes: - for dump_config in dump_configs[font_size]: - dump_service.dump_font(dump_config) - - for fallback_config in fallback_configs[font_size]: - dump_service.apply_fallback(fallback_config) - - font_config = FontConfig.load(font_size) - font_configs[font_size] = font_config - design_context = DesignContext.load(font_config) - for width_mode in configs.width_modes: - design_context.make_fonts(width_mode, 'woff2') - template_service.make_alphabet_html(design_context, width_mode) - template_service.make_demo_html(design_context) - template_service.make_index_html(font_configs) - template_service.make_playground_html(font_configs) - - -if __name__ == '__main__': - main() diff --git a/tools/cli.py b/tools/cli.py new file mode 100644 index 0000000..531e631 --- /dev/null +++ b/tools/cli.py @@ -0,0 +1,99 @@ +import shutil + +from cyclopts import App +from loguru import logger + +from tools import configs +from tools.configs import path_define, FontSize, WidthMode, FontFormat, FontCollectionFormat +from tools.configs.dump import DumpConfig +from tools.configs.fallback import FallbackConfig +from tools.configs.font import FontConfig +from tools.services import update_service, dump_service, publish_service, info_service, template_service, image_service +from tools.services.font_service import DesignContext + +app = App(version=configs.version) + + +@app.default +def main( + cleanup: bool = False, + font_sizes: list[FontSize] | None = None, + width_modes: list[WidthMode] | None = None, + font_formats: list[FontFormat | FontCollectionFormat] | None = None, + release: bool = False, + all_attachments: bool = False, + font_info: bool = False, + html: bool = False, + image: bool = False, +): + if font_sizes is None: + font_sizes = configs.font_sizes + if width_modes is None: + width_modes = configs.width_modes + if font_formats is None: + font_formats = configs.font_formats + configs.font_collection_formats + if all_attachments: + font_info = True + html = True + image = True + + all_font_sizes = set(font_sizes) == set(configs.font_sizes) + + print() + print(f'cleanup = {cleanup}') + print(f'font_sizes = {repr(font_sizes)}') + print(f'width_modes = {repr(width_modes)}') + print(f'font_formats = {repr(font_formats)}') + print(f'release = {release}') + print(f'font_info = {font_info}') + print(f'html = {html}') + print(f'image = {image}') + print() + + if cleanup and path_define.build_dir.exists(): + shutil.rmtree(path_define.build_dir) + logger.info("Delete dir: '{}'", path_define.build_dir) + + update_service.setup_ark_pixel_glyphs() + + dump_configs = DumpConfig.load() + fallback_configs = FallbackConfig.load() + font_configs = {} + design_contexts = {} + for font_size in font_sizes: + for dump_config in dump_configs[font_size]: + dump_service.dump_font(dump_config) + + for fallback_config in fallback_configs[font_size]: + dump_service.apply_fallback(fallback_config) + + font_config = FontConfig.load(font_size) + font_configs[font_size] = font_config + design_context = DesignContext.load(font_config) + design_contexts[font_size] = design_context + for width_mode in width_modes: + for font_format in font_formats: + design_context.make_fonts(width_mode, font_format) + if release: + publish_service.make_release_zip(font_size, width_mode, font_format) + if font_info: + info_service.make_font_info(design_context, width_mode) + + if html: + for font_size in font_sizes: + design_context = design_contexts[font_size] + for width_mode in width_modes: + template_service.make_alphabet_html(design_context, width_mode) + template_service.make_demo_html(design_context) + if all_font_sizes: + template_service.make_index_html(font_configs) + template_service.make_playground_html(font_configs) + + if image: + for font_size in font_sizes: + font_config = font_configs[font_size] + image_service.make_preview_image(font_config) + + +if __name__ == '__main__': + app() diff --git a/tools/update_docs.py b/tools/update_docs.py index 010adca..3b092e9 100644 --- a/tools/update_docs.py +++ b/tools/update_docs.py @@ -1,7 +1,13 @@ +from tools import cli from tools.services import publish_service def main(): + cli.main( + font_formats=[], + font_info=True, + image=True, + ) publish_service.update_docs()