'''Berechnungen und Visualisierungen rund ums Pascal-Dreiecks.

http://www.profv.de/pascal/

Version: 0.5
Autor:   Volker Grabsch <vog@notjusthosting.com>
'''

def binom(n, k):
    if k == 0:
        return 1
    elif 0 < k <= n:
        return (binom(n - 1, k - 1) * n) / k
    else:
        raise ArithmeticError('k>n or k<0', n, k)

def farbe_zeilenweise(n, k):
    return n % 6

def konstant(c):
    def konstant_c(n, k):
        return c
    return konstant_c

def ohne_farbe(n, k):
    return 'w'

def farbe_modulo(m):
    def farbe_modulo_m(n, k):
        return binom(n, k) % m
    return farbe_modulo_m

def farbe_schwarz(m, r):
    def farbe_modulo_m(n, k):
        if binom(n, k) % m == r:
            return 's'
        else:
            return 'w'
    return farbe_modulo_m

def erzeuge_aus_vorlage(name, max_n, farbe, wert,
                        endung, ersetze_sonderzeichen,
                        vorlage_alles, vorlage_zeile,
                        vorlage_einrueckung, vorlage_luecke, vorlage_zelle):
    dateiname = name + endung
    datei = file(dateiname, 'w')
    datei.write(vorlage_alles % {
        'name': ersetze_sonderzeichen(name),
        'zeilen': ''.join(vorlage_zeile % {
            'einrueckung': {
                n == max_n: '',
                n != max_n: vorlage_einrueckung % {
                    'einrueckung': ersetze_sonderzeichen(max_n - n),
                },
            }[True],
            'zellen': vorlage_luecke.join(vorlage_zelle % {
                'farbe': ersetze_sonderzeichen(farbe(n, k)),
                'wert':  ersetze_sonderzeichen(wert(n, k)),
            } for k in xrange(0, n + 1)),
        } for n in xrange(0, max_n + 1))
    })
    datei.close()

def _escape_xml(value):
    escape_chars = {
        '<': '&lt;',
        '>': '&gt;',
        '&': '&amp;',
        '"': '&quot;',
        "'": '&apos;',
    }
    return ''.join(escape_chars.get(ch, ch)
                   for ch in unicode(value).encode('UTF-8'))

def erzeuge_html(name, max_n, farbe, wert):
    return erzeuge_aus_vorlage(name, max_n, farbe, wert, '.html', _escape_xml,
vorlage_alles = '''\
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <title>%(name)s</title>
        <meta http-equiv="content-type" content="text/html; charset=UTF-8">
        <style type="text/css">
            body
            {
                text-align: center;
            }
            table
            {
                border-collapse: collapse;
                table-layout: fixed;
            }
            td
            {
                color: #000;
                text-align: center;
                font-weight: bold;
                font-size: 10pt;
                width:  3.0em;
                height: 1.5em;
                margin:  0px 0px 0px 0px;
                padding: 0px 0px 0px 0px;
            }
            div
            {
                overflow: hidden;
            }
            .luecke
            {
                background-color: #fff;
            }
            .farbe_s
            {
                background-color: #000;
            }
            .farbe_w
            {
                background-color: #fff;
            }
            .farbe_0
            {
                background-color: #faa;
            }
            .farbe_1
            {
                background-color: #afa;
            }
            .farbe_2
            {
                background-color: #aaf;
            }
            .farbe_3
            {
                background-color: #ffa;
            }
            .farbe_4
            {
                background-color: #faf;
            }
            .farbe_5
            {
                background-color: #aff;
            }
        </style>
    </head>
    <body>
        <h1>%(name)s</h1>
        <center>
            <table>
%(zeilen)s\
            </table>
        </center>
    </body>
</html>
''',
vorlage_zeile = '''\
                <tr>
%(einrueckung)s\
%(zellen)s\
%(einrueckung)s\
                </tr>
''',
vorlage_einrueckung = '''\
                    <td class="luecke" colspan="%(einrueckung)s"></td>
''',
vorlage_luecke = '''\
''',
vorlage_zelle = '''\
                    <td class="farbe_%(farbe)s" colspan="2"><div>%(wert)s</div></td>
''',
)

def erzeuge_html_2(name, max_n, farbe, wert):
    return erzeuge_aus_vorlage(name, max_n, farbe, wert, '.html', _escape_xml,
vorlage_alles = '''\
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <title>%(name)s</title>
        <meta http-equiv="content-type" content="text/html; charset=UTF-8">
        <style type="text/css">
            body
            {
                text-align: center;
            }
            table
            {
                border-collapse: collapse;
                table-layout: fixed;
            }
            td
            {
                color: #000;
                text-align: center;
                font-weight: bold;
                font-size: 10pt;
                width:  2.6em;
                height: 2.6em;
                margin:  0px 0px 0px 0px;
                padding: 0px 0px 0px 0px;
            }
            div
            {
                overflow: hidden;
            }
            .luecke
            {
                background-color: #fff;
            }
            .farbe_s
            {
                background-color: #000;
            }
            .farbe_w
            {
                background-color: #fff;
            }
            .farbe_0
            {
                background-color: #faa;
            }
            .farbe_1
            {
                background-color: #afa;
            }
            .farbe_2
            {
                background-color: #aaf;
            }
            .farbe_3
            {
                background-color: #ffa;
            }
            .farbe_4
            {
                background-color: #faf;
            }
            .farbe_5
            {
                background-color: #aff;
            }
        </style>
    </head>
    <body>
        <h1>%(name)s</h1>
        <center>
            <table>
%(zeilen)s\
            </table>
        </center>
    </body>
</html>
''',
vorlage_zeile = '''\
                <tr>
%(einrueckung)s\
%(zellen)s\
                </tr>
''',
vorlage_einrueckung = '''\
                    <td class="luecke" colspan="%(einrueckung)s"></td>
''',
vorlage_luecke = '''\
                    <td class="luecke"></td>
''',
vorlage_zelle = '''\
                    <td class="farbe_%(farbe)s"><div>%(wert)s</div></td>
''',
)

