contrib/inkscape_tools: refactor main code into 2 new classes
[nit.git] / contrib / inkscape_tools / src / svg_to_png_and_nit.nit
index db6631f..6b2d70f 100644 (file)
@@ -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"