Giter Site home page Giter Site logo

crossword's Introduction

crossword

Python library for handling crossword puzzles. This library provides a canonical data structure that can be used to represent crosswords in your application. It provides a Pythonic way to perform common operations on the grid, the words and the clues of the puzzle.

The library is intended for American style crossword puzzles, such as the New York Times crossword, though variations within reason will also be supported.

The library handles reading and writing the following files:

  • Across Lite .puz files
  • ipuz .ipuz files

Installation

You can install using pip:

$ pip install crossword

If you want to use this package with .puz files you'll also need to install puzpy:

$ pip install puzpy

If you want to use this package with .ipuz files you'll also need to install ipuz:

$ pip install ipuz

Creating and modifying crosswords

You can create a crossword:

from crossword import Crossword

puzzle = Crossword(15, 15)

You can iterate over rows and cells:

for row in puzzle:
    for cell in row:
        pass

You also iterate using 'cells' (left-to-right, top-to-bottom):

for x, y in puzzle.cells:
    print(puzzle[x, y])

You can store cell content by using attributes such as 'cell' and 'solution':

puzzle[x, y].cell = " "
puzzle[x, y].solution = "A"
puzzle[x, y].style = {'background-color': 'red'}

You can access a metadata attribute:

creator = puzzle.meta.creator

Each puzzle has the attributes specified in the Dublin Core Metadata Element Set, Version 1.1 (http://dublincore.org/documents/dces/), which include creator, date, description, identifier and title. By default these attributes have the value None.

You can iterate over metadata:

for key, value in puzzle.meta():
    print(key, value)

You can set a clue for an entry:

puzzle.clues.across[1] = "This is a clue"
puzzle.clues.down[2] = "This is a clue"

You can iterate over all clues (first Across, then Down):

for direction, number, clue in puzzle.clues.all():
    print(direction, number, clue)

You can iterate over clues in a particular direction:

for number, clue in puzzle.clues.across():
    print(number, clue)
for number, clue in puzzle.clues.down():
    print(number, clue)

By default these functions iterate over the clues by numerical order of the specified clue numbers. If you wish to iterate over the clues in the order that they were inserted you can specify sort=None:

puzzle.clues.all(sort=None)

You can also specify a function yourself that will be used for sorting:

puzzle.clues.all(sort=lambda entry: ...)

You can use the following attributes as dictionaries (e.g., for conversion to JSON):

puzzle.content (the cells, clues and metadata in one dictionary)
puzzle.clues
puzzle.clues.across
puzzle.clues.down
puzzle.meta

You can use the following constants for values that represent block cells and empty cells:

puzzle.block
puzzle.empty

A value of None may indicate that the default value is used (e.g., "#" for blocks in .ipuz puzzles).

Reading and writing crosswords

You can read a crossword from a .puz file using:

import crossword
import puz

puz_object = puz.read('chronicle_20140815.puz')
puzzle = crossword.from_puz(puz_object)

You can read a crossword from an .ipuz file using:

import crossword
import ipuz

with open('puzzle.ipuz') as puzzle_file:
    ipuz_dict = ipuz.read(puzzle_file.read())  # may raise ipuz.IPUZException

puzzle = crossword.from_ipuz(ipuz_dict)

This requires the "ipuz" package to be installed: https://pypi.python.org/pypi/ipuz.

You can write a crossword to an .ipuz file using:

import crossword
import ipuz

ipuz_dict = crossword.to_ipuz(puzzle)

with open('puzzle.ipuz', 'w') as puzzle_file:
    puzzle_file.write(ipuz.write(ipuz_dict))

Contributing

Contributions are very welcome. If you've found an issue or if you'd like to suggest a feature please open a ticket at: https://github.com/svisser/crossword/issues.

You should create a virtual environment first before installing the packages as described below. This keeps the dependencies separate from other Python packages on your system. See: https://pypi.python.org/pypi/virtualenv and, optionally, https://pypi.python.org/pypi/virtualenvwrapper.

You can install the packages needed for developing and testing this library by running:

$ pip install -r dev-requirements.txt

There are also various tests included. You can run these with:

$ tox

This will run the tests in various Python versions to ensure that the library works properly in each of them.

Ideas for new features

crossword's People

Contributors

svisser avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.