Re: Base64-Scripts zusammenfassen
Verfasst: Freitag 20. Mai 2016, 23:59
Optimal für Data-URL im CSS finde ich diese Schreibweise, allerdings mit etwas längeren Zeilen:
[codebox=css file=Unbenannt.css]background: url("data:type/subtype;base64,\
R0lGODlhRgAoALMAAOnp6UJCQri4uKqqqiYmJtHR0VhYWH19fWtra/T09MXFxd3d\
3ZycnI2NjQAAAP///yH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78i\
IGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxu\
czp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42\
LWMwNjcgNzkuMTU3NzQ3LCAyMDE1LzAzLzMwLTIzOjQwOjQyICAgICAgICAiPiA8\
cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjIt\
cmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4\
bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnht\
cE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJl\
Zj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVm\
IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxNSAoV2lu\
ZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NzA4NEQyQzAxRUREMTFF\
NkI0QUU5QzQ5Q0I4RkE5MDYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NzA4\
NEQyQzExRUREMTFFNkI0QUU5QzQ5Q0I4RkE5MDYiPiA8eG1wTU06RGVyaXZlZEZy\
b20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3MDg0RDJCRTFFREQxMUU2QjRB\
RTlDNDlDQjhGQTkwNiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3MDg0RDJC\
RjFFREQxMUU2QjRBRTlDNDlDQjhGQTkwNiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4g\
PC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38\
+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3M\
y8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2c\
m5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1s\
a2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08\
Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0M\
CwoJCAcGBQQDAgEAACH5BAAAAAAALAAAAABGACgAAAT/8MlJq7046827/2AojmRp\
nmiqrmzrvnAsz3Rt33iu71rh/ICV4PcLyACOoEpgrCGVKWZl4FA8EoSDhOogCB6F\
gMHBIBCCgQbBYYA+KYyfYSGSVg6BBD7xACCCAwRgDgdxCgFfAQ5fCFoSb1sBQQ1N\
IENECBIJYg50FT4AoAMGD4ilAxIKgo9JEwRWV50hdlOEE35EST4PA5mmpoO3rRK5\
PwWzlbcEhhJqQaC7vaWJX7yrfcMPrya0EwakZUF7uKEOvL6JqAsBqKxQDW0ll0UP\
cXRYpOs/B7rm0r9E2nEh8kUPkWQ8piU8AWwhiYYOI0qcSLGixYsYM2rcyLGjx48g\
BENeiAAAOw=="
);[/code]
type/subtype ist in diesem Fall image/gif. Firefox zeigt das Bild aber auch so an.
Also mit Zeilenumbruch vor dem eigentlichen Code und einleitendem Backslash. Dann hat man alles schön in einem Block.
Und die Option für das Backslash habe ich jetzt eingefügt. Ist aber unschöner Code.
[codebox=css file=Unbenannt.css]background: url("data:type/subtype;base64,\
R0lGODlhRgAoALMAAOnp6UJCQri4uKqqqiYmJtHR0VhYWH19fWtra/T09MXFxd3d\
3ZycnI2NjQAAAP///yH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78i\
IGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxu\
czp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42\
LWMwNjcgNzkuMTU3NzQ3LCAyMDE1LzAzLzMwLTIzOjQwOjQyICAgICAgICAiPiA8\
cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjIt\
cmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4\
bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnht\
cE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJl\
Zj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVm\
IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxNSAoV2lu\
ZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NzA4NEQyQzAxRUREMTFF\
NkI0QUU5QzQ5Q0I4RkE5MDYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NzA4\
NEQyQzExRUREMTFFNkI0QUU5QzQ5Q0I4RkE5MDYiPiA8eG1wTU06RGVyaXZlZEZy\
b20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3MDg0RDJCRTFFREQxMUU2QjRB\
RTlDNDlDQjhGQTkwNiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3MDg0RDJC\
RjFFREQxMUU2QjRBRTlDNDlDQjhGQTkwNiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4g\
PC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38\
+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3M\
y8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2c\
m5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1s\
a2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08\
Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0M\
CwoJCAcGBQQDAgEAACH5BAAAAAAALAAAAABGACgAAAT/8MlJq7046827/2AojmRp\
nmiqrmzrvnAsz3Rt33iu71rh/ICV4PcLyACOoEpgrCGVKWZl4FA8EoSDhOogCB6F\
gMHBIBCCgQbBYYA+KYyfYSGSVg6BBD7xACCCAwRgDgdxCgFfAQ5fCFoSb1sBQQ1N\
IENECBIJYg50FT4AoAMGD4ilAxIKgo9JEwRWV50hdlOEE35EST4PA5mmpoO3rRK5\
PwWzlbcEhhJqQaC7vaWJX7yrfcMPrya0EwakZUF7uKEOvL6JqAsBqKxQDW0ll0UP\
cXRYpOs/B7rm0r9E2nEh8kUPkWQ8piU8AWwhiYYOI0qcSLGixYsYM2rcyLGjx48g\
BENeiAAAOw=="
);[/code]
type/subtype ist in diesem Fall image/gif. Firefox zeigt das Bild aber auch so an.
Also mit Zeilenumbruch vor dem eigentlichen Code und einleitendem Backslash. Dann hat man alles schön in einem Block.
Und die Option für das Backslash habe ich jetzt eingefügt. Ist aber unschöner Code.
Code: Alles auswählen
from __future__ import print_function
import argparse
import base64
ENCODERS = [
(base64.standard_b64encode, base64.standard_b64decode),
(base64.urlsafe_b64encode, base64.urlsafe_b64decode),
]
def parse_args(args=None):
parser = argparse.ArgumentParser(description='Encode and Decode base64.')
group = parser.add_mutually_exclusive_group(required=True)
group.add_argument('-e', '--encode', action='store_false', dest='decode')
group.add_argument('-d', '--decode', action='store_true')
parser.add_argument('--urlsafe', action='store_true', help='Encode urlsafe')
parser.add_argument('--line-length', help='Defaults to unlimited', default=0, type=int)
parser.add_argument('--with-backslash', action='store_true')
parser.add_argument('-i', '--infile', help='Defaults to stdin')
parser.add_argument('-o', '--outfile', help='Defaults to stdout')
parser.add_argument('args', nargs='*')
return parser.parse_args(args)
def insert_newlines(string, every):
return '\n'.join(string[i:i+every] for i in xrange(0, len(string), every))
def insert_newlines_with_backslash(string, every=64):
return '\\\n'.join(string[i:i+every] for i in xrange(0, len(string), every))
def get_input(opts):
if opts.infile is None:
instr = ' '.join(opts.args).encode()
else:
with open(opts.infile, 'r' if opts.decode else 'rb') as ifh:
instr = ifh.read()
return instr
def write_output(opts, outstr):
if opts.outfile is None:
print(outstr)
else:
with open(opts.outfile, 'wb' if opts.decode else 'w') as ofh:
ofh.write(outstr)
def main():
opts = parse_args()
instr = get_input(opts)
outstr = ENCODERS[opts.urlsafe][opts.decode](instr)
if opts.line_length > 0 and not opts.decode and not opts.with_backslash:
outstr = insert_newlines(outstr, opts.line_length)
if opts.line_length > 0 and not opts.decode and opts.with_backslash:
outstr = insert_newlines_with_backslash(outstr, opts.line_length)
write_output(opts, outstr)
if __name__ == '__main__':
main()