X-Git-Url: https://git.sommitrealweird.co.uk/curses-crossword.git/blobdiff_plain/aa4f80a6b10575551d7cbd24f9b222a0f78edfac:/curses-crossword.py..e9e5c4ef897c4f69ea5d0cbc2e6cc02f49fea451:/static/gitweb.js diff --git a/curses-crossword.py b/curses-crossword.py deleted file mode 100644 index 662fa17..0000000 --- a/curses-crossword.py +++ /dev/null @@ -1,287 +0,0 @@ -#!/usr/bin/python - -import curses -import curses.ascii -import locale -import codecs -import getopt -import os -import sys - -locale.setlocale(locale.LC_ALL, '') -code = locale.getpreferredencoding() - -superscript_numbers = {} - -try: - superscript_numbers = { - "0": unichr(8304).encode(code), - "1": unichr(185).encode(code), - "2": unichr(178).encode(code), - "3": unichr(179).encode(code), - "4": unichr(8308).encode(code), - "5": unichr(8309).encode(code), - "6": unichr(8310).encode(code), - "7": unichr(8311).encode(code), - "8": unichr(8312).encode(code), - "9": unichr(8313).encode(code), - } -except: - for number in range(0, 10): - superscript_numbers[str(number)] = str(number) - -filename = None - -try: - (options, args) = getopt.getopt(sys.argv[1:], "f:", "file=") -except getopt.GetoptError, err: - print str(err) - sys.exit(2) - -for option in options: - if option[0] == "-f" or option[0] == "--file": - filename = option[1] - -if not filename and len(args) > 0: - filename = args[0] - -if not filename: - sys.stderr.write("No crossword file specified, exiting.\n") - sys.exit(0) - -if os.path.exists(filename) and os.path.isfile(filename): - crossworddata = codecs.open(filename, "r", "utf-8").read() -else: - sys.stderr.write("Couldn't open file %s\n" %(filename)) - sys.exit(0) - -def parsecrossword(crossworddata): - ingrid = False - inacross = False - indown = False - crossword = {"grid": [], - "across": {}, - "down": {}, - "grid_questions_start": [], - "grid_questions_end": []} - - for line in crossworddata.split("\n"): - line = line.strip("\n") - if line == "GRID": - ingrid = True - inacross = False - indown = False - elif line == "ACROSS": - ingrid = False - inacross = True - indown = False - elif line == "DOWN": - ingrid = False - inacross = False - indown = True - else: - if ingrid: - if line != "": - crossword["grid"].append(line) - if inacross: - if line != "": - parts = line.split() - question_number = int(parts[0]) - clue = " ".join(parts[1:]) - crossword["across"][int(question_number)] = \ - clue.encode(code) - if indown: - if line != "": - parts = line.split() - question_number = int(parts[0]) - clue = " ".join(parts[1:]) - crossword["down"][int(question_number)] = clue.encode(code) - num_cols = len(crossword["grid"][0]) - num_rows = len(crossword["grid"]) - - current_clue_number = 1 - - for row in range(0, num_rows): - crossword["grid_questions_start"].append([]) - - for row in range(0, num_rows): - for col in range(0, num_cols): - have_clue = False - if col > 0 \ - and crossword["grid"][row][col - 1] == "x" \ - and crossword["grid"][row][col] != "x" \ - and col < (num_cols - 1) \ - and crossword["grid"][row][col + 1] != "x": - have_clue = True - if col == 0 and crossword["grid"][row][col] != "x" \ - and crossword["grid"][row][col + 1] != "x": - have_clue = True - if row > 0 and crossword["grid"][row-1][col] == "x" \ - and row < (num_rows - 1) \ - and crossword["grid"][row][col] != "x" \ - and crossword["grid"][row + 1][col] != "x": - have_clue = True - if row == 0 and crossword["grid"][row][col] != "x" \ - and crossword["grid"][row + 1][col] != "x": - have_clue = True - if have_clue: - crossword["grid_questions_start"][row] \ - .append(current_clue_number) - current_clue_number += 1 - else: - crossword["grid_questions_start"][row].append(0) - - return crossword - -def crossword(stdscr, crossworddata): - crossword = parsecrossword(crossworddata) - cury = 0 - grid_length = len(crossword["grid"][0]) - curx = 0 - stdscr.addch(cury, curx, curses.ACS_ULCORNER) - curx += 1 - while ((curx - 1) / 4) < grid_length: - stdscr.addch(cury, curx, curses.ACS_HLINE) - stdscr.addch(cury, curx+1, curses.ACS_HLINE) - stdscr.addch(cury, curx+2, curses.ACS_HLINE) - stdscr.addch(cury, curx+3, curses.ACS_TTEE) - curx += 4 - curx -= 1 - stdscr.addch(cury, curx, curses.ACS_URCORNER) - cury += 1 - curgridy = 0 - for line in crossword["grid"]: - datastr = "" - curx = 0 - curgridx = 0 - for c in line: - stdscr.addch(cury, curx, curses.ACS_VLINE) - if curx > 0: - stdscr.addch(cury+1, curx, curses.ACS_PLUS) - else: - stdscr.addch(cury+1, curx, curses.ACS_LTEE) - stdscr.addch(cury+1, curx + 1, curses.ACS_HLINE) - stdscr.addch(cury+1, curx + 2, curses.ACS_HLINE) - stdscr.addch(cury+1, curx + 3, curses.ACS_HLINE) - curx += 1 - if c == "x": - stdscr.addch(cury, curx, curses.ACS_BLOCK) - stdscr.addch(cury, curx+1, curses.ACS_BLOCK) - stdscr.addch(cury, curx+2, curses.ACS_BLOCK) - elif crossword["grid_questions_start"][curgridy][curgridx] > 0: - stdscr.addstr(cury, curx, \ - ''.join( \ - [superscript_numbers[x].decode(code) \ - for x in str( \ - crossword["grid_questions_start"] \ - [curgridy][curgridx])]\ - ).encode(code)) - curx += 3 - curgridx += 1 - else: - stdscr.addch(cury, curx, curses.ACS_VLINE) - stdscr.addch(cury + 1, curx, curses.ACS_RTEE) - cury += 2 - curgridy += 1 - cury -= 1 - curx = 0 - stdscr.addch(cury, curx, curses.ACS_LLCORNER) - curx += 1 - while ((curx - 1) / 4) < grid_length: - stdscr.addch(cury, curx, curses.ACS_HLINE) - stdscr.addch(cury, curx+1, curses.ACS_HLINE) - stdscr.addch(cury, curx+2, curses.ACS_HLINE) - stdscr.addch(cury, curx+3, curses.ACS_BTEE) - curx += 4 - curx -= 1 - stdscr.addch(cury, curx, curses.ACS_LRCORNER) - # draw the clues in - cury = (len(crossword["grid"]) * 2) + 1 - curx = 0 - stdscr.addstr(cury, curx, "Across") - cury += 1 - for cluenumber in crossword["across"].keys(): - stdscr.addstr(cury, curx, "%3s: %s" \ - %(str(cluenumber), crossword["across"][cluenumber])) - cury += 1 - - cury += 1 - stdscr.addstr(cury, curx, "Down") - cury += 1 - for cluenumber in crossword["down"].keys(): - stdscr.addstr(cury, curx, "%3s: %s" \ - %(str(cluenumber), crossword["down"][cluenumber])) - cury += 1 - - curx = 3 - cury = 1 - gridx = 0 - gridy = 0 - - while crossword["grid"][gridy][gridx] == "x": - curx += 4 - gridx += 1 - - stdscr.move(cury, curx) - - while 1: - c = stdscr.getch() - if c == curses.ascii.ESC: - break - if c == curses.KEY_RIGHT: - if gridx < (len(crossword["grid"][0]) - 1): - gridx += 1 - curx += 4 - while gridx < (len(crossword["grid"][0]) -1) \ - and crossword["grid"][gridy][gridx] == "x": - gridx += 1 - curx += 4 - while crossword["grid"][gridy][gridx] == "x": - gridx -= 1 - curx -= 4 - stdscr.move(cury, curx) - if c == curses.KEY_LEFT: - if gridx > 0: - curx -= 4 - gridx -= 1 - while gridx > 0 \ - and crossword["grid"][gridy][gridx] == "x": - gridx -= 1 - curx -= 4 - while crossword["grid"][gridy][gridx] == "x": - gridx += 1 - curx += 4 - stdscr.move(cury, curx) - if c == curses.KEY_UP: - if gridy > 0: - gridy -= 1 - cury -= 2 - while gridy > 0 \ - and crossword["grid"][gridy][gridx] == "x": - gridy -= 1 - cury -= 2 - while crossword["grid"][gridy][gridx] == "x": - gridy += 1 - cury += 2 - stdscr.move(cury, curx) - if c == curses.KEY_DOWN: - if gridy < (len(crossword["grid"]) - 1): - gridy += 1 - cury += 2 - while gridy < (len(crossword["grid"]) - 1) \ - and crossword["grid"][gridy][gridx] == "x": - gridy += 1 - cury += 2 - while crossword["grid"][gridy][gridx] == "x": - gridy -= 1 - cury -= 2 - stdscr.move(cury, curx) - if curses.ascii.isalpha(c) or c == ord(" "): - stdscr.addch(cury, curx, c) - stdscr.move(cury, curx) - if c == curses.KEY_BACKSPACE or c == curses.KEY_DC: - stdscr.addch(cury, curx, ord(" ")) - stdscr.move(cury, curx) - - -curses.wrapper(crossword, crossworddata)