Completed the HTML exporter
authorHarishankar <v.harishankar@gmail.com>
Mon, 6 Dec 2010 04:09:09 +0000 (09:39 +0530)
committerHarishankar <v.harishankar@gmail.com>
Mon, 6 Dec 2010 04:09:09 +0000 (09:39 +0530)
Completed the HTML exporter including export of clues

crosswordpuzzle.py
crosswordpuzzlecreator.py

index e660800..7d3b270 100644 (file)
@@ -4,6 +4,7 @@
 
 # Class for the puzzle data representation
 
+# for export to PNG image
 import cairo
 
 class GridItem:
@@ -76,7 +77,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 +92,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 +128,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>", "<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):
index 1816ff6..5a0ae11 100644 (file)
@@ -194,17 +194,24 @@ class CrosswordPuzzleCreator:
                        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):
@@ -269,9 +276,9 @@ class CrosswordPuzzleCreator:
                                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