{ "info": { "author": "Tiago Bras", "author_email": "tiagodsbras@gmail.com", "bugtrack_url": null, "classifiers": [], "description": "SVG2Code\n========\n\nCombines one or multiple SVG files into a class containing drawing methods using bezier curves to\nenable smooth curves drawing no matter the size. It also generates methods to create images of whatever size.\n\nI decided to create this project because I needed complete control of the code generation.\n\n\nInstallation\n------------\n\n```Bash\n $ pip install svg2code\n```\n\n\nHow it works\n------------\n\n```Bash\n # Most simple command, it generates a class named 'SVGDrawablesKit.swift'\n $ svg2code \n $ svg2code ~/Desktop/svgs\n\n # [-o --output] To choose a different output filename\n $ svg2code -o \n $ svg2code -o SVGIcons.swift .\n\n # [-c --class-name] To choose a different class name\n $ svg2code -o -c \n $ svg2code -o SVGIcons.swift -c ScalableIcons *\n\n # [--author] Set author's name\n $ svg2code -o --author \n $ svg2code -o SVGIcons.swift --author \"John Smith\" *\n\n # [--project] Set projects's name\n $ svg2code -o --project \n $ svg2code -o SVGIcons.swift --project AwesomeApp *\n\n # [--tabs] To use tabs instead of spaces (4)\n $ svg2code --tabs .\n $ svg2code -o SVGIcons.swift --tabs .\n\n # [-s --spaces N] To choose number of spaces used in indentation \n $ svg2code -s \n $ svg2code -s 2 -o SVGIcons.swift ~/Documents/AwesomeSVGS\n\n # [--stdout] Send output to stdout\n $ svg2code --stdout ~/Documents/svgs\n $ svg2code --stdout -s 2 .\n\n # It is also possible to pipe into it\n $ cat | svg2code -o \n $ cat ~/Desktop/Logo.svg | python svg2code/cli.py --stdout -s 2\n```\n\n\nExample\n-------\n\nGiven the command and files `svg2code rect.svg circle.svg -s 2 -c SVGIcons --author James --project MobileApp --stdout`\n\n```xml\n \n \n \n \n```\n\n```xml\n \n \n \n \n```\n\nit produces the following output\n\n```swift\n //\n // SVGIcons.swift\n // MobileApp\n //\n // Created by James on 01/04/2017.\n // Copyright \u00a9 2017 James. All rights reserved.\n //\n\n import UIKit\n\n enum SVGIcons {\n case circle\n case rect\n\n var size: CGSize {\n switch self {\n case .circle: return CGSize(width: 100.0, height: 100.0)\n case .rect: return CGSize(width: 200.0, height: 200.0)\n }\n }\n\n var path: UIBezierPath {\n switch self {\n case .circle: return SVGIcons.circlePath1\n case .rect: return SVGIcons.rectPath1\n }\n }\n\n func image(withSize size: CGSize, opaque: Bool = false, alignment: Alignment = .center) -> UIImage {\n switch self {\n case .circle: return SVGIcons.image(withSize: size, opaque: opaque, alignment: alignment, drawingMethod: SVGIcons.drawCircle)\n case .rect: return SVGIcons.image(withSize: size, opaque: opaque, alignment: alignment, drawingMethod: SVGIcons.drawRect)\n }\n }\n\n func draw(inRect target: CGRect, alignment: Alignment = .center){\n switch self {\n case .circle: return SVGIcons.drawCircle(inRect: target, alignment: alignment)\n case .rect: return SVGIcons.drawRect(inRect: target, alignment: alignment)\n }\n }\n\n private static func drawCircle(inRect target: CGRect = CGRect(x: 0, y: 0, width: 100.0, height: 100.0), alignment: Alignment = .center) {\n let frame = CGRect(origin: .zero, size: SVGIcons.circle.size)\n\n let context = UIGraphicsGetCurrentContext()!\n context.saveGState()\n context.concatenate(SVGIcons.transformToFit(rect: frame, inRect: target, alignment: alignment))\n\n let path1 = SVGIcons.circlePath1\n UIColor(red: 0, green: 0, blue: 0, alpha: 1.0).setFill()\n path1.fill()\n\n context.restoreGState()\n }\n\n private static func drawRect(inRect target: CGRect = CGRect(x: 0, y: 0, width: 200.0, height: 200.0), alignment: Alignment = .center) {\n let frame = CGRect(origin: .zero, size: SVGIcons.rect.size)\n\n let context = UIGraphicsGetCurrentContext()!\n context.saveGState()\n context.concatenate(SVGIcons.transformToFit(rect: frame, inRect: target, alignment: alignment))\n\n let path1 = SVGIcons.rectPath1\n path1.lineWidth = 3.0\n UIColor(red: 0, green: 0, blue: 1.0, alpha: 1.0).setFill()\n path1.fill()\n UIColor(red: 1.0, green: 0, blue: 0, alpha: 1.0).setStroke()\n path1.stroke()\n\n context.restoreGState()\n }\n\n\n static private func image(withSize size: CGSize, opaque: Bool, alignment: Alignment, drawingMethod: (CGRect, Alignment) -> Void) -> UIImage {\n UIGraphicsBeginImageContextWithOptions(size, opaque, 0.0)\n\n drawingMethod(CGRect(origin: .zero, size: size), alignment)\n\n let image = UIGraphicsGetImageFromCurrentImageContext()!\n\n UIGraphicsEndImageContext()\n\n return image\n }\n\n static private func transformToFit(rect: CGRect, inRect target: CGRect, alignment: Alignment = .center) -> CGAffineTransform {\n var scale = CGPoint(\n x: abs(target.size.width / rect.size.width),\n y: abs(target.size.height / rect.size.height)\n )\n\n let widerThanTaller = scale.y < scale.x\n\n scale.x = min(scale.x, scale.y)\n scale.y = scale.x\n\n var translate = target.origin\n\n if widerThanTaller {\n switch alignment {\n case .right: translate.x += rect.size.width * scale.x\n case .center: translate.x += 0.5 * (target.size.width - (rect.size.width * scale.x))\n default: break // it's already aligned to the left margin\n }\n } else {\n switch alignment{\n case .bottom: translate.y += rect.size.height * scale.y\n case .center: translate.y += 0.5 * (target.size.height - (rect.size.height * scale.y))\n default: break // it's already aligned to the top margin\n }\n }\n\n let scaleT = CGAffineTransform(scaleX: scale.x, y: scale.y)\n let translateT = CGAffineTransform(translationX: translate.x, y: translate.y)\n\n return scaleT.concatenating(translateT)\n }\n\n enum Alignment {\n case center, top, bottom, left, right\n }\n\n // Paths definitions\n private static let circlePath1: UIBezierPath = {\n let path = UIBezierPath()\n path.move(to: CGPoint(x: 50.0, y: 10.0))\n path.addCurve(to: CGPoint(x: 90.0, y: 50.0), controlPoint1: CGPoint(x: 72.0913899932, y: 10.0), controlPoint2: CGPoint(x: 90.0, y: 27.9086100068))\n path.addCurve(to: CGPoint(x: 50.0, y: 90.0), controlPoint1: CGPoint(x: 90.0, y: 72.0913899932), controlPoint2: CGPoint(x: 72.0913899932, y: 90.0))\n path.addCurve(to: CGPoint(x: 10.0, y: 50.0), controlPoint1: CGPoint(x: 27.9086100068, y: 90.0), controlPoint2: CGPoint(x: 10.0, y: 72.0913899932))\n path.addCurve(to: CGPoint(x: 50.0, y: 10.0), controlPoint1: CGPoint(x: 10.0, y: 27.9086100068), controlPoint2: CGPoint(x: 27.9086100068, y: 10.0))\n path.close()\n return path\n }()\n private static let rectPath1: UIBezierPath = {\n let path = UIBezierPath()\n path.move(to: CGPoint(x: 50.0, y: 50.0))\n path.addLine(to: CGPoint(x: 150.0, y: 50.0))\n path.addLine(to: CGPoint(x: 150.0, y: 150.0))\n path.addLine(to: CGPoint(x: 50.0, y: 150.0))\n path.close()\n return path\n }()\n }\n```\n\nHow to use it\n-------------\n\n```swift\n // Using images\n let imageViewSize = CGSize(width: 200, height: 200)\n let imageView = UIImageView(frame: CGRect(origin: .zero, size: imageViewSize))\n imageView.image = SVGIcons.circle.image(withSize: imageViewSize)\n\n // Using draw(rect:)\n class CustomView: UIView {\n override func draw(_ rect: CGRect) {\n SVGIcons.circle.draw(inRect: self.bounds)\n }\n }\n\n let customView = CustomView(frame: CGRect(x: 0, y: 0, width: 200, height: 200))\n customView.backgroundColor = UIColor.white\n```\n\nNotes\n-----\n\nAt this moment, it only supports Swift code generation.\n\nIt doesn't implement the full SVG 1.1 specification. \n\nWhenever I find something from the specification that I need I implement it.\n\nI might also accept implementation requests, e.g., if someone needs shadows or gradients support.\n\n\nLicense\n-------\n\nMIT - Copyright (c) 2017 Tiago Bras\n\n\n", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/TiagoBras/svg2code", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "svg2code", "package_url": "https://pypi.org/project/svg2code/", "platform": "", "project_url": "https://pypi.org/project/svg2code/", "project_urls": { "Homepage": "https://github.com/TiagoBras/svg2code" }, "release_url": "https://pypi.org/project/svg2code/0.3.1/", "requires_dist": [ "Jinja2 (>=2.9.5)" ], "requires_python": "", "summary": "SVG2Code - Code Generator", "version": "0.3.1" }, "last_serial": 3126319, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "b2b83d6c4fb92e986542b7acd2f7b025", "sha256": "995ccdc7efb515ffa32800fc5a8a0831b389af3542b525181216fe289ec4b1bc" }, "downloads": -1, "filename": "svg2code-0.1.0.tar.gz", "has_sig": false, "md5_digest": "b2b83d6c4fb92e986542b7acd2f7b025", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11035, "upload_time": "2017-03-28T19:39:34", "url": "https://files.pythonhosted.org/packages/5f/6e/69064482a3a8373c9697bbd1234850a5d23db8522e85f6f5122f5db6c188/svg2code-0.1.0.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "18105b5d8a646326610c794f7d0c8cc6", "sha256": "af7da322c65dd32bb50fa58c9198be19760c87052cfebc6879f4a0a0374f3eb1" }, "downloads": -1, "filename": "svg2code-0.2.0.tar.gz", "has_sig": false, "md5_digest": "18105b5d8a646326610c794f7d0c8cc6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11082, "upload_time": "2017-03-28T20:12:07", "url": "https://files.pythonhosted.org/packages/18/aa/fd4b1726c6f188387807d795556a940c686a6a29d04c191e1626723cd1f3/svg2code-0.2.0.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "a4078646b232847aa5d0cb44ce0d62f5", "sha256": "ac7d44af9ae6edb0148111e7e4644335b249367a8cf6126057049738dcae3c00" }, "downloads": -1, "filename": "svg2code-0.3.0.tar.gz", "has_sig": false, "md5_digest": "a4078646b232847aa5d0cb44ce0d62f5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15819, "upload_time": "2017-04-01T10:37:26", "url": "https://files.pythonhosted.org/packages/5b/19/c492be6de27c83e24f675fa393cf7d1ed8d2f18fe7cc1429a2534bb4bc91/svg2code-0.3.0.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "acaf3a229275b7c40eebb7d6d11d087b", "sha256": "23cd4e937822a53a6b2bf006ed18fcdd50da3099ab2bed4dec1261150a3c6f5d" }, "downloads": -1, "filename": "svg2code-0.3.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "acaf3a229275b7c40eebb7d6d11d087b", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 17659, "upload_time": "2017-08-27T11:30:37", "url": "https://files.pythonhosted.org/packages/50/c6/faab67844a854aea820cba90de0cfd81483a88fcdcde6ac810622c3d4e98/svg2code-0.3.1-py2.py3-none-any.whl" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "acaf3a229275b7c40eebb7d6d11d087b", "sha256": "23cd4e937822a53a6b2bf006ed18fcdd50da3099ab2bed4dec1261150a3c6f5d" }, "downloads": -1, "filename": "svg2code-0.3.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "acaf3a229275b7c40eebb7d6d11d087b", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 17659, "upload_time": "2017-08-27T11:30:37", "url": "https://files.pythonhosted.org/packages/50/c6/faab67844a854aea820cba90de0cfd81483a88fcdcde6ac810622c3d4e98/svg2code-0.3.1-py2.py3-none-any.whl" } ] }