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
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 """
var scale = opt_scale.value
-var arrays_of_images = new Array[String]
-
for drawing in drawings do
var drawing_name = drawing.basename(".svg")
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"