X-Git-Url: https://harishankar.org/repos/?p=getaclue.git;a=blobdiff_plain;f=crosswordpuzzle.py;h=7d3b2709933e604a71b04171726a1f359ce3291c;hp=012450f07e320e1a989cf77e9f380f4baf0bf4ae;hb=8bf14bbd585036c0cfda88c2ace825f1aa471730;hpb=2f775ee1c4d2c260221155494b2c7856bc38dafd diff --git a/crosswordpuzzle.py b/crosswordpuzzle.py index 012450f..7d3b270 100644 --- a/crosswordpuzzle.py +++ b/crosswordpuzzle.py @@ -4,6 +4,9 @@ # Class for the puzzle data representation +# for export to PNG image +import cairo + class GridItem: # initialize the item def __init__ (self, item_char='.', across_start = False, down_start = False, @@ -73,24 +76,114 @@ class CrosswordPuzzle: for j in range (cols): self.data[i].append (GridItem ()) + # export to an image + def export_image (self, pngfile, htmlfile=None, puztitle="Crossword Puzzle", + solution=True): + # 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 () + + # get the clues across and down + clues_across = self.get_clues_across () + clues_down = self.get_clues_down () + + + # 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 (pngfile, "wb")) + + # if solution is false, publish the clues and the image in a HTML file + if htmlfile and solution is False: + html_contents = ["", "
", "")
+ for word, clue in clues_across:
+ clue_str = str (self.data[word[1]][word[2]].numbered) + " - " \
+ + clue
+ html_contents.append (clue_str)
+ html_contents.append ("
")
+ html_contents.append ("
")
+ for word, clue in clues_down:
+ clue_str = str (self.data[word[1]][word[2]].numbered) + " - " \
+ + clue
+ html_contents.append (clue_str)
+ html_contents.append ("
")
+ html_contents.append ("