# Class for the puzzle data representation
+import cairo
+
class GridItem:
# initialize the item
def __init__ (self, item_char='.', across_start = False, down_start = False,
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
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:
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":
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