Esempio n. 1
0
def gen_verse(rhymescheme, antirhymescheme, meters, state=None):
    if state is None: state = start_state
    order = babble.the_order()
    lines = [list(state)]
    linerhymes = [None]
    i = 1
    length = len(rhymescheme)
    rhymescheme = [[]] + rhymescheme
    antirhymescheme = [[]] + antirhymescheme
    meters = [None] + meters
    while i <= length:
        state_i = tuple(reduce(operator.add, lines, [])[-order:])
        rhymes     = [linerhymes[j] for j in rhymescheme[i]]
        antirhymes = [linerhymes[j] for j in antirhymescheme[i]]
        if i == 1:  # XXX hacky
            state_i = babble.start(state_i)
            m = match_words(tuple(t for t in state_i if t != '<S>'),
                            meters[i])
            if m is None:
                continue
            line, rhyme = gen_line(meter=m,
                                   rhymes=rhymes,
                                   antirhymes=antirhymes,
                                   state=state_i,
                                   cutoff=10000)
            if line: line = list(state_i) + line
        else:
            line, rhyme = gen_line(meter=meters[i],
                                   rhymes=rhymes,
                                   antirhymes=antirhymes,
                                   state=state_i,
                                   cutoff=60000)
        if line is None:
            # XXX hacky:
            i = max(1, max(rhymescheme[i]) if rhymescheme[i] else i-1)
            lines = lines[:i]
            linerhymes = linerhymes[:i]
            print >>sys.stderr, 'Backing up to %d' % i
        else:
            print >>sys.stderr, '%4d' % i, format_line(line)
            lines.append(line)
            linerhymes.append(rhyme)
            i += 1
    return lines[1:]
Esempio n. 2
0
def start():
    return babble.start(start_state)