Initial commit with initial data URI conversion implementation.
This commit is contained in:
		
							
								
								
									
										20
									
								
								data_uri.nimble
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								data_uri.nimble
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,20 @@
 | 
				
			|||||||
 | 
					# Package
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					version       = "0.1.0"
 | 
				
			||||||
 | 
					author        = "Jonathan Bernard"
 | 
				
			||||||
 | 
					description   = "Utility for managing data-uris: transforming data to and from, etc."
 | 
				
			||||||
 | 
					license       = "GPL-3.0-only"
 | 
				
			||||||
 | 
					srcDir        = "src"
 | 
				
			||||||
 | 
					installExt    = @["nim"]
 | 
				
			||||||
 | 
					bin           = @["data_uri"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Dependencies
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					requires @[
 | 
				
			||||||
 | 
					  "nim >= 1.4.4",
 | 
				
			||||||
 | 
					  "docopt 0.6.8",
 | 
				
			||||||
 | 
					  "filetype",
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  "https://git.jdb-labs.com/jdb/update-nim-package-version"
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
							
								
								
									
										
											BIN
										
									
								
								src/.data_uri.nim.swp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/.data_uri.nim.swp
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										88
									
								
								src/data_uri.nim
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								src/data_uri.nim
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,88 @@
 | 
				
			|||||||
 | 
					## Data URI Utilities
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import base64, docopt, filetype, logging, nre, os
 | 
				
			||||||
 | 
					from strutils import isEmptyOrWhitespace
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					include "data_uripkg/version.nim"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let dataUriPattern = re"^data:([^;,]+)?(;base64)?,(.+)$"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					proc encodeAsDataUri*(value: string, mimeType: string = ""): string =
 | 
				
			||||||
 | 
					  let actualMimeType =
 | 
				
			||||||
 | 
					    if mimeType.isEmptyOrWhitespace: filetype.match(cast[seq[byte]](value)).mime.value
 | 
				
			||||||
 | 
					    else: mimeType
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  let encoded = encode(value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return "data:" & actualMimeType & ";base64," & encoded
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					proc decodeDataUri*(dataUri: string): string =
 | 
				
			||||||
 | 
					  let parseMatch = dataUri.match(dataUriPattern)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if not parseMatch.isSome:
 | 
				
			||||||
 | 
					    raise newException(Exception, "input does not look like a valid data URI")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  let encodedData = parseMatch.get.captures[2]
 | 
				
			||||||
 | 
					  return decode(encodedData)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					when isMainModule:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  try:
 | 
				
			||||||
 | 
					    let doc = """
 | 
				
			||||||
 | 
					Usage:
 | 
				
			||||||
 | 
					  data_uri encode [options]
 | 
				
			||||||
 | 
					  data_uri decode [options]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Options:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  -h, --help              Print this usage information.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  -i, --input <inFile>    Read input from inFile rather than from stdin (the
 | 
				
			||||||
 | 
					                          default).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  -o, --output <outFile>  Write output to outFile rather than to stdout (the
 | 
				
			||||||
 | 
					                          default).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  -t, --type <mimeType>   Manually set the MIME type rather than trying to
 | 
				
			||||||
 | 
					                          infer it from the file extension. This only applies
 | 
				
			||||||
 | 
					                          when encoding files to data-uris.
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    logging.addHandler(newConsoleLogger())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Parse arguments
 | 
				
			||||||
 | 
					    let args = docopt(doc, version = DATA_URI_VERSION)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if args["--help"]:
 | 
				
			||||||
 | 
					      stderr.writeLine(doc)
 | 
				
			||||||
 | 
					      quit()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if args["--input"] and not fileExists($args["--input"]):
 | 
				
			||||||
 | 
					      raise newException(Exception, "'" & $args["--input"] & "' is not a valid file.'")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let fileIn =
 | 
				
			||||||
 | 
					      if args["--input"]: open($args["--input"])
 | 
				
			||||||
 | 
					      else: stdin
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let fileOut =
 | 
				
			||||||
 | 
					      if args["--output"]: open($args["--output"], fmWrite)
 | 
				
			||||||
 | 
					      else: stdout
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    try:
 | 
				
			||||||
 | 
					      if args["encode"]:
 | 
				
			||||||
 | 
					        let binaryData = readAll(fileIn)
 | 
				
			||||||
 | 
					        write(fileOut, encodeAsDataUri(binaryData))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if args["decode"]:
 | 
				
			||||||
 | 
					        let dataUri = readAll(fileIn)
 | 
				
			||||||
 | 
					        write(fileOut, decodeDataUri(dataUri))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    finally:
 | 
				
			||||||
 | 
					      close(fileIn)
 | 
				
			||||||
 | 
					      close(fileOut)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  except:
 | 
				
			||||||
 | 
					    fatal "data_uri: " & getCurrentExceptionMsg()
 | 
				
			||||||
 | 
					    quit(QuitFailure)
 | 
				
			||||||
							
								
								
									
										1
									
								
								src/data_uripkg/version.nim
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										1
									
								
								src/data_uripkg/version.nim
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					const DATA_URI_VERSION* = "0.1.0"
 | 
				
			||||||
							
								
								
									
										1
									
								
								tests/config.nims
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								tests/config.nims
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					switch("path", "$projectDir/../src")
 | 
				
			||||||
							
								
								
									
										12
									
								
								tests/test1.nim
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								tests/test1.nim
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,12 @@
 | 
				
			|||||||
 | 
					# This is just an example to get you started. You may wish to put all of your
 | 
				
			||||||
 | 
					# tests into a single file, or separate them into multiple `test1`, `test2`
 | 
				
			||||||
 | 
					# etc. files (better names are recommended, just make sure the name starts with
 | 
				
			||||||
 | 
					# the letter 't').
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# To run these tests, simply execute `nimble test`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import unittest
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#import data_uripkg/submodule
 | 
				
			||||||
 | 
					#test "correct welcome":
 | 
				
			||||||
 | 
					#  check getWelcomeMessage() == "Hello, World!"
 | 
				
			||||||
		Reference in New Issue
	
	Block a user