Export as image functionality halfway done
authorHarishankar <v.harishankar@gmail.com>
Sun, 5 Dec 2010 17:21:09 +0000 (22:51 +0530)
committerHarishankar <v.harishankar@gmail.com>
Sun, 5 Dec 2010 17:21:09 +0000 (22:51 +0530)
Export as image halfway done. To implement the HTML part with
clues

crosswordpuzzle.py
crosswordpuzzlecreator.py

index 694a766..e660800 100644 (file)
@@ -4,6 +4,8 @@
 
 # Class for the puzzle data representation
 
+import cairo
+
 class GridItem:
        # initialize the item
        def __init__ (self, item_char='.', across_start = False, down_start = False,
@@ -73,9 +75,57 @@ class CrosswordPuzzle:
                        for j in range (cols):
                                self.data[i].append (GridItem ())
 
+       # export to an image
+       def export_image (self, filename, solution=False):
+               # don't export if grid is not frozen
+               if self.frozen_grid is False:
+                       raise FrozenGridException
+
+               # create cairo image surface and context
+               px = 30
+               surf = cairo.ImageSurface (cairo.FORMAT_RGB24, self.cols*px, self.rows*px)
+               ctx = cairo.Context (surf)
+
+               ctx.set_source_rgb (1, 1, 1)
+               ctx.rectangle (0, 0, self.cols*px, self.rows*px)
+               ctx.fill ()
+
+               # traverse through the grid
+               for row in range (self.rows):
+                       for col in range (self.cols):
+                               # if grid is un-occupied
+                               if (self.data[row][col].occupied_across is False and
+                                       self.data[row][col].occupied_down is False):
+                                       ctx.set_source_rgb (0, 0, 0)
+                                       ctx.rectangle (col*px, row*px, px, px)
+                                       ctx.fill ()
+                               # grid is occupied
+                               else:
+                                       ctx.set_source_rgb (1, 1, 1)
+                                       ctx.rectangle (col*px, row*px, px, px)
+                                       ctx.fill ()
+                                       ctx.set_source_rgb (0, 0, 0)
+                                       ctx.rectangle (col*px, row*px, px, px)
+                                       ctx.stroke ()
+                                       # if solution is not to be provided, number the grid
+                                       if solution is False:
+                                               if self.data[row][col].numbered <> 0:
+                                                       ctx.select_font_face ("Serif")
+                                                       ctx.set_font_size (10)
+                                                       ctx.move_to (col*px+5, row*px+10)
+                                                       ctx.show_text (str(self.data[row][col].numbered))
+                                       # display the words
+                                       else:
+                                               ctx.select_font_face ("Serif")
+                                               ctx.set_font_size (16)
+                                               ctx.move_to (col*px+10, row*px+20)
+                                               ctx.show_text (self.data[row][col].char)
+
+               surf.write_to_png (open (filename, "wb"))
+
        # get the AcrossLite(TM) data for exporting
        def export_acrosslite (self, title, author, copyright):
-               # don't export if grid is frozen
+               # don't export if grid is not frozen
                if self.frozen_grid is False:
                        raise FrozenGridException
 
index 710de09..1816ff6 100644 (file)
@@ -193,6 +193,19 @@ class CrosswordPuzzleCreator:
                except crosswordpuzzle.FrozenGridException:
                        sys.stderr.write ("Word cannot be added to a frozen puzzle.\n")
 
+       # Export to image/HTML
+       def on_export_image (self, solution=False):
+               try:
+                       sys.stdout.write (self.BLUE + "Exporting puzzle to image/HTML\n")
+                       filename = raw_input (self.BRICKRED + "Filename (PNG): " + self.ENDCOL)
+
+                       self.puzzle.export_image (filename, solution)
+                       sys.stdout.write (self.BLUE + "Successfully exported to file: " +
+                                                       filename + "\n" + self.ENDCOL)
+
+               except crosswordpuzzle.FrozenGridException:
+                       sys.stderr.write ("Cannot export as grid is not frozen/finalized")
+
        # Export to across lite
        def on_export_acrosslite (self):
                try:
@@ -233,6 +246,8 @@ class CrosswordPuzzleCreator:
                                sys.stdout.write ("9. Display clues\n")
                                sys.stdout.write ("S. Save puzzle\n")
                                sys.stdout.write ("E. Export to AcrossLite(TM) format\n")
+                               sys.stdout.write ("H. Export puzzle as image/HTML\n")
+                               sys.stdout.write ("I. Export solution as image\n")
                                sys.stdout.write ("X. Exit to main menu\n" + self.ENDCOL)
                                ch = raw_input (self.BRICKRED + "Your choice: " + self.ENDCOL)
                                if ch == "1":
@@ -253,6 +268,10 @@ class CrosswordPuzzleCreator:
                                        self.save_puzzle ()
                                elif ch == "E" or ch == "e":
                                        self.on_export_acrosslite ()
+                               elif ch == "H" or ch == "h":
+                                       self.on_export_image ()
+                               elif ch == "I" or ch == "i":
+                                       self.on_export_image (True)
                                elif ch == "X" or ch == "x":
                                        break