Przejdź do treści

olski.skład.makieta

Tekst do makiety: drzewo wylosowane zamiast napisanego.

Makieta żąda tekstu, zanim ktokolwiek ma co powiedzieć, i dostaje zwykle łacińską sieczkę, po której nie widać polskiej kolumny: polskie słowo jest dłuższe, odmienia się i inaczej łamie wiersz. Losowane jest tu drzewo, a nie napis, bo gramatyczności nie ma czym naruszyć — zgodność w tym kierunku jest policzona, a nie sprawdzona. Odsiewa się jedno, czyli zdanie, z którego czytelnik nie odzyska ról, i pyta o to olski/skład/przegląd.py. Po co ten moduł jest i czego zażądał od tego pakietu, mówi docs/po-wypisaniu.md.

Sensu ten moduł nie pilnuje i pilnować nie ma. Wiadro kupiło nóż. jest zdaniem polskim, a nie zdaniem o wiadrze, i taki tekst do makiety pasuje, bo czytelnik ma zobaczyć kształt kolumny, a nie zacząć czytać. Tabele niżej dobierają więc lematy pod formę i pod rytm, a nie pod to, kto co komu robi; o wyjątkach mówi Obsada. Fakt o polszczyźnie, który do takiej tabeli wszedł albo z niej wypadł, jest przy tym faktem o każdym drzewie, a nie o tym jednym programie, i mówi o tym docs/po-wypisaniu.md wraz z tym, gdzie taki fakt należy.

Rytm jest za to wyborem, bo makieta pokazuje właśnie go. Kształty zdania wyczerpują kategorie, które niesie olski.skład.składnia, a ten sam nie wypada dwa razy pod rząd, bo jednostajność jest usterką i wylicza ją docs/fiction.md. Obsadę akapitu niosą Postać, bo dopiero one pozwalają opuścić podmiot, a tekst, w którym każde zdanie powtarza swój podmiot, czyta się jak lista.

Warstwy nazw z olski/skład/słownik.py ten moduł nie woła i nie ma po co: tamten zapis zamienia lemat na nazwę atrybutu dla tego, kto drzewo pisze, a program trzymający lematy w tabeli woła konstruktory wprost.

python3 -m olski.skład.makieta --akapity 3
python3 -m olski.skład.makieta --ziarno 1871

OSOBY = ('aptekarz', 'chłopiec', 'córka', 'czeladnik', 'dziewczyna', 'gospodarz', 'kowal', 'krawiec', 'kucharka', 'kupiec', 'mieszczanin', 'praczka', 'sąsiad', 'sąsiadka', 'wdowa', 'zegarmistrz') module-attribute

RZECZY = ('beczka', 'bochenek', 'deska', 'dzban', 'klucz', 'koszyk', 'kufer', 'list', 'lustro', 'nóż', 'okno', 'skrzynia', 'sukno', 'szal', 'świeca', 'wiadro', 'zegar') module-attribute

MIEJSCA_W = ('brama', 'izba', 'kamienica', 'karczma', 'komora', 'kuchnia', 'młyn', 'ogród', 'piwnica', 'sień', 'warsztat', 'wieża') module-attribute

MIEJSCA_NA = ('dziedziniec', 'most', 'podwórze', 'próg', 'rynek', 'targ', 'ulica') module-attribute

MIEJSCA = (*MIEJSCA_W, *MIEJSCA_NA) module-attribute

BUDOWLE = ('brama', 'kamienica', 'karczma', 'most', 'młyn', 'wieża') module-attribute

PORY = ('ranek', 'świt', 'wieczór', 'zmierzch') module-attribute

PORY_W_MIEJSCOWNIKU = ('noc',) module-attribute

CECHY = ('ciemny', 'cichy', 'ciężki', 'drewniany', 'duży', 'gliniany', 'krzywy', 'mały', 'mokry', 'nowy', 'pusty', 'stary', 'wąski', 'zimny') module-attribute

CECHY_OSÓB = ('cichy', 'duży', 'mały', 'młody', 'stary') module-attribute

PRZYSŁÓWKI = ('cicho', 'nagle', 'powoli', 'późno', 'prędko', 'rano', 'wkrótce') module-attribute

CZYNY_RUCHU = ('wrócić', 'wyjść', 'zejść') module-attribute

CZYNY_STANU = ('mieszkać', 'milczeć', 'siedzieć', 'stać', 'zapłakać', 'zasnąć', 'zniknąć') module-attribute

CZYNY_Z_BIERNIKIEM = ('kupić', 'naprawić', 'otworzyć', 'podnieść', 'policzyć', 'postawić', 'przynieść', 'rozbić', 'schować', 'sprzedać', 'wynieść', 'wziąć', 'zamknąć', 'zapalić', 'zasłonić', 'zgasić', 'zgubić', 'znaleźć', 'zważyć') module-attribute

CZYNY_Z_CELOWNIKIEM = ('dać', 'oddać', 'pokazać', 'przynieść', 'sprzedać', 'zostawić') module-attribute

CZYNY_Z_BEZOKOLICZNIKIEM = ('chcieć', 'musieć', 'próbować', 'umieć', 'woleć', 'zdążyć') module-attribute

CZYNY_ZE_ZDANIEM = ('myśleć', 'pamiętać', 'powiedzieć', 'usłyszeć', 'widzieć', 'wiedzieć', 'zauważyć') module-attribute

OKOLICZNOŚCI_CZASU = (('', 'czas', PORY), ('w', 'czas', PORY_W_MIEJSCOWNIKU)) module-attribute

OKOLICZNOŚCI = (*OKOLICZNOŚCI_CZASU, ('na', 'miejsce', MIEJSCA_NA), ('pod', 'miejsce', BUDOWLE), ('przed', 'miejsce', BUDOWLE), ('w', 'miejsce', MIEJSCA_W)) module-attribute

OKOLICZNOŚCI_RUCHU = (*OKOLICZNOŚCI_CZASU, ('do', 'cel', MIEJSCA_W), ('na', 'cel', MIEJSCA_NA), ('od', 'źródło', OSOBY), ('po', 'droga', MIEJSCA), ('z', 'źródło', MIEJSCA)) module-attribute

OKOLICZNOŚCI_CZYNNE = (*OKOLICZNOŚCI, ('', 'narzędzie', RZECZY)) module-attribute

SPÓJNIKI_OKOLICZNOŚCI = tuple(SPÓJNIKI) module-attribute

ZDAŃ = (3, 6) module-attribute

OSÓB = (2, 3) module-attribute

RZECZY_W_OBSADZIE = (1, 2) module-attribute

RUCH = 0.5 module-attribute

CECHA = 0.4 module-attribute

DOPEŁNIACZ = 0.15 module-attribute

LICZBA_MNOGA = 0.25 module-attribute

PRZECZENIE = 0.15 module-attribute

OKOLICZNOŚĆ = 0.6 module-attribute

CZOŁO = 0.4 module-attribute

KSZTAŁTY = (_czynność, _praca, _przysługa, _para, _ciąg, _powód, _wola, _sąd, _wskazanie, _orzecznik) module-attribute

Obsada dataclass

Kto i co wraca w akapicie, rozdzielone na osoby i na rzeczy.

Rzecz wraca w obsadzie na równi z osobą, bo Postać człowieka nie żąda, a Świeca zgasła. Zniknęła w piwnicy. opuszcza podmiot tak samo jak dwa zdania o czeladniku.

Rozdzielone są dlatego, że dwie pozycje pytają, czy podmiot jest kimś. Wola i sąd o świecie należą do osoby, a Beczka wiedziała, że świt zgasł. czyta się jak usterka losowania, a nie jak zdanie do makiety. Poza tymi dwiema pozycjami sensu ten moduł nie pilnuje, więc rzecz podmiotem staje wszędzie tam, gdzie zdanie mówi, co się stało.

Source code in olski/skład/makieta.py
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
@dataclass(frozen=True)
class Obsada:
    """Kto i co wraca w akapicie, rozdzielone na osoby i na rzeczy.

    Rzecz wraca w obsadzie na równi z osobą, bo ``Postać`` człowieka nie żąda,
    a `Świeca zgasła. Zniknęła w piwnicy.` opuszcza podmiot tak samo
    jak dwa zdania o czeladniku.

    Rozdzielone są dlatego, że dwie pozycje pytają, czy podmiot jest kimś.
    Wola i sąd o świecie należą do osoby, a `Beczka wiedziała, że świt zgasł.`
    czyta się jak usterka losowania, a nie jak zdanie do makiety.
    Poza tymi dwiema pozycjami sensu ten moduł nie pilnuje,
    więc rzecz podmiotem staje wszędzie tam, gdzie zdanie mówi, co się stało.
    """

    osoby: tuple[Postać, ...]
    rzeczy: tuple[Postać, ...]

    #: Lematy, które w tym akapicie już kogoś nazywają.
    #: Pytają o nie te pozycje, które mają nie nazwać drugi raz tego samego,
    #: i pytają o lematy, bo z ``Postać`` nazwy się nie wyciąga.
    lematy: frozenset[str]

    @property
    def wszyscy(self) -> tuple[Postać, ...]:
        return (*self.osoby, *self.rzeczy)

osoby instance-attribute

rzeczy instance-attribute

lematy instance-attribute

wszyscy property

__init__(osoby, rzeczy, lematy)

losuj(ziarno, akapitów=4)

Opowieść o niczym, ta sama za każdym razem, gdy ziarno jest to samo.

Opowieścią, a nie tekstem o tym, co się dzieje, bo drugiego konstruktora olski/skład/opowieść.py nie ma, a czas przeszły niesie rodzaj, więc daje makiecie i rytm, i role przypięte do czasownika.

Source code in olski/skład/makieta.py
312
313
314
315
316
317
318
319
320
def losuj(ziarno: int, akapitów: int = 4) -> Opowieść:
    """Opowieść o niczym, ta sama za każdym razem, gdy ziarno jest to samo.

    Opowieścią, a nie tekstem o tym, co się dzieje, bo drugiego konstruktora
    ``olski/skład/opowieść.py`` nie ma, a czas przeszły niesie rodzaj,
    więc daje makiecie i rytm, i role przypięte do czasownika.
    """
    los = random.Random(ziarno)
    return Opowieść(*(_akapit(los) for _ in range(akapitów)))

main(argv=None)

Wydruk makiety wraz z ziarnem, którym da się ją wywołać drugi raz.

Ziarno idzie na wyjście błędów, a tekst na wyjście zwykłe, bo makietę się przekierowuje do pliku, a ziarno się czyta.

Source code in olski/skład/makieta.py
717
718
719
720
721
722
723
724
725
726
727
728
729
730
def main(argv: Sequence[str] | None = None) -> int:
    """Wydruk makiety wraz z ziarnem, którym da się ją wywołać drugi raz.

    Ziarno idzie na wyjście błędów, a tekst na wyjście zwykłe,
    bo makietę się przekierowuje do pliku, a ziarno się czyta.
    """
    parser = argparse.ArgumentParser(description="Tekst do makiety, po polsku, z drzew.")
    parser.add_argument("--ziarno", type=int, help="ziarno losowania; bez niego losowe")
    parser.add_argument("--akapity", type=int, default=4, help="ile akapitów wypisać")
    argumenty = parser.parse_args(argv)
    ziarno = random.randrange(10**6) if argumenty.ziarno is None else argumenty.ziarno
    print(f"ziarno: {ziarno}", file=sys.stderr)
    print(losuj(ziarno, argumenty.akapity).kompiluj())
    return 0