# Path: xdfile/utils.py
# EOL = '\n'
# COLSEP = '\t'
# COLUMN_SEPARATOR = COLSEP
# WEEKDAYS = [ 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun' ]
#     HEADER = '\033[95m'
#     OKBLUE = '\033[94m'
#     OKGREEN = '\033[92m'
#     WARNING = '\033[93m'
#     FAIL = '\033[91m'
#     ENDC = '\033[0m'
#     BOLD = '\033[1m'
#     UNDERLINE = '\033[4m'
# class bcolors:
# class AttrDict(dict):
# class OutputZipFile(zipfile.ZipFile):
# class OutputFile:
# class OutputDirectory:
# def space_with_nbsp(text):
# def split_xdid(xdid):
# def br_with_n(text):
# def get_log():
# def log(s, minverbose=0, severity='INFO'):
# def info(_s, _m=0):
# def warn(_s, _m=0):
# def error(_s, _m=0):
# def summary(_s, _m=0):
# def debug(s):
# def progress(rest=None, every=1):
# def args_parser(desc=""):
# def get_args(desc="", parser=None):
# def find_files(*paths, **kwargs):
# def to_timet(y, mon=1, d=1, h=0, m=0, s=0):
# def generate_zip_files(data):
# def find_files_with_time(*paths, **kwargs):
# def filetime(fn):
# def iso8601(timet=None):
# def datestr_to_datetime(s):
# def parse_xdid(path):
# def parse_pathname(path):
# def parse_pubid(fn):
# def construct_date(y, m, d):
# def parse_iso8601(s):
# def parse_seqnum(s):
# def parse_date_from_filename(fn):
# def clean_filename(fn):
# def replace_ext(fn, newext):
#     def __init__(self, *args, **kwargs):
# def autoconvert(v):
# def parse_tsv_data(contents, objname=None):
# def parse_tsv(fn, objname=None):
# def parse_tsv_rows(fn, objname=None):
#     def __init__(self, fnzip, toplevel="", log=True):
#     def write_file(self, fn, contents, timet=None):
#     def write(self, data):
#     def __del__(self):
#     def __init__(self, outfp=None):
#     def write_file(self, fn, contents, timet=None):
#     def write(self, data):
#     def write_row(self, fields):
#     def write_html(self, fn, innerhtml, title=""):
# def strip_toplevel(fn):
# def disambiguate_fn(fn, all_filenames):
#     def __init__(self, toplevel_dir):
#     def exists(self, fn):
#     def open_file(self, fn, mode='w'):
#     def close_file(self, fn):
#     def write_file(self, fn, contents, timet=None):
#     def write_html(self, fn, innerhtml, title=""):
#     def write_row(self, fn, headerstr, values):
# def open_output(fnout=None):
# def memoize(obj):
#     def memoizer(*args, **kwargs):
# def __dict_replace(s, d):
# def escape(data, entities={}):
# def consecutive(text):


import string
import re
import xdfile
from lxml import etree
from xdfile.utils import escape, consecutive, xml_escape_table, rev_xml_escape_table, error
    # add puzzle
    puzzle = []
    for i in range(rows):
        puzzle.append([" "] * cols)

    for cell in grid.xpath('./puzzle:cell', namespaces=ns):
        x = int(cell.attrib['x']) - 1
        y = int(cell.attrib['y']) - 1
        if 'solution' in cell.attrib:
            value = cell.attrib['solution']
        if 'type' in cell.attrib and cell.attrib['type'] == 'block':
            value = xdfile.BLOCK_CHAR
        puzzle[y][x] = value

    xd.grid = ["".join(row) for row in puzzle]

    # add clues
    word_map = {}
    for word in root.xpath('//puzzle:crossword/puzzle:word', namespaces=ns):
        word_map[word.attrib['id']] = (word.attrib['x'], word.attrib['y'])

    for clues in root.xpath('//puzzle:crossword/puzzle:clues', namespaces=ns):
        type = clues.xpath('./puzzle:title', namespaces=ns)[0]
        type = "".join(chr(x) for x in etree.tostring(type, method='text').upper() if chr(x) in string.ascii_uppercase)
        type = type[0]

        for clue in clues.xpath('./puzzle:clue', namespaces=ns):
            word_id = clue.attrib['word']
            number = int(clue.attrib['number'])
            text = "|".join(clue.itertext()).strip()

# Path: xdfile/utils.py
# EOL = '\n'
# COLSEP = '\t'
# COLUMN_SEPARATOR = COLSEP
# WEEKDAYS = [ 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun' ]
#     HEADER = '\033[95m'
#     OKBLUE = '\033[94m'
#     OKGREEN = '\033[92m'
#     WARNING = '\033[93m'
#     FAIL = '\033[91m'
#     ENDC = '\033[0m'
#     BOLD = '\033[1m'
#     UNDERLINE = '\033[4m'
# class bcolors:
# class AttrDict(dict):
# class OutputZipFile(zipfile.ZipFile):
# class OutputFile:
# class OutputDirectory:
# def space_with_nbsp(text):
# def split_xdid(xdid):
# def br_with_n(text):
# def get_log():
# def log(s, minverbose=0, severity='INFO'):
# def info(_s, _m=0):
# def warn(_s, _m=0):
# def error(_s, _m=0):
# def summary(_s, _m=0):
# def debug(s):
# def progress(rest=None, every=1):
# def args_parser(desc=""):
# def get_args(desc="", parser=None):
# def find_files(*paths, **kwargs):
# def to_timet(y, mon=1, d=1, h=0, m=0, s=0):
# def generate_zip_files(data):
# def find_files_with_time(*paths, **kwargs):
# def filetime(fn):
# def iso8601(timet=None):
# def datestr_to_datetime(s):
# def parse_xdid(path):
# def parse_pathname(path):
# def parse_pubid(fn):
# def construct_date(y, m, d):
# def parse_iso8601(s):
# def parse_seqnum(s):
# def parse_date_from_filename(fn):
# def clean_filename(fn):
# def replace_ext(fn, newext):
#     def __init__(self, *args, **kwargs):
# def autoconvert(v):
# def parse_tsv_data(contents, objname=None):
# def parse_tsv(fn, objname=None):
# def parse_tsv_rows(fn, objname=None):
#     def __init__(self, fnzip, toplevel="", log=True):
#     def write_file(self, fn, contents, timet=None):
#     def write(self, data):
#     def __del__(self):
#     def __init__(self, outfp=None):
#     def write_file(self, fn, contents, timet=None):
#     def write(self, data):
#     def write_row(self, fields):
#     def write_html(self, fn, innerhtml, title=""):
# def strip_toplevel(fn):
# def disambiguate_fn(fn, all_filenames):
#     def __init__(self, toplevel_dir):
#     def exists(self, fn):
#     def open_file(self, fn, mode='w'):
#     def close_file(self, fn):
#     def write_file(self, fn, contents, timet=None):
#     def write_html(self, fn, innerhtml, title=""):
#     def write_row(self, fn, headerstr, values):
# def open_output(fnout=None):
# def memoize(obj):
#     def memoizer(*args, **kwargs):
# def __dict_replace(s, d):
# def escape(data, entities={}):
# def consecutive(text):


# Path: xdfile/ccxml2xd.py
import string
import re
import xdfile
from lxml import etree
from xdfile.utils import escape, consecutive, xml_escape_table, rev_xml_escape_table, error

    # add puzzle
    puzzle = []
    for i in range(rows):
        puzzle.append([" "] * cols)

    for cell in grid.xpath('./puzzle:cell', namespaces=ns):
        x = int(cell.attrib['x']) - 1
        y = int(cell.attrib['y']) - 1
        if 'solution' in cell.attrib:
            value = cell.attrib['solution']
        if 'type' in cell.attrib and cell.attrib['type'] == 'block':
            value = xdfile.BLOCK_CHAR
        puzzle[y][x] = value

    xd.grid = ["".join(row) for row in puzzle]

    # add clues
    word_map = {}
    for word in root.xpath('//puzzle:crossword/puzzle:word', namespaces=ns):
        word_map[word.attrib['id']] = (word.attrib['x'], word.attrib['y'])

    for clues in root.xpath('//puzzle:crossword/puzzle:clues', namespaces=ns):
        type = clues.xpath('./puzzle:title', namespaces=ns)[0]
        type = "".join(chr(x) for x in etree.tostring(type, method='text').upper() if chr(x) in string.ascii_uppercase)
        type = type[0]

        for clue in clues.xpath('./puzzle:clue', namespaces=ns):
            word_id = clue.attrib['word']
            number = int(clue.attrib['number'])
            text = "|".join(clue.itertext()).strip()

            text = escape(text, rev_xml_escape_table)