From 94d4269de17c414250db17ed71ad37099e6c3b5d Mon Sep 17 00:00:00 2001 From: =?utf8?q?Alexis=20Laferri=C3=A8re?= Date: Tue, 21 Apr 2015 05:56:21 -0400 Subject: [PATCH] contrib/inkscape_tools: refactor main code into 2 new classes MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Alexis Laferrière --- contrib/inkscape_tools/src/svg_to_png_and_nit.nit | 125 ++++++++++++++------- 1 file changed, 86 insertions(+), 39 deletions(-) diff --git a/contrib/inkscape_tools/src/svg_to_png_and_nit.nit b/contrib/inkscape_tools/src/svg_to_png_and_nit.nit index db6631f..6b2d70f 100644 --- a/contrib/inkscape_tools/src/svg_to_png_and_nit.nit +++ b/contrib/inkscape_tools/src/svg_to_png_and_nit.nit @@ -20,7 +20,7 @@ module svg_to_png_and_nit import opts import template -# Image info extracted from the SVG file +# Image information extracted from the SVG file class Image # Name extracted from the object ID minus the `0` prefix and Nit safe var name: String @@ -46,31 +46,108 @@ class Image redef fun to_s do return name end +# Document being processed, concerns both the source and the target +class Document + # Name of the source file + var drawing_name: String + + # Name of the class to generate + var nit_class_name: String = drawing_name.capitalized + "Images" is lazy + + # Scaling to apply to the exported image + var scale: Float + + # Source minimum X + var min_x: Int + + # Source maximum X + var max_x: Int + + # Source minimum Y + var min_y: Int + + # Source maximum Y + var max_y: Int + + # Get the coordinates for `image` as `"x, y, w, h"` + fun coordinates(image: Image): String + do + var x = image.x.adapt(min_x, scale) + var y = image.y.adapt(min_y, scale) + var w = (image.w.to_f*scale).to_i + var h = (image.h.to_f*scale).to_i + + return "{x}, {y}, {w}, {h}" + end +end + # Nit module with a single class to retrieve to access the extracted images -class ImageSetSrc +abstract class ImageSetSrc super Template - var name: String + # Target document + var document: Document + + # Images found in the source document + var images: Array[Image] +end - var attributes = new Array[String] - var load_exprs = new Array[String] +# Nit module targeting the MNit framework +class MnitImageSetSrc + super ImageSetSrc redef fun rendering do + # Known array of images + var arrays_of_images = new Array[String] + + # Attributes of the generated class + var attributes = new Array[String] + + # Statements for the generated `load_all` method + var load_exprs = new Array[String] + + # Add images to Nit source file + for image in images do + # Adapt coordinates to new top left and scale + var coordinates = document.coordinates(image) + + var nit_name = image.name + var last_char = nit_name.chars.last + if last_char.to_s.is_numeric then + # Array of images + # TODO support more than 10 images in an array + + nit_name = nit_name.substring(0, nit_name.length-1) + if not arrays_of_images.has(nit_name) then + # Create class attribute to store Array + arrays_of_images.add(nit_name) + attributes.add "\tvar {nit_name} = new Array[Image]\n" + end + load_exprs.add "\t\t{nit_name}.add(main_image.subimage({coordinates}))\n" + else + # Single image + attributes.add "\tvar {nit_name}: Image is noinit\n" + load_exprs.add "\t\t{nit_name} = main_image.subimage({coordinates})\n" + end + end + add """ # File generated by svg_to_png_and_nit, do not modify, redef instead import mnit::image_set -class {{{name}}} +class {{{document.nit_class_name}}} super ImageSet + private var main_image: Image is noinit """ add_all attributes add """ redef fun load_all(app: App) do + main_image = app.load_image(\"images/{{{document.drawing_name}}}.png\") """ add_all load_exprs add """ @@ -146,8 +223,6 @@ end var scale = opt_scale.value -var arrays_of_images = new Array[String] - for drawing in drawings do var drawing_name = drawing.basename(".svg") @@ -216,42 +291,14 @@ for drawing in drawings do end proc.close - # Nit class - var nit_class_name = drawing_name.chars.first.to_s.to_upper + drawing_name.substring_from(1) + "Images" - var nit_src = new ImageSetSrc(nit_class_name) - nit_src.attributes.add "\tprivate var main_image: Image is noinit\n" - nit_src.load_exprs.add "\t\tmain_image = app.load_image(\"images/{drawing_name}.png\")\n" # Sort images by name, it prevents Array errors and looks better alpha_comparator.sort(images) - # Add images to Nit source file - for image in images do - # Adapt coordinates to new top left and scale - var x = image.x.adapt(min_x, scale) - var y = image.y.adapt(min_y, scale) - var w = (image.w.to_f*scale).to_i - var h = (image.h.to_f*scale).to_i + var document = new Document(drawing_name, scale, min_x, max_x, min_y, max_y) - var nit_name = image.name - var last_char = nit_name.chars.last - if last_char.to_s.is_numeric then - # Array of images - # TODO support more than 10 images in an array - - nit_name = nit_name.substring(0, nit_name.length-1) - if not arrays_of_images.has(nit_name) then - # Create class attribute to store Array - arrays_of_images.add(nit_name) - nit_src.attributes.add "\tvar {nit_name} = new Array[Image]\n" - end - nit_src.load_exprs.add "\t\t{nit_name}.add(main_image.subimage({x}, {y}, {w}, {h}))\n" - else - # Single image - nit_src.attributes.add "\tvar {nit_name}: Image is noinit\n" - nit_src.load_exprs.add "\t\t{nit_name} = main_image.subimage({x}, {y}, {w}, {h})\n" - end - end + # Nit class + var nit_src = new MnitImageSetSrc(document, images) if not src_path.file_extension == "nit" then src_path = src_path/drawing_name+".nit" -- 1.7.9.5