# Class for the puzzle data representation
+# for export to PNG image
import cairo
class GridItem:
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
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):
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>", "<head>", "<title>"]
+ html_contents.append (puztitle)
+ html_contents.append ("</title>")
+ html_contents.append ("</head>")
+ html_contents.append ("<body>")
+ html_contents.append ("<h1>" + puztitle + "</h1>")
+ html_contents.append ('<img src="' + pngfile + '" alt="puzzle" />')
+
+ html_contents.append ("<h2>Across clues</h2>")
+ html_contents.append ("<p>")
+ 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 ("<br />")
+ html_contents.append ("</p>")
+
+ html_contents.append ("<h2>Down clues</h2>")
+ html_contents.append ("<p>")
+ 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 ("<br />")
+ html_contents.append ("</p>")
+ html_contents.append ("</body>")
+ html_contents.append ("</html>")
+
+ 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):
sys.stderr.write ("Word cannot be added to a frozen puzzle.\n")
# Export to image/HTML
- def on_export_image (self, solution=False):
+ def on_export_image (self, solution=True):
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)
+ pngfile = raw_input (self.BRICKRED + "Filename (PNG): " + self.ENDCOL)
+ if solution is False:
+ htmlfile = raw_input (self.BRICKRED + "Filename (HTML): " +
+ self.ENDCOL)
+ puztitle = raw_input (self.BRICKRED + "Title of puzzle: " +
+ self.ENDCOL)
+ self.puzzle.export_image (pngfile, htmlfile, puztitle, solution)
+ else:
+ self.puzzle.export_image (pngfile)
+ sys.stdout.write (self.BLUE + "Successfully exported!")
except crosswordpuzzle.FrozenGridException:
- sys.stderr.write ("Cannot export as grid is not frozen/finalized")
+ sys.stderr.write ("Cannot export as grid is not frozen/finalized\n")
+ except crosswordpuzzle.NoWordsException:
+ sys.stderr.write ("No words to export!\n")
# Export to across lite
def on_export_acrosslite (self):
elif ch == "E" or ch == "e":
self.on_export_acrosslite ()
elif ch == "H" or ch == "h":
- self.on_export_image ()
+ self.on_export_image (False)
elif ch == "I" or ch == "i":
- self.on_export_image (True)
+ self.on_export_image ()
elif ch == "X" or ch == "x":
break