Skip to content

Instantly share code, notes, and snippets.

@miraneko
Last active August 23, 2024 01:48
Show Gist options
  • Save miraneko/26f610d05f1fc826ad866d2d78888ce7 to your computer and use it in GitHub Desktop.
Save miraneko/26f610d05f1fc826ad866d2d78888ce7 to your computer and use it in GitHub Desktop.
mkdatauri - a simple tool to make data: URIs
#!/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