czon 0.1.0 → 0.1.1
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.
- package/.github/workflows/bump-version.yml +112 -0
- package/.github/workflows/ci.yml +64 -0
- package/.github/workflows/pages.yml +61 -0
- package/.github/workflows/publish.yml +81 -0
- package/.husky/pre-commit +1 -0
- package/.prettierignore +14 -0
- package/.prettierrc.json +11 -0
- package/.zen/meta.json +106 -0
- package/.zen/src/ar-SA/50bf41ac6fd8ec8cd6481fd1114aaf00abed0461fc8e8c81cc0373d38ffa835c.md +121 -0
- package/.zen/src/ar-SA/579c3a203225b8b7aead541f42381de0619d8bc1d451d0d9c3267dbc74205503.md +79 -0
- package/.zen/src/ar-SA/6e7ca196ba51235db30218cf9b28f92d35937b09a22411062be088a0086b29ed.md +70 -0
- package/.zen/src/ar-SA/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
- package/.zen/src/ar-SA/98a9dd72146a69d155030cb7286ea2d10e0521451de9754cbdfcde46c46f2c71.md +71 -0
- package/.zen/src/ar-SA/9d0485c244a80b14dcc92ef91cf5ff82220ed774ebb5e09549929ac75200c7bc.md +30 -0
- package/.zen/src/da-DK/50bf41ac6fd8ec8cd6481fd1114aaf00abed0461fc8e8c81cc0373d38ffa835c.md +121 -0
- package/.zen/src/da-DK/579c3a203225b8b7aead541f42381de0619d8bc1d451d0d9c3267dbc74205503.md +78 -0
- package/.zen/src/da-DK/6e7ca196ba51235db30218cf9b28f92d35937b09a22411062be088a0086b29ed.md +70 -0
- package/.zen/src/da-DK/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
- package/.zen/src/da-DK/98a9dd72146a69d155030cb7286ea2d10e0521451de9754cbdfcde46c46f2c71.md +71 -0
- package/.zen/src/da-DK/9d0485c244a80b14dcc92ef91cf5ff82220ed774ebb5e09549929ac75200c7bc.md +30 -0
- package/.zen/src/de-DE/50bf41ac6fd8ec8cd6481fd1114aaf00abed0461fc8e8c81cc0373d38ffa835c.md +121 -0
- package/.zen/src/de-DE/579c3a203225b8b7aead541f42381de0619d8bc1d451d0d9c3267dbc74205503.md +78 -0
- package/.zen/src/de-DE/6e7ca196ba51235db30218cf9b28f92d35937b09a22411062be088a0086b29ed.md +70 -0
- package/.zen/src/de-DE/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
- package/.zen/src/de-DE/98a9dd72146a69d155030cb7286ea2d10e0521451de9754cbdfcde46c46f2c71.md +71 -0
- package/.zen/src/de-DE/9d0485c244a80b14dcc92ef91cf5ff82220ed774ebb5e09549929ac75200c7bc.md +30 -0
- package/.zen/src/en-US/50bf41ac6fd8ec8cd6481fd1114aaf00abed0461fc8e8c81cc0373d38ffa835c.md +121 -0
- package/.zen/src/en-US/579c3a203225b8b7aead541f42381de0619d8bc1d451d0d9c3267dbc74205503.md +79 -0
- package/.zen/src/en-US/6e7ca196ba51235db30218cf9b28f92d35937b09a22411062be088a0086b29ed.md +70 -0
- package/.zen/src/en-US/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
- package/.zen/src/en-US/98a9dd72146a69d155030cb7286ea2d10e0521451de9754cbdfcde46c46f2c71.md +71 -0
- package/.zen/src/en-US/9d0485c244a80b14dcc92ef91cf5ff82220ed774ebb5e09549929ac75200c7bc.md +30 -0
- package/.zen/src/es-ES/50bf41ac6fd8ec8cd6481fd1114aaf00abed0461fc8e8c81cc0373d38ffa835c.md +121 -0
- package/.zen/src/es-ES/579c3a203225b8b7aead541f42381de0619d8bc1d451d0d9c3267dbc74205503.md +78 -0
- package/.zen/src/es-ES/6e7ca196ba51235db30218cf9b28f92d35937b09a22411062be088a0086b29ed.md +70 -0
- package/.zen/src/es-ES/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
- package/.zen/src/es-ES/98a9dd72146a69d155030cb7286ea2d10e0521451de9754cbdfcde46c46f2c71.md +71 -0
- package/.zen/src/es-ES/9d0485c244a80b14dcc92ef91cf5ff82220ed774ebb5e09549929ac75200c7bc.md +30 -0
- package/.zen/src/es-MX/50bf41ac6fd8ec8cd6481fd1114aaf00abed0461fc8e8c81cc0373d38ffa835c.md +121 -0
- package/.zen/src/es-MX/579c3a203225b8b7aead541f42381de0619d8bc1d451d0d9c3267dbc74205503.md +78 -0
- package/.zen/src/es-MX/6e7ca196ba51235db30218cf9b28f92d35937b09a22411062be088a0086b29ed.md +70 -0
- package/.zen/src/es-MX/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
- package/.zen/src/es-MX/98a9dd72146a69d155030cb7286ea2d10e0521451de9754cbdfcde46c46f2c71.md +71 -0
- package/.zen/src/es-MX/9d0485c244a80b14dcc92ef91cf5ff82220ed774ebb5e09549929ac75200c7bc.md +30 -0
- package/.zen/src/fi-FI/50bf41ac6fd8ec8cd6481fd1114aaf00abed0461fc8e8c81cc0373d38ffa835c.md +121 -0
- package/.zen/src/fi-FI/579c3a203225b8b7aead541f42381de0619d8bc1d451d0d9c3267dbc74205503.md +79 -0
- package/.zen/src/fi-FI/6e7ca196ba51235db30218cf9b28f92d35937b09a22411062be088a0086b29ed.md +70 -0
- package/.zen/src/fi-FI/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
- package/.zen/src/fi-FI/98a9dd72146a69d155030cb7286ea2d10e0521451de9754cbdfcde46c46f2c71.md +71 -0
- package/.zen/src/fi-FI/9d0485c244a80b14dcc92ef91cf5ff82220ed774ebb5e09549929ac75200c7bc.md +30 -0
- package/.zen/src/fr-FR/50bf41ac6fd8ec8cd6481fd1114aaf00abed0461fc8e8c81cc0373d38ffa835c.md +121 -0
- package/.zen/src/fr-FR/579c3a203225b8b7aead541f42381de0619d8bc1d451d0d9c3267dbc74205503.md +78 -0
- package/.zen/src/fr-FR/6e7ca196ba51235db30218cf9b28f92d35937b09a22411062be088a0086b29ed.md +70 -0
- package/.zen/src/fr-FR/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
- package/.zen/src/fr-FR/98a9dd72146a69d155030cb7286ea2d10e0521451de9754cbdfcde46c46f2c71.md +71 -0
- package/.zen/src/fr-FR/9d0485c244a80b14dcc92ef91cf5ff82220ed774ebb5e09549929ac75200c7bc.md +30 -0
- package/.zen/src/hi-IN/50bf41ac6fd8ec8cd6481fd1114aaf00abed0461fc8e8c81cc0373d38ffa835c.md +121 -0
- package/.zen/src/hi-IN/579c3a203225b8b7aead541f42381de0619d8bc1d451d0d9c3267dbc74205503.md +79 -0
- package/.zen/src/hi-IN/6e7ca196ba51235db30218cf9b28f92d35937b09a22411062be088a0086b29ed.md +70 -0
- package/.zen/src/hi-IN/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
- package/.zen/src/hi-IN/98a9dd72146a69d155030cb7286ea2d10e0521451de9754cbdfcde46c46f2c71.md +71 -0
- package/.zen/src/hi-IN/9d0485c244a80b14dcc92ef91cf5ff82220ed774ebb5e09549929ac75200c7bc.md +30 -0
- package/.zen/src/id-ID/50bf41ac6fd8ec8cd6481fd1114aaf00abed0461fc8e8c81cc0373d38ffa835c.md +121 -0
- package/.zen/src/id-ID/579c3a203225b8b7aead541f42381de0619d8bc1d451d0d9c3267dbc74205503.md +79 -0
- package/.zen/src/id-ID/6e7ca196ba51235db30218cf9b28f92d35937b09a22411062be088a0086b29ed.md +70 -0
- package/.zen/src/id-ID/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
- package/.zen/src/id-ID/98a9dd72146a69d155030cb7286ea2d10e0521451de9754cbdfcde46c46f2c71.md +71 -0
- package/.zen/src/id-ID/9d0485c244a80b14dcc92ef91cf5ff82220ed774ebb5e09549929ac75200c7bc.md +30 -0
- package/.zen/src/it-IT/50bf41ac6fd8ec8cd6481fd1114aaf00abed0461fc8e8c81cc0373d38ffa835c.md +121 -0
- package/.zen/src/it-IT/579c3a203225b8b7aead541f42381de0619d8bc1d451d0d9c3267dbc74205503.md +78 -0
- package/.zen/src/it-IT/6e7ca196ba51235db30218cf9b28f92d35937b09a22411062be088a0086b29ed.md +70 -0
- package/.zen/src/it-IT/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
- package/.zen/src/it-IT/98a9dd72146a69d155030cb7286ea2d10e0521451de9754cbdfcde46c46f2c71.md +71 -0
- package/.zen/src/it-IT/9d0485c244a80b14dcc92ef91cf5ff82220ed774ebb5e09549929ac75200c7bc.md +30 -0
- package/.zen/src/ja-JP/50bf41ac6fd8ec8cd6481fd1114aaf00abed0461fc8e8c81cc0373d38ffa835c.md +121 -0
- package/.zen/src/ja-JP/579c3a203225b8b7aead541f42381de0619d8bc1d451d0d9c3267dbc74205503.md +79 -0
- package/.zen/src/ja-JP/6e7ca196ba51235db30218cf9b28f92d35937b09a22411062be088a0086b29ed.md +70 -0
- package/.zen/src/ja-JP/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
- package/.zen/src/ja-JP/98a9dd72146a69d155030cb7286ea2d10e0521451de9754cbdfcde46c46f2c71.md +71 -0
- package/.zen/src/ja-JP/9d0485c244a80b14dcc92ef91cf5ff82220ed774ebb5e09549929ac75200c7bc.md +30 -0
- package/.zen/src/ko-KR/50bf41ac6fd8ec8cd6481fd1114aaf00abed0461fc8e8c81cc0373d38ffa835c.md +121 -0
- package/.zen/src/ko-KR/579c3a203225b8b7aead541f42381de0619d8bc1d451d0d9c3267dbc74205503.md +79 -0
- package/.zen/src/ko-KR/6e7ca196ba51235db30218cf9b28f92d35937b09a22411062be088a0086b29ed.md +70 -0
- package/.zen/src/ko-KR/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
- package/.zen/src/ko-KR/98a9dd72146a69d155030cb7286ea2d10e0521451de9754cbdfcde46c46f2c71.md +71 -0
- package/.zen/src/ko-KR/9d0485c244a80b14dcc92ef91cf5ff82220ed774ebb5e09549929ac75200c7bc.md +30 -0
- package/.zen/src/nl-NL/50bf41ac6fd8ec8cd6481fd1114aaf00abed0461fc8e8c81cc0373d38ffa835c.md +121 -0
- package/.zen/src/nl-NL/579c3a203225b8b7aead541f42381de0619d8bc1d451d0d9c3267dbc74205503.md +79 -0
- package/.zen/src/nl-NL/6e7ca196ba51235db30218cf9b28f92d35937b09a22411062be088a0086b29ed.md +70 -0
- package/.zen/src/nl-NL/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
- package/.zen/src/nl-NL/98a9dd72146a69d155030cb7286ea2d10e0521451de9754cbdfcde46c46f2c71.md +71 -0
- package/.zen/src/nl-NL/9d0485c244a80b14dcc92ef91cf5ff82220ed774ebb5e09549929ac75200c7bc.md +30 -0
- package/.zen/src/no-NO/50bf41ac6fd8ec8cd6481fd1114aaf00abed0461fc8e8c81cc0373d38ffa835c.md +121 -0
- package/.zen/src/no-NO/579c3a203225b8b7aead541f42381de0619d8bc1d451d0d9c3267dbc74205503.md +78 -0
- package/.zen/src/no-NO/6e7ca196ba51235db30218cf9b28f92d35937b09a22411062be088a0086b29ed.md +70 -0
- package/.zen/src/no-NO/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
- package/.zen/src/no-NO/98a9dd72146a69d155030cb7286ea2d10e0521451de9754cbdfcde46c46f2c71.md +71 -0
- package/.zen/src/no-NO/9d0485c244a80b14dcc92ef91cf5ff82220ed774ebb5e09549929ac75200c7bc.md +30 -0
- package/.zen/src/pl-PL/50bf41ac6fd8ec8cd6481fd1114aaf00abed0461fc8e8c81cc0373d38ffa835c.md +121 -0
- package/.zen/src/pl-PL/579c3a203225b8b7aead541f42381de0619d8bc1d451d0d9c3267dbc74205503.md +79 -0
- package/.zen/src/pl-PL/6e7ca196ba51235db30218cf9b28f92d35937b09a22411062be088a0086b29ed.md +70 -0
- package/.zen/src/pl-PL/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
- package/.zen/src/pl-PL/98a9dd72146a69d155030cb7286ea2d10e0521451de9754cbdfcde46c46f2c71.md +71 -0
- package/.zen/src/pl-PL/9d0485c244a80b14dcc92ef91cf5ff82220ed774ebb5e09549929ac75200c7bc.md +30 -0
- package/.zen/src/pt-BR/50bf41ac6fd8ec8cd6481fd1114aaf00abed0461fc8e8c81cc0373d38ffa835c.md +121 -0
- package/.zen/src/pt-BR/579c3a203225b8b7aead541f42381de0619d8bc1d451d0d9c3267dbc74205503.md +78 -0
- package/.zen/src/pt-BR/6e7ca196ba51235db30218cf9b28f92d35937b09a22411062be088a0086b29ed.md +70 -0
- package/.zen/src/pt-BR/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
- package/.zen/src/pt-BR/98a9dd72146a69d155030cb7286ea2d10e0521451de9754cbdfcde46c46f2c71.md +71 -0
- package/.zen/src/pt-BR/9d0485c244a80b14dcc92ef91cf5ff82220ed774ebb5e09549929ac75200c7bc.md +30 -0
- package/.zen/src/pt-PT/50bf41ac6fd8ec8cd6481fd1114aaf00abed0461fc8e8c81cc0373d38ffa835c.md +121 -0
- package/.zen/src/pt-PT/579c3a203225b8b7aead541f42381de0619d8bc1d451d0d9c3267dbc74205503.md +78 -0
- package/.zen/src/pt-PT/6e7ca196ba51235db30218cf9b28f92d35937b09a22411062be088a0086b29ed.md +70 -0
- package/.zen/src/pt-PT/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
- package/.zen/src/pt-PT/98a9dd72146a69d155030cb7286ea2d10e0521451de9754cbdfcde46c46f2c71.md +71 -0
- package/.zen/src/pt-PT/9d0485c244a80b14dcc92ef91cf5ff82220ed774ebb5e09549929ac75200c7bc.md +30 -0
- package/.zen/src/ru-RU/50bf41ac6fd8ec8cd6481fd1114aaf00abed0461fc8e8c81cc0373d38ffa835c.md +121 -0
- package/.zen/src/ru-RU/579c3a203225b8b7aead541f42381de0619d8bc1d451d0d9c3267dbc74205503.md +78 -0
- package/.zen/src/ru-RU/6e7ca196ba51235db30218cf9b28f92d35937b09a22411062be088a0086b29ed.md +70 -0
- package/.zen/src/ru-RU/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
- package/.zen/src/ru-RU/98a9dd72146a69d155030cb7286ea2d10e0521451de9754cbdfcde46c46f2c71.md +71 -0
- package/.zen/src/ru-RU/9d0485c244a80b14dcc92ef91cf5ff82220ed774ebb5e09549929ac75200c7bc.md +30 -0
- package/.zen/src/sv-SE/50bf41ac6fd8ec8cd6481fd1114aaf00abed0461fc8e8c81cc0373d38ffa835c.md +121 -0
- package/.zen/src/sv-SE/579c3a203225b8b7aead541f42381de0619d8bc1d451d0d9c3267dbc74205503.md +78 -0
- package/.zen/src/sv-SE/6e7ca196ba51235db30218cf9b28f92d35937b09a22411062be088a0086b29ed.md +70 -0
- package/.zen/src/sv-SE/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
- package/.zen/src/sv-SE/98a9dd72146a69d155030cb7286ea2d10e0521451de9754cbdfcde46c46f2c71.md +71 -0
- package/.zen/src/sv-SE/9d0485c244a80b14dcc92ef91cf5ff82220ed774ebb5e09549929ac75200c7bc.md +30 -0
- package/.zen/src/th-TH/50bf41ac6fd8ec8cd6481fd1114aaf00abed0461fc8e8c81cc0373d38ffa835c.md +121 -0
- package/.zen/src/th-TH/579c3a203225b8b7aead541f42381de0619d8bc1d451d0d9c3267dbc74205503.md +79 -0
- package/.zen/src/th-TH/6e7ca196ba51235db30218cf9b28f92d35937b09a22411062be088a0086b29ed.md +70 -0
- package/.zen/src/th-TH/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
- package/.zen/src/th-TH/98a9dd72146a69d155030cb7286ea2d10e0521451de9754cbdfcde46c46f2c71.md +71 -0
- package/.zen/src/th-TH/9d0485c244a80b14dcc92ef91cf5ff82220ed774ebb5e09549929ac75200c7bc.md +30 -0
- package/.zen/src/tr-TR/50bf41ac6fd8ec8cd6481fd1114aaf00abed0461fc8e8c81cc0373d38ffa835c.md +121 -0
- package/.zen/src/tr-TR/579c3a203225b8b7aead541f42381de0619d8bc1d451d0d9c3267dbc74205503.md +79 -0
- package/.zen/src/tr-TR/6e7ca196ba51235db30218cf9b28f92d35937b09a22411062be088a0086b29ed.md +70 -0
- package/.zen/src/tr-TR/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
- package/.zen/src/tr-TR/98a9dd72146a69d155030cb7286ea2d10e0521451de9754cbdfcde46c46f2c71.md +71 -0
- package/.zen/src/tr-TR/9d0485c244a80b14dcc92ef91cf5ff82220ed774ebb5e09549929ac75200c7bc.md +30 -0
- package/.zen/src/uk-UA/50bf41ac6fd8ec8cd6481fd1114aaf00abed0461fc8e8c81cc0373d38ffa835c.md +121 -0
- package/.zen/src/uk-UA/579c3a203225b8b7aead541f42381de0619d8bc1d451d0d9c3267dbc74205503.md +79 -0
- package/.zen/src/uk-UA/6e7ca196ba51235db30218cf9b28f92d35937b09a22411062be088a0086b29ed.md +70 -0
- package/.zen/src/uk-UA/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
- package/.zen/src/uk-UA/98a9dd72146a69d155030cb7286ea2d10e0521451de9754cbdfcde46c46f2c71.md +71 -0
- package/.zen/src/uk-UA/9d0485c244a80b14dcc92ef91cf5ff82220ed774ebb5e09549929ac75200c7bc.md +30 -0
- package/.zen/src/vi-VN/50bf41ac6fd8ec8cd6481fd1114aaf00abed0461fc8e8c81cc0373d38ffa835c.md +121 -0
- package/.zen/src/vi-VN/579c3a203225b8b7aead541f42381de0619d8bc1d451d0d9c3267dbc74205503.md +78 -0
- package/.zen/src/vi-VN/6e7ca196ba51235db30218cf9b28f92d35937b09a22411062be088a0086b29ed.md +70 -0
- package/.zen/src/vi-VN/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +71 -0
- package/.zen/src/vi-VN/98a9dd72146a69d155030cb7286ea2d10e0521451de9754cbdfcde46c46f2c71.md +71 -0
- package/.zen/src/vi-VN/9d0485c244a80b14dcc92ef91cf5ff82220ed774ebb5e09549929ac75200c7bc.md +30 -0
- package/.zen/src/zh-Hans/4b2cedd76dddb2a20b1890460735dd38fa65e293a37d6bd15310852ba1c851c4.md +21 -0
- package/.zen/src/zh-Hans/50bf41ac6fd8ec8cd6481fd1114aaf00abed0461fc8e8c81cc0373d38ffa835c.md +123 -0
- package/.zen/src/zh-Hans/579c3a203225b8b7aead541f42381de0619d8bc1d451d0d9c3267dbc74205503.md +81 -0
- package/.zen/src/zh-Hans/59fe7aff1dcf6f4bbbaff1ad2f7c4c5a3d34b99b1d288b78717ee34525c9897b.md +24 -0
- package/.zen/src/zh-Hans/6e7ca196ba51235db30218cf9b28f92d35937b09a22411062be088a0086b29ed.md +74 -0
- package/.zen/src/zh-Hans/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +74 -0
- package/.zen/src/zh-Hans/98a9dd72146a69d155030cb7286ea2d10e0521451de9754cbdfcde46c46f2c71.md +75 -0
- package/.zen/src/zh-Hans/9d0485c244a80b14dcc92ef91cf5ff82220ed774ebb5e09549929ac75200c7bc.md +31 -0
- package/.zen/src/zh-Hans/c1b0e9eb01d78140c21097187d6395815fd01a6f179af31b7e72532ec6c7c682.md +75 -0
- package/.zen/src/zh-Hans/cbf2fcda767ee28fe49828908c14de2c8edba8f8b7d721743eda767838b70923.md +67 -0
- package/.zen/src/zh-Hans/ec9fa686ad66e28d8d9ee131812bb6f31052185584de0853db1ee8893ebddda3.md +22 -0
- package/.zen/src/zh-Hans/f119cbaf7645c713b1e0fa67abdc1070766c80f94eec9e42108bfa37ef85db43.md +24 -0
- package/.zen/src/zh-Hant/50bf41ac6fd8ec8cd6481fd1114aaf00abed0461fc8e8c81cc0373d38ffa835c.md +123 -0
- package/.zen/src/zh-Hant/579c3a203225b8b7aead541f42381de0619d8bc1d451d0d9c3267dbc74205503.md +81 -0
- package/.zen/src/zh-Hant/6e7ca196ba51235db30218cf9b28f92d35937b09a22411062be088a0086b29ed.md +70 -0
- package/.zen/src/zh-Hant/74541be9d53c64107a548e09847244d52bff803960942cd2bfbd2a8600afb805.md +74 -0
- package/.zen/src/zh-Hant/98a9dd72146a69d155030cb7286ea2d10e0521451de9754cbdfcde46c46f2c71.md +71 -0
- package/.zen/src/zh-Hant/9d0485c244a80b14dcc92ef91cf5ff82220ed774ebb5e09549929ac75200c7bc.md +31 -0
- package/README.md +56 -0
- package/assets/templates/default/layout.html +421 -0
- package/dist/ai/extractMetadataFromMarkdown.d.ts +8 -0
- package/dist/ai/extractMetadataFromMarkdown.d.ts.map +1 -0
- package/dist/ai/extractMetadataFromMarkdown.js +88 -0
- package/dist/ai/extractMetadataFromMarkdown.js.map +1 -0
- package/dist/ai/translateMarkdown.d.ts +8 -0
- package/dist/ai/translateMarkdown.d.ts.map +1 -0
- package/dist/ai/translateMarkdown.js +60 -0
- package/dist/ai/translateMarkdown.js.map +1 -0
- package/dist/build/pipeline.d.ts +6 -0
- package/dist/build/pipeline.d.ts.map +1 -0
- package/dist/build/pipeline.js +180 -0
- package/dist/build/pipeline.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +102 -0
- package/dist/cli.js.map +1 -0
- package/dist/findEntries.d.ts +10 -0
- package/dist/findEntries.d.ts.map +1 -0
- package/dist/findEntries.js +38 -0
- package/dist/findEntries.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/languages.d.ts +2 -0
- package/dist/languages.d.ts.map +1 -0
- package/dist/languages.js +37 -0
- package/dist/languages.js.map +1 -0
- package/dist/metadata.d.ts +14 -0
- package/dist/metadata.d.ts.map +1 -0
- package/dist/metadata.js +78 -0
- package/dist/metadata.js.map +1 -0
- package/dist/paths.d.ts +6 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +10 -0
- package/dist/paths.js.map +1 -0
- package/dist/process/extractMetadataByAI.d.ts +5 -0
- package/dist/process/extractMetadataByAI.d.ts.map +1 -0
- package/dist/process/extractMetadataByAI.js +31 -0
- package/dist/process/extractMetadataByAI.js.map +1 -0
- package/dist/process/scanSourceFiles.d.ts +5 -0
- package/dist/process/scanSourceFiles.d.ts.map +1 -0
- package/dist/process/scanSourceFiles.js +70 -0
- package/dist/process/scanSourceFiles.js.map +1 -0
- package/dist/process/template.d.ts +5 -0
- package/dist/process/template.d.ts.map +1 -0
- package/dist/process/template.js +207 -0
- package/dist/process/template.js.map +1 -0
- package/dist/services/openai.d.ts +41 -0
- package/dist/services/openai.d.ts.map +1 -0
- package/dist/services/openai.js +54 -0
- package/dist/services/openai.js.map +1 -0
- package/dist/types.d.ts +35 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/convertMarkdownToHtml.d.ts +7 -0
- package/dist/utils/convertMarkdownToHtml.d.ts.map +1 -0
- package/dist/utils/convertMarkdownToHtml.js +94 -0
- package/dist/utils/convertMarkdownToHtml.js.map +1 -0
- package/dist/utils/frontmatter.d.ts +6 -0
- package/dist/utils/frontmatter.d.ts.map +1 -0
- package/dist/utils/frontmatter.js +22 -0
- package/dist/utils/frontmatter.js.map +1 -0
- package/dist/utils/sha256.d.ts +2 -0
- package/dist/utils/sha256.d.ts.map +1 -0
- package/dist/utils/sha256.js +7 -0
- package/dist/utils/sha256.js.map +1 -0
- package/docs/test-katex.md +66 -0
- package/docs/test-mermaid.md +105 -0
- package/docs/tricks.md +15 -0
- package/package.json +58 -6
- package/src/ai/extractMetadataFromMarkdown.ts +95 -0
- package/src/ai/translateMarkdown.ts +60 -0
- package/src/build/pipeline.ts +172 -0
- package/src/cli.ts +73 -0
- package/src/findEntries.ts +37 -0
- package/src/index.ts +1 -0
- package/src/languages.ts +37 -0
- package/src/metadata.ts +44 -0
- package/src/paths.ts +7 -0
- package/src/process/extractMetadataByAI.ts +31 -0
- package/src/process/scanSourceFiles.ts +73 -0
- package/src/process/template.ts +222 -0
- package/src/services/openai.ts +92 -0
- package/src/types.ts +37 -0
- package/src/utils/convertMarkdownToHtml.ts +93 -0
- package/src/utils/frontmatter.ts +18 -0
- package/src/utils/sha256.ts +4 -0
- package/test-multilang.js +44 -0
- package/tsconfig.json +19 -0
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# KaTeX 公式显示效果测试
|
|
2
|
+
|
|
3
|
+
这是一个行内公式测试: $ E = mc^2 $ 。
|
|
4
|
+
|
|
5
|
+
这是一个块级公式测试:
|
|
6
|
+
|
|
7
|
+
$$
|
|
8
|
+
\int_a^b f(x) \, dx = F(b) - F(a)
|
|
9
|
+
$$
|
|
10
|
+
|
|
11
|
+
这是另一个块级公式测试:
|
|
12
|
+
|
|
13
|
+
$$
|
|
14
|
+
\frac{d}{dx}e^x = e^x
|
|
15
|
+
$$
|
|
16
|
+
|
|
17
|
+
这是一个复杂的公式测试:
|
|
18
|
+
|
|
19
|
+
$$
|
|
20
|
+
\sum_{n=1}^{\infty} \frac{1}{n^2} = \frac{\pi^2}{6}
|
|
21
|
+
$$
|
|
22
|
+
|
|
23
|
+
带有 cases 的公式测试:
|
|
24
|
+
|
|
25
|
+
$$
|
|
26
|
+
f(x) =
|
|
27
|
+
\begin{cases}
|
|
28
|
+
x^2 & \text{if } x \geq 0 \\
|
|
29
|
+
-x & \text{if } x < 0
|
|
30
|
+
\end{cases}
|
|
31
|
+
$$
|
|
32
|
+
|
|
33
|
+
表格公式:
|
|
34
|
+
|
|
35
|
+
$$
|
|
36
|
+
\begin{array}{c|c|c}
|
|
37
|
+
a & b & c \\
|
|
38
|
+
\hline
|
|
39
|
+
1 & 2 & 3 \\
|
|
40
|
+
4 & 5 & 6 \\
|
|
41
|
+
\end{array}
|
|
42
|
+
$$
|
|
43
|
+
|
|
44
|
+
矩阵公式:
|
|
45
|
+
|
|
46
|
+
$$
|
|
47
|
+
\begin{pmatrix}
|
|
48
|
+
1 & 2 \\
|
|
49
|
+
3 & 4
|
|
50
|
+
\end{pmatrix}
|
|
51
|
+
$$
|
|
52
|
+
|
|
53
|
+
含有 text 的公式测试:
|
|
54
|
+
|
|
55
|
+
$$
|
|
56
|
+
E = mc^2 \quad \text{where } m \text{ is mass and
|
|
57
|
+
} c \text{ is the speed of light}
|
|
58
|
+
$$
|
|
59
|
+
|
|
60
|
+
广义凯利公式:
|
|
61
|
+
|
|
62
|
+
$$
|
|
63
|
+
f^* = \argmax_f \sum_{i \in X} P_i \ln (1 + f \cdot R_i)
|
|
64
|
+
$$
|
|
65
|
+
|
|
66
|
+
请确保以上公式均能正确显示。
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# Mermaid 图表测试
|
|
2
|
+
|
|
3
|
+
这是一个测试文件,用于验证 ZEN 中的 Mermaid 图表渲染功能。
|
|
4
|
+
|
|
5
|
+
## 流程图示例
|
|
6
|
+
|
|
7
|
+
```mermaid
|
|
8
|
+
graph TD
|
|
9
|
+
A[开始] --> B{是否继续?}
|
|
10
|
+
B -->|是| C[执行操作]
|
|
11
|
+
B -->|否| D[结束]
|
|
12
|
+
C --> E[检查结果]
|
|
13
|
+
E --> F{是否成功?}
|
|
14
|
+
F -->|是| G[完成]
|
|
15
|
+
F -->|否| H[重试]
|
|
16
|
+
H --> C
|
|
17
|
+
G --> D
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## 序列图示例
|
|
21
|
+
|
|
22
|
+
```mermaid
|
|
23
|
+
sequenceDiagram
|
|
24
|
+
participant User
|
|
25
|
+
participant System
|
|
26
|
+
participant Database
|
|
27
|
+
|
|
28
|
+
User->>System: 提交请求
|
|
29
|
+
System->>Database: 查询数据
|
|
30
|
+
Database-->>System: 返回结果
|
|
31
|
+
System-->>User: 显示结果
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## 甘特图示例
|
|
35
|
+
|
|
36
|
+
```mermaid
|
|
37
|
+
gantt
|
|
38
|
+
title 项目时间表
|
|
39
|
+
dateFormat YYYY-MM-DD
|
|
40
|
+
section 设计
|
|
41
|
+
需求分析 :done, des1, 2024-01-01, 7d
|
|
42
|
+
原型设计 :active, des2, 2024-01-08, 5d
|
|
43
|
+
详细设计 : des3, after des2, 5d
|
|
44
|
+
section 开发
|
|
45
|
+
前端开发 : dev1, after des3, 10d
|
|
46
|
+
后端开发 : dev2, after des3, 15d
|
|
47
|
+
section 测试
|
|
48
|
+
单元测试 : test1, after dev1, 5d
|
|
49
|
+
集成测试 : test2, after dev2, 5d
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## 类图示例
|
|
53
|
+
|
|
54
|
+
```mermaid
|
|
55
|
+
classDiagram
|
|
56
|
+
class Animal {
|
|
57
|
+
+String name
|
|
58
|
+
+int age
|
|
59
|
+
+void eat()
|
|
60
|
+
+void sleep()
|
|
61
|
+
}
|
|
62
|
+
class Dog {
|
|
63
|
+
+void bark()
|
|
64
|
+
}
|
|
65
|
+
class Cat {
|
|
66
|
+
+void meow()
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
Animal <|-- Dog
|
|
70
|
+
Animal <|-- Cat
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## 状态图示例
|
|
74
|
+
|
|
75
|
+
```mermaid
|
|
76
|
+
stateDiagram-v2
|
|
77
|
+
[*] --> Idle
|
|
78
|
+
Idle --> Processing : 开始处理
|
|
79
|
+
Processing --> Success : 处理成功
|
|
80
|
+
Processing --> Error : 处理失败
|
|
81
|
+
Success --> [*]
|
|
82
|
+
Error --> [*]
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## 饼图示例
|
|
86
|
+
|
|
87
|
+
```mermaid
|
|
88
|
+
pie title 浏览器使用率
|
|
89
|
+
"Chrome" : 65.2
|
|
90
|
+
"Firefox" : 15.3
|
|
91
|
+
"Safari" : 12.5
|
|
92
|
+
"Edge" : 5.2
|
|
93
|
+
"其他" : 1.8
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## 错误语法测试(应该显示错误信息)
|
|
97
|
+
|
|
98
|
+
```mermaid
|
|
99
|
+
graph TD
|
|
100
|
+
A --> B
|
|
101
|
+
// 这里缺少箭头定义
|
|
102
|
+
C --> D
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
这个测试文件包含了多种 Mermaid 图表类型,用于验证 ZEN 的 Mermaid 集成是否正常工作。
|
package/docs/tricks.md
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# 使用技巧
|
|
2
|
+
|
|
3
|
+
## 在正文中声明日期
|
|
4
|
+
|
|
5
|
+
正文中可以使用 "今天是 2026 年 1 月 8 日" 这样的日期声明(格式风格自由),ZEN 会自动识别并处理。
|
|
6
|
+
|
|
7
|
+
传统 Markdown 文档是通过 YAML Frontmatter 声明日期,需要记住对应的字段,否则会导致日期无法正确识别。
|
|
8
|
+
|
|
9
|
+
ZEN 支持在正文中直接声明日期,避免了忘记填写 Frontmatter 字段的问题。
|
|
10
|
+
|
|
11
|
+
AI 会自动提取并推断正文中的日期信息,并将其作为文档的创建日期进行处理。
|
|
12
|
+
|
|
13
|
+
这种方式更加灵活和智能,提升了用户体验。
|
|
14
|
+
|
|
15
|
+
顺带一提,具有日期的文档,可以生成时间线视图,方便浏览和管理。特别适合日记、博客等需要时间线的内容类型。
|
package/package.json
CHANGED
|
@@ -1,12 +1,64 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "czon",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"description": "",
|
|
5
|
-
"license": "MIT",
|
|
6
|
-
"author": "zccz14",
|
|
7
|
-
"type": "commonjs",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "CZone - A minimalist Markdown documentation site builder",
|
|
8
5
|
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"bin": "dist/cli.js",
|
|
9
8
|
"scripts": {
|
|
10
|
-
"
|
|
9
|
+
"build": "npx rimraf dist && tsc",
|
|
10
|
+
"dev": "ts-node src/cli.ts",
|
|
11
|
+
"build:doc": "npm run build && node dist/cli.js build --lang zh-Hans --lang en-US --lang ja-JP --lang ko-KR --lang es-ES --lang fr-FR --lang de-DE --lang ru-RU --lang pt-PT --lang it-IT --lang nl-NL --lang pl-PL --lang sv-SE --lang fi-FI --lang da-DK --lang no-NO --lang zh-Hant --lang hi-IN --lang ar-SA --lang th-TH --lang vi-VN --lang id-ID --lang pt-BR --lang es-MX --lang tr-TR --lang uk-UA --verbose",
|
|
12
|
+
"test": "npm run build && node --test dist/**/*.test.js",
|
|
13
|
+
"test:types": "tsc --noEmit",
|
|
14
|
+
"test:build": "npm run build && test -f dist/index.js && test -f dist/cli.js",
|
|
15
|
+
"test:cli": "node -e \"const pkg = require('./package.json'); console.log('Package:', pkg.name, 'v' + pkg.version)\"",
|
|
16
|
+
"format": "prettier --write \"**/*.{ts,js,json,md}\"",
|
|
17
|
+
"format:check": "prettier --check \"**/*.{ts,js,json,md}\"",
|
|
18
|
+
"prepublishOnly": "npm run build",
|
|
19
|
+
"prepare": "husky"
|
|
20
|
+
},
|
|
21
|
+
"keywords": [
|
|
22
|
+
"markdown",
|
|
23
|
+
"static-site",
|
|
24
|
+
"documentation",
|
|
25
|
+
"cli"
|
|
26
|
+
],
|
|
27
|
+
"author": "zccz14",
|
|
28
|
+
"license": "ISC",
|
|
29
|
+
"repository": {
|
|
30
|
+
"type": "git",
|
|
31
|
+
"url": "git+https://github.com/zccz14/CZON.git"
|
|
32
|
+
},
|
|
33
|
+
"bugs": {
|
|
34
|
+
"url": "https://github.com/zccz14/CZON/issues"
|
|
35
|
+
},
|
|
36
|
+
"homepage": "https://github.com/zccz14/CZON#readme",
|
|
37
|
+
"lint-staged": {
|
|
38
|
+
"*.{ts,js,json,md}": [
|
|
39
|
+
"prettier --write"
|
|
40
|
+
]
|
|
41
|
+
},
|
|
42
|
+
"devDependencies": {
|
|
43
|
+
"@types/chokidar": "^1.7.5",
|
|
44
|
+
"@types/express": "^5.0.6",
|
|
45
|
+
"@types/node": "^25.0.3",
|
|
46
|
+
"@types/yaml": "^1.9.6",
|
|
47
|
+
"husky": "^9.1.7",
|
|
48
|
+
"lint-staged": "^16.2.7",
|
|
49
|
+
"prettier": "^3.7.4",
|
|
50
|
+
"ts-node": "^10.9.2",
|
|
51
|
+
"typescript": "^5.9.3"
|
|
52
|
+
},
|
|
53
|
+
"dependencies": {
|
|
54
|
+
"chokidar": "^5.0.0",
|
|
55
|
+
"clipanion": "^4.0.0-rc.4",
|
|
56
|
+
"dotenv": "^16.4.7",
|
|
57
|
+
"express": "^4.21.2",
|
|
58
|
+
"highlight.js": "^11.11.1",
|
|
59
|
+
"marked": "^17.0.1",
|
|
60
|
+
"marked-katex-extension": "^5.1.6",
|
|
61
|
+
"minimatch": "^10.1.1",
|
|
62
|
+
"yaml": "^2.8.2"
|
|
11
63
|
}
|
|
12
64
|
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { completeMessages, OpenAIMessage } from '../services/openai';
|
|
2
|
+
import { AIMetadata } from '../types';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* 从 markdown 内容中提取 metadata
|
|
6
|
+
* @param content Markdown 内容
|
|
7
|
+
* @returns Promise<AIMetadata> 提取的元数据,失败时抛出错误
|
|
8
|
+
*/
|
|
9
|
+
export async function extractMetadataFromMarkdown(content: string): Promise<AIMetadata> {
|
|
10
|
+
const prompt = buildMetadataPrompt(content);
|
|
11
|
+
const messages: OpenAIMessage[] = [
|
|
12
|
+
{
|
|
13
|
+
role: 'system',
|
|
14
|
+
content:
|
|
15
|
+
'你是一个专业的文档分析助手,擅长从文档中提取结构化信息。请严格按照要求的 JSON 格式返回结果。',
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
role: 'user',
|
|
19
|
+
content: prompt,
|
|
20
|
+
},
|
|
21
|
+
];
|
|
22
|
+
|
|
23
|
+
const response = await completeMessages(messages, {
|
|
24
|
+
response_format: { type: 'json_object' },
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
const metadata = parseMetadataResponse(response.choices[0].message.content);
|
|
28
|
+
|
|
29
|
+
// 添加 tokens 使用情况
|
|
30
|
+
metadata.tokens_used = {
|
|
31
|
+
prompt: response.usage.prompt_tokens,
|
|
32
|
+
completion: response.usage.completion_tokens,
|
|
33
|
+
total: response.usage.total_tokens,
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
return metadata;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* 构建提取 metadata 的 prompt
|
|
41
|
+
*/
|
|
42
|
+
function buildMetadataPrompt(content: string): string {
|
|
43
|
+
// 限制内容长度以避免 token 超限
|
|
44
|
+
const maxContentLength = Infinity; // 可根据需要调整长度限制
|
|
45
|
+
const truncatedContent =
|
|
46
|
+
content.length > maxContentLength
|
|
47
|
+
? content.substring(0, maxContentLength) + '... [内容已截断]'
|
|
48
|
+
: content;
|
|
49
|
+
|
|
50
|
+
return `请分析以下文档内容,提取以下信息并返回 JSON 格式:
|
|
51
|
+
|
|
52
|
+
文档内容:
|
|
53
|
+
"""
|
|
54
|
+
${truncatedContent}
|
|
55
|
+
"""
|
|
56
|
+
|
|
57
|
+
请提取:
|
|
58
|
+
1. title: 文档的标题(简洁明了,不超过 30 个字)
|
|
59
|
+
2. summary: 文档摘要(控制在 300 字以内,概括主要内容)
|
|
60
|
+
3. tags: 关键词列表(3-8 个关键词,使用中文或英文)
|
|
61
|
+
4. inferred_date: 文档中隐含的创建日期(如果有的话,格式:YYYY-MM-DD,没有就留空字符串)
|
|
62
|
+
5. inferred_lang: 文档使用的语言代码(例如:zh-Hans 表示简体中文,en-US 表示美式英语)
|
|
63
|
+
|
|
64
|
+
请严格按照以下 JSON 格式返回,不要包含任何其他文本:
|
|
65
|
+
{
|
|
66
|
+
"title": "文档标题",
|
|
67
|
+
"summary": "文档摘要...",
|
|
68
|
+
"tags": ["关键词1", "关键词2", "关键词3"],
|
|
69
|
+
"inferred_date": "2023-01-01",
|
|
70
|
+
"inferred_lang": "zh-Hans"
|
|
71
|
+
}`;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* 解析 AI 返回的 metadata
|
|
76
|
+
*/
|
|
77
|
+
function parseMetadataResponse(responseContent: string): AIMetadata {
|
|
78
|
+
try {
|
|
79
|
+
const metadata = JSON.parse(responseContent);
|
|
80
|
+
|
|
81
|
+
// 验证和清理数据
|
|
82
|
+
return {
|
|
83
|
+
title: metadata.title?.trim() || '未命名文档',
|
|
84
|
+
summary: metadata.summary?.trim() || '',
|
|
85
|
+
tags: Array.isArray(metadata.tags)
|
|
86
|
+
? metadata.tags.map((tag: string) => tag.trim()).filter(Boolean)
|
|
87
|
+
: [],
|
|
88
|
+
inferred_date: metadata.inferred_date?.trim() || undefined,
|
|
89
|
+
inferred_lang: metadata.inferred_lang?.trim() || 'zh-Hans',
|
|
90
|
+
};
|
|
91
|
+
} catch (error) {
|
|
92
|
+
console.error('❌ Failed to parse AI response:', error, 'Response:', responseContent);
|
|
93
|
+
throw error;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { LANGUAGE_NAMES } from '../languages';
|
|
2
|
+
import { completeMessages, OpenAIMessage } from '../services/openai';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
|
|
6
|
+
* @param content Markdown 内容
|
|
7
|
+
* @param targetLang 目标语言代码(例如:zh-Hans, en-US)
|
|
8
|
+
* @returns Promise<string> 翻译后的 Markdown 内容
|
|
9
|
+
*/
|
|
10
|
+
export async function translateMarkdown(content: string, targetLang: string): Promise<string> {
|
|
11
|
+
const langName = LANGUAGE_NAMES[targetLang];
|
|
12
|
+
const lang = `${langName} (${targetLang})`;
|
|
13
|
+
const messages: OpenAIMessage[] = [
|
|
14
|
+
{
|
|
15
|
+
role: 'system',
|
|
16
|
+
content: [
|
|
17
|
+
`You are a professional document translator.`,
|
|
18
|
+
`Translate the following markdown content into ${lang}`,
|
|
19
|
+
targetLang === 'ja-JP'
|
|
20
|
+
? [
|
|
21
|
+
//
|
|
22
|
+
'使用日语母语者自然的表达方式。',
|
|
23
|
+
'采用适合技术/专业文档的礼貌、正式语体(丁寧体/です・ます体)',
|
|
24
|
+
'确保语法和字符集完全符合日语规范。',
|
|
25
|
+
'绝对禁止使用繁体中文汉字。',
|
|
26
|
+
'所有日语汉字必须使用标准的 **日本常用汉字(Jōyō kanji)** 字形。',
|
|
27
|
+
'特别检查以下字形示例,确保使用日文标准字形:',
|
|
28
|
+
'1. “国” - 使用“国”而非“國”',
|
|
29
|
+
'2. “学” - 使用“学”而非“學”',
|
|
30
|
+
'3. “広” - 使用“広”而非“廣”',
|
|
31
|
+
'4. “円” - 使用“円”而非“圓”',
|
|
32
|
+
'5. “医” - 使用“医”而非“醫”',
|
|
33
|
+
'6. “図” - 使用“図”而非“圖”',
|
|
34
|
+
'7. “対” - 使用“対”而非“對”',
|
|
35
|
+
'8. “声” - 使用“声”而非“聲”',
|
|
36
|
+
'9. “芸” - 使用“芸”而非“藝”',
|
|
37
|
+
'10. “験” - 使用“験”而非“驗”',
|
|
38
|
+
].join('\n')
|
|
39
|
+
: ``,
|
|
40
|
+
`Preserve the original markdown formatting, including headings, lists, code blocks, links, and images.`,
|
|
41
|
+
`Do not change any non-text elements or their formatting.`,
|
|
42
|
+
`Ensure that technical terms and code snippets remain unchanged.`,
|
|
43
|
+
`Provide a natural and fluent translation suitable for readers familiar with the subject matter.`,
|
|
44
|
+
].join('\n'),
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
role: 'user',
|
|
48
|
+
content: content,
|
|
49
|
+
},
|
|
50
|
+
];
|
|
51
|
+
|
|
52
|
+
const response = await completeMessages(messages);
|
|
53
|
+
const translatedContent = response.choices[0]?.message?.content?.trim() || '';
|
|
54
|
+
|
|
55
|
+
if (!translatedContent) {
|
|
56
|
+
throw new Error('Empty translation response');
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return translatedContent;
|
|
60
|
+
}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import * as fs from 'fs/promises';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import { translateMarkdown } from '../ai/translateMarkdown';
|
|
4
|
+
import { loadMetaData, MetaData, saveMetaData } from '../metadata';
|
|
5
|
+
import { INPUT_DIR, ZEN_DIR, ZEN_DIST_DIR, ZEN_SRC_DIR } from '../paths';
|
|
6
|
+
import { extractMetadataByAI } from '../process/extractMetadataByAI';
|
|
7
|
+
import { scanSourceFiles } from '../process/scanSourceFiles';
|
|
8
|
+
import { renderTemplates } from '../process/template';
|
|
9
|
+
import { BuildOptions } from '../types';
|
|
10
|
+
import { updateFrontmatter } from '../utils/frontmatter';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* 验证构建配置
|
|
14
|
+
*/
|
|
15
|
+
async function validateConfig(options: BuildOptions): Promise<void> {
|
|
16
|
+
const { verbose = false } = options;
|
|
17
|
+
|
|
18
|
+
if (verbose) {
|
|
19
|
+
console.log(`🚀 Starting ZEN build...`);
|
|
20
|
+
if (options.langs && options.langs.length > 0) {
|
|
21
|
+
console.log(`🌐 Target languages: ${options.langs.join(', ')}`);
|
|
22
|
+
}
|
|
23
|
+
console.log(`🔍 Verbose mode enabled`);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
MetaData.options = options;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* 存储母语文件到 .zen/src
|
|
31
|
+
*/
|
|
32
|
+
async function storeNativeFiles(): Promise<void> {
|
|
33
|
+
const {
|
|
34
|
+
options: { verbose },
|
|
35
|
+
files,
|
|
36
|
+
} = MetaData;
|
|
37
|
+
for (const file of MetaData.files) {
|
|
38
|
+
try {
|
|
39
|
+
if (!file.hash) throw new Error(`Missing hash`);
|
|
40
|
+
if (!file.metadata?.inferred_lang) throw new Error(`Missing inferred language`);
|
|
41
|
+
const filePath = path.join(ZEN_SRC_DIR, file.metadata.inferred_lang, file.hash + '.md');
|
|
42
|
+
const originalContent = await fs.readFile(path.join(INPUT_DIR, file.path), 'utf-8');
|
|
43
|
+
|
|
44
|
+
const enhancedContent = updateFrontmatter(originalContent, {
|
|
45
|
+
title: file.metadata.title,
|
|
46
|
+
summary: file.metadata.summary,
|
|
47
|
+
tags: file.metadata.tags,
|
|
48
|
+
inferred_date: file.metadata.inferred_date,
|
|
49
|
+
inferred_lang: file.metadata.inferred_lang,
|
|
50
|
+
});
|
|
51
|
+
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
52
|
+
|
|
53
|
+
await fs.writeFile(filePath, enhancedContent, 'utf-8');
|
|
54
|
+
} catch (error) {
|
|
55
|
+
console.warn(`⚠️ Failed to store native file ${file.path}:`, error);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (verbose && files.length > 0) {
|
|
60
|
+
console.log(`💾 Stored ${files.length} native language files to .zen/src`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* 处理翻译
|
|
66
|
+
*/
|
|
67
|
+
async function processTranslations(): Promise<void> {
|
|
68
|
+
const {
|
|
69
|
+
files,
|
|
70
|
+
options: { langs = [], verbose },
|
|
71
|
+
} = MetaData;
|
|
72
|
+
|
|
73
|
+
await Promise.all(
|
|
74
|
+
files.flatMap(async file => {
|
|
75
|
+
return Promise.all(
|
|
76
|
+
langs.map(async lang => {
|
|
77
|
+
if (verbose) console.info(`📄 Processing file for translation: ${file.path}`);
|
|
78
|
+
if (!file.metadata) {
|
|
79
|
+
console.warn(`⚠️ Missing metadata for file: ${file.path}, skipping translation.`);
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
if (verbose) console.log(`🌐 Translating to ${lang}...`);
|
|
83
|
+
// 存储翻译文件到 .zen/src/{lang}
|
|
84
|
+
const sourcePath = path.join(ZEN_SRC_DIR, file.metadata.inferred_lang, file.hash + '.md'); // 使用已经加强的母语文件路径
|
|
85
|
+
const targetPath = path.join(ZEN_SRC_DIR, lang, file.hash + '.md');
|
|
86
|
+
|
|
87
|
+
try {
|
|
88
|
+
const content = await fs.readFile(sourcePath, 'utf-8');
|
|
89
|
+
if (file.metadata.inferred_lang === lang) {
|
|
90
|
+
if (verbose)
|
|
91
|
+
console.log(`ℹ️ Skipping translation for ${file.path}, already in target language`);
|
|
92
|
+
return;
|
|
93
|
+
} else {
|
|
94
|
+
// 翻译
|
|
95
|
+
// 先检查是否已经有翻译文件存在
|
|
96
|
+
|
|
97
|
+
const exists = await fs.access(targetPath).then(
|
|
98
|
+
() => true,
|
|
99
|
+
() => false
|
|
100
|
+
);
|
|
101
|
+
if (exists) {
|
|
102
|
+
if (verbose)
|
|
103
|
+
console.log(`ℹ️ Translation already exists for ${file.path} in ${lang}`);
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const translatedContent = await translateMarkdown(content, lang);
|
|
109
|
+
|
|
110
|
+
await fs.mkdir(path.dirname(targetPath), { recursive: true });
|
|
111
|
+
await fs.writeFile(targetPath, translatedContent, 'utf-8');
|
|
112
|
+
|
|
113
|
+
if (verbose) console.log(`✅ Translated file saved: ${targetPath}`);
|
|
114
|
+
} catch (error) {
|
|
115
|
+
console.error(`❌ Failed to translate to ${lang}:`, error);
|
|
116
|
+
}
|
|
117
|
+
})
|
|
118
|
+
);
|
|
119
|
+
})
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* 构建管道(函数组合)
|
|
125
|
+
*/
|
|
126
|
+
async function buildPipeline(options: BuildOptions): Promise<void> {
|
|
127
|
+
// 验证配置
|
|
128
|
+
await validateConfig(options);
|
|
129
|
+
|
|
130
|
+
// 清理输出目录
|
|
131
|
+
await fs.rm(ZEN_DIST_DIR, { recursive: true, force: true });
|
|
132
|
+
|
|
133
|
+
// 确保 .zen/.gitignore 文件
|
|
134
|
+
await fs.mkdir(ZEN_DIR, { recursive: true });
|
|
135
|
+
await fs.writeFile(path.join(ZEN_DIR, '.gitignore'), 'dist\n', 'utf-8');
|
|
136
|
+
|
|
137
|
+
// 扫描源文件
|
|
138
|
+
await scanSourceFiles();
|
|
139
|
+
|
|
140
|
+
// 运行 AI 元数据提取
|
|
141
|
+
await extractMetadataByAI();
|
|
142
|
+
|
|
143
|
+
// 存储母语文件
|
|
144
|
+
await storeNativeFiles();
|
|
145
|
+
|
|
146
|
+
// 处理翻译
|
|
147
|
+
await processTranslations();
|
|
148
|
+
|
|
149
|
+
// 渲染模板
|
|
150
|
+
await renderTemplates();
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* 主构建函数
|
|
155
|
+
*/
|
|
156
|
+
export async function buildSite(options: BuildOptions): Promise<void> {
|
|
157
|
+
const startTime = Date.now();
|
|
158
|
+
|
|
159
|
+
try {
|
|
160
|
+
await loadMetaData();
|
|
161
|
+
await buildPipeline(options);
|
|
162
|
+
|
|
163
|
+
const endTime = Date.now();
|
|
164
|
+
const duration = ((endTime - startTime) / 1000).toFixed(2);
|
|
165
|
+
console.log(`🎉 Build completed in ${duration}s`);
|
|
166
|
+
} catch (error) {
|
|
167
|
+
console.error(`❌ Build failed:`, error);
|
|
168
|
+
throw error;
|
|
169
|
+
} finally {
|
|
170
|
+
await saveMetaData();
|
|
171
|
+
}
|
|
172
|
+
}
|
package/src/cli.ts
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { Cli, Command, Option } from 'clipanion';
|
|
4
|
+
import { config } from 'dotenv';
|
|
5
|
+
import * as fs from 'fs';
|
|
6
|
+
import * as path from 'path';
|
|
7
|
+
import { buildSite } from './build/pipeline';
|
|
8
|
+
|
|
9
|
+
// 加载 .env 文件中的环境变量
|
|
10
|
+
config();
|
|
11
|
+
|
|
12
|
+
// 获取版本号 - 从 package.json 读取
|
|
13
|
+
function getVersion(): string {
|
|
14
|
+
const packageJsonPath = path.join(__dirname, '..', 'package.json');
|
|
15
|
+
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
|
|
16
|
+
return packageJson.version;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// Build 命令
|
|
20
|
+
class BuildCommand extends Command {
|
|
21
|
+
static paths = [['build']];
|
|
22
|
+
|
|
23
|
+
template = Option.String('-t,--template');
|
|
24
|
+
verbose = Option.Boolean('-v,--verbose');
|
|
25
|
+
lang = Option.Array('--lang', {
|
|
26
|
+
description: 'Target languages for translation (e.g., en-US, ja-JP)',
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
static usage = Command.Usage({
|
|
30
|
+
description: 'Build documentation site from Markdown files in current directory',
|
|
31
|
+
details: `
|
|
32
|
+
This command builds a documentation site from Markdown files in the current directory.
|
|
33
|
+
The output will be placed in the .zen/dist directory.
|
|
34
|
+
|
|
35
|
+
Examples:
|
|
36
|
+
$ zengen build
|
|
37
|
+
$ zengen build --lang en-US --lang ja-JP (translate to English and Japanese)
|
|
38
|
+
`,
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
async execute() {
|
|
42
|
+
try {
|
|
43
|
+
await buildSite({
|
|
44
|
+
template: this.template ? path.resolve(this.template) : undefined,
|
|
45
|
+
verbose: this.verbose,
|
|
46
|
+
langs: this.lang,
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
return 0;
|
|
50
|
+
} catch (error) {
|
|
51
|
+
this.context.stderr.write(`❌ Build failed: ${error}\n`);
|
|
52
|
+
return 1;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// 创建 CLI 应用
|
|
58
|
+
const cli = new Cli({
|
|
59
|
+
binaryName: 'zengen',
|
|
60
|
+
binaryLabel: 'ZEN - A minimalist Markdown documentation site builder',
|
|
61
|
+
binaryVersion: getVersion(),
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
// 注册命令
|
|
65
|
+
cli.register(BuildCommand);
|
|
66
|
+
|
|
67
|
+
// 运行 CLI
|
|
68
|
+
cli.runExit(process.argv.slice(2), {
|
|
69
|
+
...Cli.defaultContext,
|
|
70
|
+
stdin: process.stdin,
|
|
71
|
+
stdout: process.stdout,
|
|
72
|
+
stderr: process.stderr,
|
|
73
|
+
});
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { exec } from 'child_process';
|
|
2
|
+
import { promisify } from 'util';
|
|
3
|
+
|
|
4
|
+
const execAsync = promisify(exec);
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* 使用git命令查找所有Markdown文件
|
|
8
|
+
* 使用git ls-files --others --cached --exclude-standard获取所有文件
|
|
9
|
+
* 然后过滤掉.zen目录和只保留.md文件
|
|
10
|
+
*
|
|
11
|
+
* @param dirPath 要扫描的目录路径
|
|
12
|
+
* @returns Promise<string[]> 返回Markdown文件的相对路径数组
|
|
13
|
+
*/
|
|
14
|
+
export const findMarkdownEntries = async (dirPath: string): Promise<string[]> => {
|
|
15
|
+
try {
|
|
16
|
+
// 使用git命令获取所有文件(包括已跟踪和未跟踪的文件)
|
|
17
|
+
// 在指定的目录下执行git命令
|
|
18
|
+
const { stdout } = await execAsync('git ls-files --others --cached --exclude-standard', {
|
|
19
|
+
cwd: dirPath,
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
// 按行分割并过滤
|
|
23
|
+
const files = stdout
|
|
24
|
+
.split('\n')
|
|
25
|
+
.filter(line => line.trim() !== '') // 移除空行
|
|
26
|
+
.filter(file => !file.startsWith('.zen')) // 过滤掉.zen目录下的文件
|
|
27
|
+
.filter(file => file.endsWith('.md')); // 只保留.md文件
|
|
28
|
+
|
|
29
|
+
return files;
|
|
30
|
+
} catch (error) {
|
|
31
|
+
console.error('Error finding markdown entries:', error);
|
|
32
|
+
|
|
33
|
+
// 如果git命令失败,返回空数组
|
|
34
|
+
// 这可以处理没有git仓库或git不可用的情况
|
|
35
|
+
return [];
|
|
36
|
+
}
|
|
37
|
+
};
|
package/src/index.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import './cli';
|