Last active
August 23, 2024 01:48
-
-
Save miraneko/26f610d05f1fc826ad866d2d78888ce7 to your computer and use it in GitHub Desktop.
mkdatauri - a simple tool to make data: URIs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
__help = "mkdatauri - a simple tool to make data: URIs."[12:] | |
__version = "1.0.1" | |
# SPDX-License-Identifier: BSD-2-Clause-Patent | |
__copyright = """ | |
Copyright (c) 2024, Mira Ciel Nekomimi-Sireneva | |
This software is released as open source software under the | |
BSD-2-Clause Plus Patent License: | |
Redistribution and use in source and binary forms, with or without | |
modification, are permitted provided that the following conditions | |
are met: | |
1. Redistributions of source code must retain the above copyright | |
notice, this list of conditions and the following disclaimer. | |
2. Redistributions in binary form must reproduce the above copyright | |
notice, this list of conditions and the following disclaimer in | |
the documentation and/or other materials provided with the | |
distribution. | |
Subject to the terms and conditions of this license, each copyright | |
holder and contributor hereby grants to those receiving rights under | |
this license a perpetual, worldwide, non-exclusive, no-charge, | |
royalty-free, irrevocable (except for failure to satisfy the | |
conditions of this license) patent license to make, have made, use, | |
offer to sell, sell, import, and otherwise transfer this software, | |
where such license applies only to those patent claims, already | |
acquired or hereafter acquired, licensable by such copyright holder | |
or contributor that are necessarily infringed by: | |
(a) their Contribution(s) (the licensed copyrights of copyright | |
holders and non-copyrightable additions of contributors, in | |
source or binary form) alone; or | |
(b) combination of their Contribution(s) with the work of authorship | |
to which such Contribution(s) was added by such copyright holder | |
or contributor, if, at the time the Contribution is added, such | |
addition causes such combination to be necessarily infringed. The | |
patent license shall not apply to any other combinations which | |
include the Contribution. | |
Except as expressly stated above, no rights or licenses from any | |
copyright holder or contributor is granted under this license, | |
whether expressly, by implication, estoppel or otherwise. | |
DISCLAIMER | |
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
“AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | |
HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | |
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | |
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS | |
OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED | |
AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY | |
WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | |
POSSIBILITY OF SUCH DAMAGE. | |
"""[1:-1] | |
from urllib import parse | |
import base64 | |
def mkdatauri( | |
user_input: str, | |
content_type: str | None = None, | |
charset: str | None = None, | |
as_base64: bool = False, | |
as_auto: bool = False | |
) -> str: | |
datauri = "data:" | |
if content_type: | |
datauri += content_type | |
if charset: | |
datauri += ";charset=" + charset | |
if as_auto: | |
in_percent_encoding = parse.quote_from_bytes(user_input) | |
in_base64 = base64.b64encode(user_input).decode() | |
if len(in_base64) + 7 > len(in_percent_encoding): | |
datauri += "," + in_percent_encoding | |
else: | |
datauri += ";base64," + in_base64 | |
elif as_base64: | |
datauri += ";base64," + base64.b64encode(user_input).decode() | |
else: | |
datauri += "," + parse.quote_from_bytes(user_input) | |
return datauri | |
if __name__ == "__main__": | |
import sys | |
import argparse | |
parser = argparse.ArgumentParser(description=__help.capitalize()) | |
parser.add_argument("-v", "--version", dest="version", | |
action="store_true", help="print version and license") | |
parser.add_argument("-t", "--type", dest="content_type", | |
help="set the content type (default: text/plain)") | |
parser.add_argument("-f", "--file", dest="file", | |
help="set input from file FILE instead of stdin") | |
parser.add_argument("-o", "--output", dest="output", | |
help="set output to file OUTPUT instead of stdout") | |
parser.add_argument("-c", "--charset", dest="charset", | |
help="set the character set (default: US-ASCII)") | |
parser.add_argument( | |
"-u", "--utf8", dest="utf8", action="store_true", | |
help="set the character set to UTF-8 (overrides -c)") | |
parser.add_argument( | |
"-b", "--base64", dest="as_base64", action="store_true", | |
help="use base64 instead of percent encoding") | |
parser.add_argument( | |
"-a", "--auto", dest="as_auto", action="store_true", | |
help="use optimal encoding (overrides -b)") | |
args = parser.parse_args() | |
if args.version: | |
print(f"mkdatauri {__version}\n\n{__copyright}") | |
exit() | |
user_input = None | |
if args.file: | |
with open(args.file, "rb") as file: | |
user_input = file.read() | |
else: | |
user_input = sys.stdin.buffer.read() | |
if args.utf8: | |
args.charset = "UTF-8" | |
datauri = mkdatauri(user_input, args.content_type, args.charset, | |
args.as_base64, args.as_auto) | |
if args.output: | |
with open(args.output, "w") as file: | |
file.write(datauri) | |
else: | |
print(datauri, end="") |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment