From 8169cbe268942c829ff7db563b9bcb1ed4f51e1b Mon Sep 17 00:00:00 2001 From: Harishankar Date: Sun, 5 Dec 2010 22:51:09 +0530 Subject: [PATCH] Export as image functionality halfway done Export as image halfway done. To implement the HTML part with clues --- crosswordpuzzle.py | 52 ++++++++++++++++++++++++++++++++++++++- crosswordpuzzlecreator.py | 19 ++++++++++++++ 2 files changed, 70 insertions(+), 1 deletion(-) diff --git a/crosswordpuzzle.py b/crosswordpuzzle.py index 694a766..e660800 100644 --- a/crosswordpuzzle.py +++ b/crosswordpuzzle.py @@ -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 diff --git a/crosswordpuzzlecreator.py b/crosswordpuzzlecreator.py index 710de09..1816ff6 100644 --- a/crosswordpuzzlecreator.py +++ b/crosswordpuzzlecreator.py @@ -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 -- 2.20.1