X-Git-Url: https://harishankar.org/repos/?p=getaclue.git;a=blobdiff_plain;f=crosswordpuzzle.py;h=57878b808c6a90ba6f71b0467efae690d7e8a63e;hp=e6608008c667fec891f40618ea1c9d66327f193d;hb=5f68ccac12372c5271c21e9045558d2d03e92a41;hpb=8169cbe268942c829ff7db563b9bcb1ed4f51e1b diff --git a/crosswordpuzzle.py b/crosswordpuzzle.py index e660800..57878b8 100644 --- a/crosswordpuzzle.py +++ b/crosswordpuzzle.py @@ -4,15 +4,19 @@ # 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, - occupied_across = False, occupied_down = False, num = 0, - clue_across = None, clue_down = None, revealed = False): + def __init__ (self, item_char='.', item_guess = None, across_start = False, + down_start = False, occupied_across = False, + occupied_down = False, num = 0, clue_across = None, + clue_down = None, revealed = False): # character in the cell self.char = item_char + # guess of character in cell + self.guess = item_guess # is the cell the start of an across word? self.across_start = across_start # is the cell the start of a down word? @@ -30,6 +34,59 @@ class GridItem: # is the letter revealed or hidden? self.revealed = revealed + # clear the across data + def clear_across_data (self): + self.across_start = False + self.occupied_across = False + self.clue_across = None + # if no down word starting at item + if self.down_start is False: + self.numbered = 0 + # if no down word at the item + if self.occupied_down is False: + self.char = '.' + self.revealed = False + self.guess = None + + # clear the down data + def clear_down_data (self): + self.down_start = False + self.occupied_down = False + self.clue_down = None + # if no across word starting at item + if self.across_start is False: + self.numbered = 0 + # if no across word at the item + if self.occupied_across is False: + self.char = '.' + self.revealed = False + self.guess = None + + # reset a grid item completely - use only to destroy whole grid, otherwise + # use either clear_across_data () or clear_down_data () for erasing single + # words + def reset (self): + # character in the cell + self.char = '.' + # guess of character in cell + self.guess = None + # is the cell the start of an across word? + self.across_start = False + # is the cell the start of a down word? + self.down_start = False + # is the cell occupied by a letter in an across word? + self.occupied_across = False + # is the cell occupied by a letter in a down word? + self.occupied_down = False + # numbering of the cell if it is the start of a word + self.numbered = 0 + # clue across if the cell is the start of an across word + self.clue_across = None + # clue down if the cell is the start of a down word + self.clue_down = None + # is the letter revealed or hidden? + self.revealed = False + # exception for too long words class TooLongWordException (Exception): def __init__ (self, word, length): @@ -76,7 +133,8 @@ class CrosswordPuzzle: self.data[i].append (GridItem ()) # export to an image - def export_image (self, filename, solution=False): + 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 @@ -90,6 +148,11 @@ class CrosswordPuzzle: 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): @@ -121,7 +184,43 @@ class CrosswordPuzzle: ctx.move_to (col*px+10, row*px+20) ctx.show_text (self.data[row][col].char) - surf.write_to_png (open (filename, "wb")) + 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 = ["", "", ""] + html_contents.append (puztitle) + html_contents.append ("") + html_contents.append ("") + html_contents.append ("") + html_contents.append ("

" + puztitle + "

") + html_contents.append ('puzzle') + + html_contents.append ("

Across clues

") + html_contents.append ("

") + 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 ("

") + + html_contents.append ("

Down clues

") + 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 ("

") + html_contents.append ("") + html_contents.append ("") + + html_str = "\r\n".join (html_contents) + + fhtml = open (htmlfile, "wb") + fhtml.write (html_str) + fhtml.close () # get the AcrossLite(TM) data for exporting def export_acrosslite (self, title, author, copyright): @@ -401,3 +500,12 @@ class CrosswordPuzzle: self.frozen_grid = False + # reset the entire grid + def reset_grid (self): + # run through the grid + for row in range (self.rows): + for col in range (self.cols): + # re-initialize all data + self.data[row][col].reset () + + self.frozen_grid = False