evolver-tools 35.0.0__tar.gz → 37.0.0__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.
- {evolver_tools-35.0.0/src/evolver_tools.egg-info → evolver_tools-37.0.0}/PKG-INFO +2 -2
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/pyproject.toml +2 -2
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/cli.py +1 -1
- evolver_tools-37.0.0/src/evolver_tools/vendor/ansi_to_html.py +122 -0
- evolver_tools-37.0.0/src/evolver_tools/vendor/color_convert.py +135 -0
- evolver_tools-37.0.0/src/evolver_tools/vendor/csv_concat.py +57 -0
- evolver_tools-37.0.0/src/evolver_tools/vendor/git_ignore.py +207 -0
- evolver_tools-37.0.0/src/evolver_tools/vendor/mime_type.py +113 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0/src/evolver_tools.egg-info}/PKG-INFO +2 -2
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools.egg-info/SOURCES.txt +5 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/LICENSE +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/README.md +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/setup.cfg +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/__init__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/__main__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/autoreg.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/__init__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/agent_b_tool.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/ansi_strip.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/ansi_to_txt.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/api_tester.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/ascii_banner.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/ascii_gen.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/audit_log.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/b64/__init__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/b64/b64.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/backup.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/banner/__init__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/banner/banner.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/base32.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/base58.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/bookmark.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/cal_tool/__init__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/cal_tool/cli.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/calendar_cli.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/case_convert.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/cert_check.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/cert_info.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/changelog_gen/__init__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/changelog_gen/changelog_gen.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/changelog_gen.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/chart_cli/__init__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/chart_cli/__main__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/checksum_dir.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/chrono.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/clipboard/__init__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/clipboard/clipboard.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/code_auditor.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/code_review.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/code_stats.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/colorize.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/colors/__init__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/colors/__main__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/config_validator.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/config_vault.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/cowsay.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/crc_check.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/cron/__init__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/cron/__main__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/cron_check.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/cron_pretty.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/crontab_helper.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/crypto_box.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/crypto_price.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/csv2json.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/csv_dedup.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/csv_filter.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/csv_head.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/csv_merge.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/csv_pretty.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/csv_schema.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/csv_slice.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/csv_sort.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/csv_stats/__init__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/csv_stats/__main__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/csv_stats/analyzer.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/csv_stats/cli.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/csv_to_table.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/csv_validate.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/csv_view.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/date_diff.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/db_mate.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/db_schema.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/dedup_files.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/dep_graph.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/dev_dashboard.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/dice_roll.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/diff_csv.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/diff_files.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/diff_lines.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/diff_tool/__init__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/diff_tool/__main__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/diff_yaml.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/dirsize/__init__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/disk_cleanup.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/disk_usage/__init__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/disk_usage/disk_usage.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/dns_lookup.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/docker_helper.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/dt_convert.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/emoji_cli.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/env_diff.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/env_manager.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/env_sorter.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/env_template.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/envcheck/__init__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/epoch.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/excel2csv.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/factor.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/ff/__init__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/ff/__main__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/figlet_cli.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/figlet_tool.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/file_encrypt.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/file_find.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/file_joiner.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/file_patch.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/file_splitter.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/file_type.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/file_watch.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/find_dups/__init__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/find_dups/cli.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/find_empty.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/firewall_rule.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/fmt/__init__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/fmt/fmt.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/fold.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/geo_ip.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/git_branch_cleaner.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/git_log_pretty.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/git_stats.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/gzip_cli.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/hash_check.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/hash_file.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/hashsum/__init__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/hashsum/__main__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/hex_tool.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/hexdec.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/hexdump.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/html2markdown.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/html2md.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/html_strip.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/http_headers.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/http_live/__init__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/http_live/__main__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/http_server.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/http_status.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/humanize.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/image_meta.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/ini2json.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/ini_parser/__init__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/ini_parser/ini_parser.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/ip_info.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/ip_location.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/ipcalc/__init__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/ipcalc/__main__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/ipinfo/__init__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/ipinfo/__main__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/join.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/joke.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/jq_lite/__init__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/jq_lite/__main__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/json2csv/__init__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/json2csv/__main__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/json2ini.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/json_diff.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/json_flatten.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/json_keys.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/json_merge.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/json_patch.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/json_path.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/json_pretty/__init__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/json_pretty/json_pretty.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/json_schema_validate.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/json_sort.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/json_to_table.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/json_to_yaml.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/jsonql/__init__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/jsonql/__main__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/jwt_decode.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/key_value_store.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/license.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/license_cli/__init__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/license_cli/__main__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/license_cli/cli.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/link_check.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/log_analyzer.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/log_hawk.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/log_tail.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/mac_address.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/macrogen.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/markdown_check/__init__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/markdown_format.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/markdown_lint.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/markdown_preview.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/markdown_to_html.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/markdown_toc.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/math_eval.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/media_studio.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/merge_json.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/morse.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/nb/__init__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/nb/__main__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/net_analyzer.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/net_speed.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/network_scan.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/nl.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/note_taker.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/otp_gen.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/passgen/__init__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/password_strength.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/pdf_info.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/pdf_text.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/pipe_viewer.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/pomodoro.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/port_scan.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/portcheck/__init__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/portcheck/__main__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/pr_tool/__init__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/pr_tool/pr_tool.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/process_kill.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/progress_bar.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/project_doctor/__init__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/project_doctor/__main__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/qc_calc.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/qc_report.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/qc_sample.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/qr_cli.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/qrcode.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/quote.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/quote_tool/__init__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/quote_tool/quote.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/rainbow.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/random.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/random_cli.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/random_string.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/reminder.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/ren/__init__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/ren/__main__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/replace_text.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/restore.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/rot13.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/route_trace.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/scan_open_ports.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/scan_ports.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/screen_recorder.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/screenshot_cli.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/search_files.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/search_history.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/secret_scanner.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/seq.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/service_check.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/shuffle.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/siege_lite/__init__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/siege_lite/__main__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/slugify.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/smellfinder/__init__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/smellfinder/__main__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/sort/__init__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/sort/sort.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/spinner.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/split.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/split_tool/__init__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/split_tool/split.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/sql2csv.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/sqlite_cli/__init__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/sqlite_cli/__main__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/ssh_key_gen.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/ssl_check.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/stopwatch.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/subnet.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/sysmon/__init__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/sysmon/__main__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/sysmon_pro.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/system_info.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/temp_cleaner.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/template.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/text_dedent.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/text_stats.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/text_wrap.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/time_duration.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/timeout.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/timer/__init__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/timer_pro/__init__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/timer_pro/timer_pro.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/timer_pro.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/todo_cli.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/toml2json.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/tr.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/tree.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/treedir/__init__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/treedir/__main__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/tsv2csv.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/uniq_tool/__init__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/uniq_tool/uniq.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/unit_convert.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/uri_encode.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/url_parser.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/urlparse_tool/__init__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/urlparse_tool/cli.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/uuid_gen.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/uuid_tool/__init__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/uuid_tool/__main__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/validate.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/watch.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/weather_cli.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/web_download.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/web_summary/__init__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/web_summary/__main__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/whois_lookup.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/wordcount/__init__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/wordcount/__main__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/world_clock.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/xml2json.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/xml_format.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/yaml2json/__init__.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/yaml2json/yaml2json.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/yaml2toml.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/yaml_validate.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools/vendor/yes.py +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools.egg-info/dependency_links.txt +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools.egg-info/entry_points.txt +0 -0
- {evolver_tools-35.0.0 → evolver_tools-37.0.0}/src/evolver_tools.egg-info/top_level.txt +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: evolver-tools
|
|
3
|
-
Version:
|
|
4
|
-
Summary:
|
|
3
|
+
Version: 37.0.0
|
|
4
|
+
Summary: 254 CLI tools + 9 flagship projects — one pip install
|
|
5
5
|
Author: EVOLVER
|
|
6
6
|
License-Expression: MIT
|
|
7
7
|
Project-URL: Homepage, https://evolver-dev.github.io/evolver-tools
|
|
@@ -4,8 +4,8 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "evolver-tools"
|
|
7
|
-
version = "
|
|
8
|
-
description = "
|
|
7
|
+
version = "37.0.0"
|
|
8
|
+
description = "254 CLI tools + 9 flagship projects — one pip install"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "MIT"
|
|
11
11
|
requires-python = ">=3.8"
|
|
@@ -14,7 +14,7 @@ from evolver_tools.autoreg import auto_discover
|
|
|
14
14
|
def list_tools():
|
|
15
15
|
"""Display all available tools."""
|
|
16
16
|
tools = auto_discover()
|
|
17
|
-
print(f'\x1b[1;36m===== EVOLVER Tools
|
|
17
|
+
print(f'\x1b[1;36m===== EVOLVER Tools v37.0.0 =====\x1b[0m')
|
|
18
18
|
print()
|
|
19
19
|
for name, info in sorted(tools.items()):
|
|
20
20
|
print(f' \033[1;33m{name:<18}\033[0m {info["desc"]}')
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""ansi-to-html — Convert ANSI-colored terminal output to HTML."""
|
|
3
|
+
TOOL_META = {"name": "ansi-to-html", "func": "main", "desc": "Convert ANSI escape sequences to color HTML"}
|
|
4
|
+
|
|
5
|
+
import sys
|
|
6
|
+
import re
|
|
7
|
+
|
|
8
|
+
ANSI_COLORS = {
|
|
9
|
+
"0": (0, 0, 0),
|
|
10
|
+
"1": (128, 0, 0),
|
|
11
|
+
"2": (0, 128, 0),
|
|
12
|
+
"3": (128, 128, 0),
|
|
13
|
+
"4": (0, 0, 128),
|
|
14
|
+
"5": (128, 0, 128),
|
|
15
|
+
"6": (0, 128, 128),
|
|
16
|
+
"7": (192, 192, 192),
|
|
17
|
+
"8": (128, 128, 128),
|
|
18
|
+
"9": (255, 0, 0),
|
|
19
|
+
"10": (0, 255, 0),
|
|
20
|
+
"11": (255, 255, 0),
|
|
21
|
+
"12": (0, 0, 255),
|
|
22
|
+
"13": (255, 0, 255),
|
|
23
|
+
"14": (0, 255, 255),
|
|
24
|
+
"15": (255, 255, 255),
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
ANSI_STYLES = {
|
|
28
|
+
"1": "font-weight:bold",
|
|
29
|
+
"3": "font-style:italic",
|
|
30
|
+
"4": "text-decoration:underline",
|
|
31
|
+
"7": "background-color:#333;color:#fff",
|
|
32
|
+
"9": "text-decoration:line-through",
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
ANSI_RE = re.compile(r"\x1b\[([\d;]*)m")
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def ansi_to_html(text, dark=True):
|
|
39
|
+
bg = "#1e1e1e" if dark else "#ffffff"
|
|
40
|
+
fg = "#d4d4d4" if dark else "#000000"
|
|
41
|
+
parts = ["<pre style='background:{};color:{};padding:8px;overflow:auto;font-family:monospace;line-height:1.4'>".format(bg, fg)]
|
|
42
|
+
styles = []
|
|
43
|
+
for segment in ANSI_RE.split(text):
|
|
44
|
+
if not segment:
|
|
45
|
+
continue
|
|
46
|
+
if segment == "0":
|
|
47
|
+
styles = []
|
|
48
|
+
parts.append("</span>")
|
|
49
|
+
continue
|
|
50
|
+
if segment.isdigit() or ";" in segment:
|
|
51
|
+
codes = segment.split(";")
|
|
52
|
+
fg_color = None
|
|
53
|
+
bg_color = None
|
|
54
|
+
new_styles = []
|
|
55
|
+
for c in codes:
|
|
56
|
+
if c in ANSI_STYLES:
|
|
57
|
+
new_styles.append(ANSI_STYLES[c])
|
|
58
|
+
elif c in ANSI_COLORS:
|
|
59
|
+
r, gg, b = ANSI_COLORS[c]
|
|
60
|
+
fg_color = f"rgb({r},{gg},{b})"
|
|
61
|
+
elif c == "38" or c == "48":
|
|
62
|
+
# 256-color or truecolor - skip for simplicity
|
|
63
|
+
pass
|
|
64
|
+
css = ";".join(new_styles)
|
|
65
|
+
if fg_color:
|
|
66
|
+
css = css + f";color:{fg_color}" if css else f"color:{fg_color}"
|
|
67
|
+
if css:
|
|
68
|
+
parts.append(f"<span style='{css}'>")
|
|
69
|
+
continue
|
|
70
|
+
# Escape HTML
|
|
71
|
+
segment = segment.replace("&", "&").replace("<", "<").replace(">", ">")
|
|
72
|
+
parts.append(segment)
|
|
73
|
+
|
|
74
|
+
parts.append("</pre>")
|
|
75
|
+
return "".join(parts)
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def main():
|
|
79
|
+
import sys, os
|
|
80
|
+
|
|
81
|
+
args = sys.argv[1:]
|
|
82
|
+
dark = True
|
|
83
|
+
output = None
|
|
84
|
+
files = []
|
|
85
|
+
|
|
86
|
+
i = 0
|
|
87
|
+
while i < len(args):
|
|
88
|
+
if args[i] in ("-h", "--help"):
|
|
89
|
+
print("Usage: ansi-to-html [options] [file...]")
|
|
90
|
+
print(" -l, --light Light background")
|
|
91
|
+
print(" -o, --output FILE Write to file (default: stdout)")
|
|
92
|
+
print(" If no file, reads from stdin")
|
|
93
|
+
return
|
|
94
|
+
elif args[i] in ("-l", "--light"):
|
|
95
|
+
dark = False
|
|
96
|
+
elif args[i] in ("-o", "--output"):
|
|
97
|
+
i += 1
|
|
98
|
+
output = args[i] if i < len(args) else None
|
|
99
|
+
else:
|
|
100
|
+
files.append(args[i])
|
|
101
|
+
i += 1
|
|
102
|
+
|
|
103
|
+
if files:
|
|
104
|
+
text = ""
|
|
105
|
+
for f in files:
|
|
106
|
+
with open(f) as fh:
|
|
107
|
+
text += fh.read()
|
|
108
|
+
else:
|
|
109
|
+
text = sys.stdin.read()
|
|
110
|
+
|
|
111
|
+
html = ansi_to_html(text, dark=dark)
|
|
112
|
+
|
|
113
|
+
if output:
|
|
114
|
+
with open(output, "w") as f:
|
|
115
|
+
f.write(html)
|
|
116
|
+
print(f"Written to {output}")
|
|
117
|
+
else:
|
|
118
|
+
sys.stdout.write(html)
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
if __name__ == "__main__":
|
|
122
|
+
main()
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""color-convert — Convert between color formats (hex, rgb, hsl, hsv, named)."""
|
|
3
|
+
TOOL_META = {"name": "color-convert", "func": "main", "desc": "Convert colors between hex/rgb/hsl/hsv/named formats"}
|
|
4
|
+
|
|
5
|
+
NAMED_COLORS = {
|
|
6
|
+
"red": (255, 0, 0), "green": (0, 128, 0), "blue": (0, 0, 255),
|
|
7
|
+
"white": (255, 255, 255), "black": (0, 0, 0), "gray": (128, 128, 128),
|
|
8
|
+
"grey": (128, 128, 128), "yellow": (255, 255, 0), "orange": (255, 165, 0),
|
|
9
|
+
"purple": (128, 0, 128), "pink": (255, 192, 203), "brown": (165, 42, 42),
|
|
10
|
+
"cyan": (0, 255, 255), "magenta": (255, 0, 255), "lime": (0, 255, 0),
|
|
11
|
+
"navy": (0, 0, 128), "teal": (0, 128, 128), "maroon": (128, 0, 0),
|
|
12
|
+
"olive": (128, 128, 0), "silver": (192, 192, 192),
|
|
13
|
+
"coral": (255, 127, 80), "tomato": (255, 99, 71), "gold": (255, 215, 0),
|
|
14
|
+
"indigo": (75, 0, 130), "violet": (238, 130, 238),
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def parse_hex(s):
|
|
19
|
+
s = s.lstrip("#").strip()
|
|
20
|
+
if len(s) == 3:
|
|
21
|
+
s = "".join(c * 2 for c in s)
|
|
22
|
+
return tuple(int(s[i:i+2], 16) for i in (0, 2, 4))
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def to_hex(r, g, b):
|
|
26
|
+
return f"#{r:02x}{g:02x}{b:02x}"
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def to_rgb(r, g, b):
|
|
30
|
+
return f"rgb({r},{g},{b})"
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def rgb_to_hsl(r, g, b):
|
|
34
|
+
r, g, b = r / 255, g / 255, b / 255
|
|
35
|
+
mx, mn = max(r, g, b), min(r, g, b)
|
|
36
|
+
l = (mx + mn) / 2
|
|
37
|
+
if mx == mn:
|
|
38
|
+
return (0, 0, round(l * 100))
|
|
39
|
+
d = mx - mn
|
|
40
|
+
s = d / (2 - mx - mn) if l > 0.5 else d / (mx + mn)
|
|
41
|
+
if mx == r:
|
|
42
|
+
h = (g - b) / d + (6 if g < b else 0)
|
|
43
|
+
elif mx == g:
|
|
44
|
+
h = (b - r) / d + 2
|
|
45
|
+
else:
|
|
46
|
+
h = (r - g) / d + 4
|
|
47
|
+
h /= 6
|
|
48
|
+
return (round(h * 360), round(s * 100), round(l * 100))
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def hsl_to_rgb(h, s, l):
|
|
52
|
+
h, s, l = h / 360, s / 100, l / 100
|
|
53
|
+
def hue2rgb(p, q, t):
|
|
54
|
+
if t < 0: t += 1
|
|
55
|
+
if t > 1: t -= 1
|
|
56
|
+
if t < 1/6: return p + (q - p) * 6 * t
|
|
57
|
+
if t < 1/2: return q
|
|
58
|
+
if t < 2/3: return p + (q - p) * (2/3 - t) * 6
|
|
59
|
+
return p
|
|
60
|
+
if s == 0:
|
|
61
|
+
r = g = b = l
|
|
62
|
+
else:
|
|
63
|
+
q = l * (1 + s) if l < 0.5 else l + s - l * s
|
|
64
|
+
p = 2 * l - q
|
|
65
|
+
r = hue2rgb(p, q, h + 1/3)
|
|
66
|
+
g = hue2rgb(p, q, h)
|
|
67
|
+
b = hue2rgb(p, q, h - 1/3)
|
|
68
|
+
return (round(r * 255), round(g * 255), round(b * 255))
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def format_all(r, g, b):
|
|
72
|
+
h, s, l = rgb_to_hsl(r, g, b)
|
|
73
|
+
lines = [
|
|
74
|
+
f"HEX: {to_hex(r, g, b)}",
|
|
75
|
+
f"RGB: {to_rgb(r, g, b)}",
|
|
76
|
+
f"HSL: hsl({h},{s}%,{l}%)",
|
|
77
|
+
]
|
|
78
|
+
# Find named
|
|
79
|
+
for name, (nr, ng, nb) in NAMED_COLORS.items():
|
|
80
|
+
if (nr, ng, nb) == (r, g, b):
|
|
81
|
+
lines.append(f"Name: {name}")
|
|
82
|
+
break
|
|
83
|
+
return "\n".join(lines)
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def main():
|
|
87
|
+
import sys
|
|
88
|
+
args = sys.argv[1:]
|
|
89
|
+
if not args or args[0] in ("-h", "--help"):
|
|
90
|
+
print("Usage: color-convert <color>")
|
|
91
|
+
print("Formats: #hex, rgb(r,g,b), hsl(h,s%,l%), or name")
|
|
92
|
+
print("Examples:")
|
|
93
|
+
print(' color-convert "#ff0000"')
|
|
94
|
+
print(" color-convert rgb(255,0,0)")
|
|
95
|
+
print(" color-convert red")
|
|
96
|
+
print(" color-convert hsl(0,100%,50%)")
|
|
97
|
+
return
|
|
98
|
+
|
|
99
|
+
color = " ".join(args)
|
|
100
|
+
r = g = b = None
|
|
101
|
+
|
|
102
|
+
# Try named
|
|
103
|
+
if color.lower() in NAMED_COLORS:
|
|
104
|
+
r, g, b = NAMED_COLORS[color.lower()]
|
|
105
|
+
|
|
106
|
+
# Try hex
|
|
107
|
+
elif color.startswith("#"):
|
|
108
|
+
try:
|
|
109
|
+
r, g, b = parse_hex(color)
|
|
110
|
+
except Exception:
|
|
111
|
+
pass
|
|
112
|
+
|
|
113
|
+
# Try rgb(r,g,b)
|
|
114
|
+
elif color.startswith("rgb"):
|
|
115
|
+
import re
|
|
116
|
+
m = re.search(r"rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)", color)
|
|
117
|
+
if m:
|
|
118
|
+
r, g, b = int(m.group(1)), int(m.group(2)), int(m.group(3))
|
|
119
|
+
|
|
120
|
+
# Try hsl(h,s,l)
|
|
121
|
+
elif color.startswith("hsl"):
|
|
122
|
+
import re
|
|
123
|
+
m = re.search(r"hsl\s*\(\s*([\d.]+)\s*,\s*([\d.]+)%?\s*,\s*([\d.]+)%?", color)
|
|
124
|
+
if m:
|
|
125
|
+
r, g, b = hsl_to_rgb(float(m.group(1)), float(m.group(2)), float(m.group(3)))
|
|
126
|
+
|
|
127
|
+
if r is None:
|
|
128
|
+
print(f"Error: couldn't parse '{color}'", file=sys.stderr)
|
|
129
|
+
sys.exit(1)
|
|
130
|
+
|
|
131
|
+
print(format_all(r, g, b))
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
if __name__ == "__main__":
|
|
135
|
+
main()
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""csv-concat — Concatenate multiple CSV files, preserving headers."""
|
|
3
|
+
TOOL_META = {"name": "csv-concat", "func": "main", "desc": "Concatenate CSV files vertically (union mode)"}
|
|
4
|
+
|
|
5
|
+
import csv
|
|
6
|
+
import sys
|
|
7
|
+
import os
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def main():
|
|
11
|
+
args = sys.argv[1:]
|
|
12
|
+
|
|
13
|
+
if not args or args[0] in ("-h", "--help"):
|
|
14
|
+
print("Usage: csv-concat <file.csv> [file.csv...]")
|
|
15
|
+
print("Concatenate CSV files with same headers.")
|
|
16
|
+
print(" csv-concat a.csv b.csv c.csv > combined.csv")
|
|
17
|
+
print(" csv-concat --skip-header a.csv b.csv (keep first header only)")
|
|
18
|
+
return
|
|
19
|
+
|
|
20
|
+
skip_header = False
|
|
21
|
+
if args[0] == "--skip-header":
|
|
22
|
+
skip_header = True
|
|
23
|
+
args = args[1:]
|
|
24
|
+
|
|
25
|
+
if not args:
|
|
26
|
+
print("No files specified", file=sys.stderr)
|
|
27
|
+
sys.exit(1)
|
|
28
|
+
|
|
29
|
+
for path in args:
|
|
30
|
+
if not os.path.exists(path):
|
|
31
|
+
print(f"Error: {path} not found", file=sys.stderr)
|
|
32
|
+
sys.exit(1)
|
|
33
|
+
|
|
34
|
+
writer = csv.writer(sys.stdout, lineterminator="\n")
|
|
35
|
+
header_written = False
|
|
36
|
+
|
|
37
|
+
for i, path in enumerate(args):
|
|
38
|
+
with open(path, "r", newline="") as f:
|
|
39
|
+
reader = csv.reader(f)
|
|
40
|
+
try:
|
|
41
|
+
header = next(reader)
|
|
42
|
+
except StopIteration:
|
|
43
|
+
continue # empty file
|
|
44
|
+
|
|
45
|
+
if not header_written:
|
|
46
|
+
writer.writerow(header)
|
|
47
|
+
header_written = True
|
|
48
|
+
elif i > 0 and skip_header:
|
|
49
|
+
# Already wrote header from first file
|
|
50
|
+
pass
|
|
51
|
+
|
|
52
|
+
for row in reader:
|
|
53
|
+
writer.writerow(row)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
if __name__ == "__main__":
|
|
57
|
+
main()
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""git-ignore — .gitignore template generator."""
|
|
3
|
+
TOOL_META = {"name": "git-ignore", "func": "main", "desc": "Generate .gitignore templates for common languages/frameworks"}
|
|
4
|
+
|
|
5
|
+
TEMPLATES = {
|
|
6
|
+
"python": """# Python
|
|
7
|
+
__pycache__/
|
|
8
|
+
*.py[cod]
|
|
9
|
+
*.egg-info/
|
|
10
|
+
dist/
|
|
11
|
+
build/
|
|
12
|
+
.venv/
|
|
13
|
+
venv/
|
|
14
|
+
env/
|
|
15
|
+
*.egg
|
|
16
|
+
.Python
|
|
17
|
+
*.so
|
|
18
|
+
*.whl
|
|
19
|
+
*.egg-info/
|
|
20
|
+
.eggs/
|
|
21
|
+
.Pipenv.lock
|
|
22
|
+
.pytest_cache/
|
|
23
|
+
.mypy_cache/
|
|
24
|
+
.ruff_cache/
|
|
25
|
+
.tox/
|
|
26
|
+
.coverage
|
|
27
|
+
htmlcov/
|
|
28
|
+
*.db
|
|
29
|
+
*.sqlite
|
|
30
|
+
.DS_Store
|
|
31
|
+
*.swp
|
|
32
|
+
*.swo
|
|
33
|
+
*~
|
|
34
|
+
""",
|
|
35
|
+
"node": """# Node
|
|
36
|
+
node_modules/
|
|
37
|
+
npm-debug.log*
|
|
38
|
+
yarn-debug.log*
|
|
39
|
+
yarn-error.log*
|
|
40
|
+
.pnpm-store/
|
|
41
|
+
.next/
|
|
42
|
+
dist/
|
|
43
|
+
build/
|
|
44
|
+
.cache/
|
|
45
|
+
.env
|
|
46
|
+
.env.local
|
|
47
|
+
.env.*.local
|
|
48
|
+
*.tsbuildinfo
|
|
49
|
+
*.swp
|
|
50
|
+
*.swo
|
|
51
|
+
*~
|
|
52
|
+
.DS_Store
|
|
53
|
+
coverage/
|
|
54
|
+
.nyc_output/
|
|
55
|
+
""",
|
|
56
|
+
"go": """# Go
|
|
57
|
+
*.exe
|
|
58
|
+
*.exe~
|
|
59
|
+
*.dll
|
|
60
|
+
*.so
|
|
61
|
+
*.dylib
|
|
62
|
+
*.test
|
|
63
|
+
*.out
|
|
64
|
+
vendor/
|
|
65
|
+
.idea/
|
|
66
|
+
*.swp
|
|
67
|
+
*.swo
|
|
68
|
+
*~
|
|
69
|
+
.DS_Store
|
|
70
|
+
dist/
|
|
71
|
+
build/
|
|
72
|
+
coverage.txt
|
|
73
|
+
coverage.out
|
|
74
|
+
""",
|
|
75
|
+
"rust": """# Rust
|
|
76
|
+
target/
|
|
77
|
+
**/*.rs.bk
|
|
78
|
+
Cargo.lock
|
|
79
|
+
*.swp
|
|
80
|
+
*.swo
|
|
81
|
+
*~
|
|
82
|
+
.DS_Store
|
|
83
|
+
""",
|
|
84
|
+
"java": """# Java
|
|
85
|
+
*.class
|
|
86
|
+
*.jar
|
|
87
|
+
*.war
|
|
88
|
+
*.nar
|
|
89
|
+
*.ear
|
|
90
|
+
*.zip
|
|
91
|
+
*.tar.gz
|
|
92
|
+
*.rar
|
|
93
|
+
hs_err_pid*
|
|
94
|
+
replay_pid*
|
|
95
|
+
target/
|
|
96
|
+
!**/src/main/**/target/
|
|
97
|
+
!**/src/test/**/target/
|
|
98
|
+
.idea/
|
|
99
|
+
*.iml
|
|
100
|
+
*.ipr
|
|
101
|
+
*.iws
|
|
102
|
+
.settings/
|
|
103
|
+
.project
|
|
104
|
+
.classpath
|
|
105
|
+
bin/
|
|
106
|
+
build/
|
|
107
|
+
.gradle/
|
|
108
|
+
*.swp
|
|
109
|
+
*.swo
|
|
110
|
+
*~
|
|
111
|
+
.DS_Store
|
|
112
|
+
""",
|
|
113
|
+
"docker": """# Docker
|
|
114
|
+
.docker/
|
|
115
|
+
docker-compose.override.yml
|
|
116
|
+
*.swp
|
|
117
|
+
*.swo
|
|
118
|
+
*~
|
|
119
|
+
.DS_Store
|
|
120
|
+
""",
|
|
121
|
+
"vim": """# Vim
|
|
122
|
+
*.swp
|
|
123
|
+
*.swo
|
|
124
|
+
*~
|
|
125
|
+
[._]*.s[a-w][a-z]
|
|
126
|
+
[._]s[a-w][a-z]
|
|
127
|
+
*.un~
|
|
128
|
+
Session.vim
|
|
129
|
+
.netrwhist
|
|
130
|
+
""",
|
|
131
|
+
"macos": """# macOS
|
|
132
|
+
.DS_Store
|
|
133
|
+
.AppleDouble
|
|
134
|
+
.LSOverride
|
|
135
|
+
Icon
|
|
136
|
+
._*
|
|
137
|
+
.DocumentRevisions-V100
|
|
138
|
+
.fseventsd
|
|
139
|
+
.Spotlight-V100
|
|
140
|
+
.TemporaryItems
|
|
141
|
+
.Trashes
|
|
142
|
+
.VolumeIcon.icns
|
|
143
|
+
.com.apple.timemachine.donotpresent
|
|
144
|
+
""",
|
|
145
|
+
"windows": """# Windows
|
|
146
|
+
Thumbs.db
|
|
147
|
+
Thumbs.db:encryptable
|
|
148
|
+
ehthumbs.db
|
|
149
|
+
ehthumbs_vista.db
|
|
150
|
+
*.stackdump
|
|
151
|
+
[Dd]esktop.ini
|
|
152
|
+
$RECYCLE.BIN/
|
|
153
|
+
*.lnk
|
|
154
|
+
""",
|
|
155
|
+
"latex": """# LaTeX
|
|
156
|
+
*.aux
|
|
157
|
+
*.bbl
|
|
158
|
+
*.blg
|
|
159
|
+
*.brf
|
|
160
|
+
*.fls
|
|
161
|
+
*.idx
|
|
162
|
+
*.ilg
|
|
163
|
+
*.ind
|
|
164
|
+
*.lof
|
|
165
|
+
*.log
|
|
166
|
+
*.lot
|
|
167
|
+
*.nav
|
|
168
|
+
*.out
|
|
169
|
+
*.run.xml
|
|
170
|
+
*.snm
|
|
171
|
+
*.synctex.gz
|
|
172
|
+
*.toc
|
|
173
|
+
*.vrb
|
|
174
|
+
*.xdv
|
|
175
|
+
_site/
|
|
176
|
+
""",
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
def main():
|
|
180
|
+
import sys
|
|
181
|
+
args = sys.argv[1:]
|
|
182
|
+
if not args or args[0] in ("-h", "--help", "help"):
|
|
183
|
+
print("Usage: git-ignore <template> [template...]")
|
|
184
|
+
print(f"Templates: {', '.join(sorted(TEMPLATES.keys()))}")
|
|
185
|
+
print(" git-ignore python → print Python .gitignore")
|
|
186
|
+
print(" git-ignore python node macos → combined")
|
|
187
|
+
return
|
|
188
|
+
|
|
189
|
+
combined = ""
|
|
190
|
+
seen = set()
|
|
191
|
+
for tpl in args:
|
|
192
|
+
tpl = tpl.lower().replace("-", "").replace("_", "")
|
|
193
|
+
found = None
|
|
194
|
+
for key in TEMPLATES:
|
|
195
|
+
if key.replace("-", "").replace("_", "") == tpl:
|
|
196
|
+
found = key
|
|
197
|
+
break
|
|
198
|
+
if found and found not in seen:
|
|
199
|
+
combined += f"### {found.title()} ###\n{TEMPLATES[found]}\n"
|
|
200
|
+
seen.add(found)
|
|
201
|
+
elif not found:
|
|
202
|
+
print(f"Warning: no template '{tpl}'", file=sys.stderr)
|
|
203
|
+
sys.stdout.write(combined)
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
if __name__ == "__main__":
|
|
207
|
+
main()
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""mime-type — Detect file MIME types by extension and magic bytes."""
|
|
3
|
+
TOOL_META = {"name": "mime-type", "func": "main", "desc": "Detect MIME type of files by extension and magic bytes"}
|
|
4
|
+
|
|
5
|
+
MIME_DB = {
|
|
6
|
+
".txt": "text/plain", ".html": "text/html", ".htm": "text/html",
|
|
7
|
+
".css": "text/css", ".js": "text/javascript", ".mjs": "text/javascript",
|
|
8
|
+
".json": "application/json", ".xml": "application/xml", ".yaml": "text/yaml",
|
|
9
|
+
".yml": "text/yaml", ".toml": "text/x-toml", ".ini": "text/plain",
|
|
10
|
+
".csv": "text/csv", ".tsv": "text/tab-separated-values",
|
|
11
|
+
".md": "text/markdown", ".rst": "text/x-rst",
|
|
12
|
+
".py": "text/x-python", ".pyw": "text/x-python",
|
|
13
|
+
".java": "text/x-java", ".c": "text/x-c", ".cpp": "text/x-c++",
|
|
14
|
+
".h": "text/x-c-header", ".hpp": "text/x-c++-header",
|
|
15
|
+
".go": "text/x-go", ".rs": "text/x-rust", ".rb": "text/x-ruby",
|
|
16
|
+
".php": "text/x-php", ".pl": "text/x-perl",
|
|
17
|
+
".sh": "application/x-sh", ".bash": "application/x-sh",
|
|
18
|
+
".bat": "application/x-bat", ".ps1": "text/x-powershell",
|
|
19
|
+
".jpg": "image/jpeg", ".jpeg": "image/jpeg", ".png": "image/png",
|
|
20
|
+
".gif": "image/gif", ".webp": "image/webp", ".svg": "image/svg+xml",
|
|
21
|
+
".ico": "image/x-icon", ".bmp": "image/bmp", ".tiff": "image/tiff",
|
|
22
|
+
".mp3": "audio/mpeg", ".wav": "audio/wav", ".ogg": "audio/ogg",
|
|
23
|
+
".flac": "audio/flac", ".aac": "audio/aac", ".m4a": "audio/mp4",
|
|
24
|
+
".mp4": "video/mp4", ".avi": "video/x-msvideo", ".mov": "video/quicktime",
|
|
25
|
+
".mkv": "video/x-matroska", ".webm": "video/webm", ".flv": "video/x-flv",
|
|
26
|
+
".pdf": "application/pdf", ".doc": "application/msword",
|
|
27
|
+
".docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
|
|
28
|
+
".xls": "application/vnd.ms-excel",
|
|
29
|
+
".xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
|
30
|
+
".ppt": "application/vnd.ms-powerpoint",
|
|
31
|
+
".pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation",
|
|
32
|
+
".zip": "application/zip", ".tar": "application/x-tar",
|
|
33
|
+
".gz": "application/gzip", ".bz2": "application/x-bzip2",
|
|
34
|
+
".xz": "application/x-xz", ".7z": "application/x-7z-compressed",
|
|
35
|
+
".rar": "application/vnd.rar",
|
|
36
|
+
".exe": "application/x-msdownload", ".dll": "application/x-msdownload",
|
|
37
|
+
".so": "application/x-sharedlib", ".dylib": "application/x-mach-binary",
|
|
38
|
+
".deb": "application/vnd.debian.binary-package",
|
|
39
|
+
".rpm": "application/x-rpm",
|
|
40
|
+
".iso": "application/x-iso9660-image",
|
|
41
|
+
".bin": "application/octet-stream",
|
|
42
|
+
".woff": "font/woff", ".woff2": "font/woff2",
|
|
43
|
+
".ttf": "font/ttf", ".otf": "font/otf",
|
|
44
|
+
".eot": "application/vnd.ms-fontobject",
|
|
45
|
+
".wasm": "application/wasm",
|
|
46
|
+
".sql": "text/x-sql", ".db": "application/x-sqlite3",
|
|
47
|
+
".log": "text/plain", ".env": "text/plain", ".cfg": "text/plain",
|
|
48
|
+
".conf": "text/plain", ".lock": "text/plain",
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
MAGIC_BYTES = {
|
|
52
|
+
bytes([0xFF, 0xD8, 0xFF]): "image/jpeg",
|
|
53
|
+
bytes([0x89, 0x50, 0x4E, 0x47]): "image/png",
|
|
54
|
+
bytes([0x47, 0x49, 0x46, 0x38]): "image/gif",
|
|
55
|
+
bytes([0x52, 0x49, 0x46, 0x46]): "image/webp",
|
|
56
|
+
bytes([0x25, 0x50, 0x44, 0x46]): "application/pdf",
|
|
57
|
+
bytes([0x50, 0x4B, 0x03, 0x04]): "application/zip",
|
|
58
|
+
bytes([0x1F, 0x8B, 0x08]): "application/gzip",
|
|
59
|
+
bytes([0x42, 0x5A, 0x68]): "application/x-bzip2",
|
|
60
|
+
bytes([0xFD, 0x37, 0x7A, 0x58, 0x5A, 0x00]): "application/x-xz",
|
|
61
|
+
bytes([0x7F, 0x45, 0x4C, 0x46]): "application/x-elf",
|
|
62
|
+
bytes([0xCA, 0xFE, 0xBA, 0xBE]): "application/java-vm",
|
|
63
|
+
bytes([0x00, 0x00, 0x00, 0x18, 0x66, 0x74, 0x79, 0x70]): "video/mp4",
|
|
64
|
+
bytes([0x1A, 0x45, 0xDF, 0xA3]): "video/x-matroska",
|
|
65
|
+
bytes([0x4D, 0x5A]): "application/x-msdownload",
|
|
66
|
+
bytes([0x23, 0x21]): "text/x-script",
|
|
67
|
+
bytes([0xEF, 0xBB, 0xBF]): "text/plain; charset=utf-8-bom",
|
|
68
|
+
bytes([0xFF, 0xFE]): "text/plain; charset=utf-16le",
|
|
69
|
+
bytes([0xFE, 0xFF]): "text/plain; charset=utf-16be",
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def detect_mime(path):
|
|
74
|
+
"""Detect MIME type, preferring magic bytes over extension."""
|
|
75
|
+
try:
|
|
76
|
+
with open(path, "rb") as f:
|
|
77
|
+
head = f.read(16)
|
|
78
|
+
for magic, mime in MAGIC_BYTES.items():
|
|
79
|
+
if head[:len(magic)] == magic:
|
|
80
|
+
return mime, "magic"
|
|
81
|
+
except Exception:
|
|
82
|
+
pass
|
|
83
|
+
|
|
84
|
+
import os
|
|
85
|
+
_, ext = os.path.splitext(path)
|
|
86
|
+
ext = ext.lower()
|
|
87
|
+
if ext in MIME_DB:
|
|
88
|
+
return MIME_DB[ext], "extension"
|
|
89
|
+
return "application/octet-stream", "unknown"
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def main():
|
|
93
|
+
import sys, os
|
|
94
|
+
args = sys.argv[1:]
|
|
95
|
+
if not args or args[0] in ("-h", "--help"):
|
|
96
|
+
print("Usage: mime-type <file> [file...]")
|
|
97
|
+
print("Detect MIME type of one or more files.")
|
|
98
|
+
print(" mime-type foo.pdf bar.png")
|
|
99
|
+
return
|
|
100
|
+
|
|
101
|
+
for path in args:
|
|
102
|
+
if not os.path.exists(path):
|
|
103
|
+
print(f"Error: {path} not found", file=sys.stderr)
|
|
104
|
+
continue
|
|
105
|
+
mime, source = detect_mime(path)
|
|
106
|
+
if len(args) > 1:
|
|
107
|
+
print(f"{path}: {mime} ({source})")
|
|
108
|
+
else:
|
|
109
|
+
print(mime)
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
if __name__ == "__main__":
|
|
113
|
+
main()
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: evolver-tools
|
|
3
|
-
Version:
|
|
4
|
-
Summary:
|
|
3
|
+
Version: 37.0.0
|
|
4
|
+
Summary: 254 CLI tools + 9 flagship projects — one pip install
|
|
5
5
|
Author: EVOLVER
|
|
6
6
|
License-Expression: MIT
|
|
7
7
|
Project-URL: Homepage, https://evolver-dev.github.io/evolver-tools
|