---
title: 'Scriptorium BBS'
url: 'https://wiki.teletypegames.org/hu/services/scriptorium-bbs'
markdown: 'https://wiki.teletypegames.org/hu/services/scriptorium-bbs.md'
lang: hu
date: '2026-11-01'
description: 'A BBS-hálózat könyvtára: a Project Gutenberg több ezer közkincs könyve, lapozható fejezetekre vágva, modern terminálra vagy Commodore 64-re. Elérhető: teletypegames.org:2330, böngészőben a bbsweb-en, és a TTG Gate BBS-en át is Áttekintés Ruby-alkalmazás a rubbs gemre építve, mint a Teletype BBS, …'
taxonomy:
  tag:
    - howto
---

# Scriptorium BBS

> A BBS-hálózat könyvtára: a Project Gutenberg több ezer közkincs könyve, lapozható fejezetekre vágva, modern terminálra vagy Commodore 64-re.
> 
> **Elérhető: `teletypegames.org:2330`**, böngészőben a [bbsweb](https://bbsweb.teletypegames.org)-en, és a [TTG Gate BBS](https://wiki.teletypegames.org/hu/services/ttg-gate-bbs)-en át is

# Áttekintés

Ruby-alkalmazás a [**rubbs**](https://git.teletypegames.org/engines/rubbs) gemre építve, mint a [Teletype BBS](https://wiki.teletypegames.org/hu/services/teletype-bbs), az [Alexandria BBS](https://wiki.teletypegames.org/hu/services/alexandria-bbs) és a [Commodex BBS](https://wiki.teletypegames.org/hu/services/commodex-bbs).

Két arca van egy porton:

- **Modern**: ANSI-színek, ablakok, menük és egér (SyncTERM, NetRunner, PuTTY, bbsweb). Polcok, könyvek és fejezetek kétpaneles ablakokban, és egy olvasóablak, amely a fejezetet a saját szélességére tördeli.
- **Commodore 64**: PETSCII 40×25-ön, C64-es terminálprogramhoz (CCGMS, Novaterm, UltimateTerm) WiFi-modem mögött. Egybillentyűs menü, számozott listák és 38 oszlopos oldalak, amelyek RETURN-re várnak.

A hívás a rubbs `BBS::Terminal` kérdésével indul: a RETURN elfogadja a tippet, az `1` a modern arcot, a `2` a C64-est választja.

# A könyvek

- **A katalógus** a Project Gutenberg sajátja, a `pg_catalog.csv.gz` (kb. 78 000 szöveg és 400 könyvespolc). A board SQLite-ba importálja, teljes szöveges indexszel a címeken és a szerzőkön, és hetente újraolvassa; az új elkészültéig a régi szolgál ki. Minden keresőszó szókezdetként illeszkedik, az ékezet nem számít (a `bronte` megtalálja a Brontët), a `lang:fr` pedig egy nyelvre szűr.
- **A Classics polc** a board saját válogatása 36 ismert könyvből (`config/classics.yml`); már az első katalógusimport előtt is működik.
- **Egy könyv szövegét** a board akkor tölti le a gutenberg.org-ról, amikor először megnyitják; megtisztítja (le a Project Gutenberg fej- és lábléce, a prózai sorok bekezdésekké fűzve), és a címsorai szerint fejezetekre vágja (CHAPTER, BOOK, PART, ACT, STAVE, LETTER, CANTO, római számok…), a tartalomjegyzéket kihagyva. A nagyon hosszú fejezetet részekre bontja, a címsor nélküli könyvet kb. 16 KB-os szakaszokra. A tisztított szöveg és a fejezetindex lemezes gyorsítótárban marad (300 MB, a legrégebben olvasott megy ki elsőként), a memóriába csak a képernyőn lévő fejezet kerül.
- **A Most read** a boardon megnyitott könyveket számolja, hívásonként egyszer.

Minden könyvoldal feltünteti a forrást: *eBook #N from Project Gutenberg, gutenberg.org/ebooks/N — public domain in the USA.*

# Olvasás

**Modern terminálon:**

| Billentyű | Művelet |
|---|---|
| F2 | A Classics polc |
| F3 | Keresés cím vagy szerző szerint |
| F4 | A Project Gutenberg könyvespolcai |
| F7 | A boardon legtöbbet olvasottak |
| Enter vagy Alt-R | Könyv megnyitása / fejezet olvasása |
| PgUp, PgDn, Home, End | Lapozás az olvasóban |
| ← → vagy P, N | Előző / következő fejezet |
| F5 vagy Alt-Enter | Teljes képernyő és vissza |
| Alt-X | Kilépés |

**Commodore 64-en** a menü: `1` a Classics, `2` a könyvespolcok, `3` keresés, `4` a legtöbbet olvasottak, `A` névjegy, `Q` kilépés. Egy könyvnek van egy adatlapja és egy számozott fejezetlistája; az olvasóban a RETURN a következő oldalt adja (a fejezet végén a következő fejezetet), a `B` egy oldalt vissza, az `N`/`P` fejezetet vált, a `Q` vissza a listához. A görbe idézőjeleket, a gondolatjeleket és az ékezetes betűket a board a C64 által megjeleníthető jelekre cseréli.

# Beállítások és adatok

| Változó | Alapérték |  |
|---|---|---|
| `SCRIPTORIUM_BBS_MIRROR` | `https://www.gutenberg.org` | ahonnan a szövegek jönnek; tükör is lehet |
| `SCRIPTORIUM_BBS_CATALOG_URL` | `https://www.gutenberg.org/cache/epub/feeds/pg_catalog.csv.gz` | a katalógus |
| `SCRIPTORIUM_BBS_CATALOG_TTL` | `7` | ennyi nap után olvassa újra a katalógust |
| `SCRIPTORIUM_BBS_CLASSICS` | `config/classics.yml` | a Classics polc |
| `SCRIPTORIUM_BBS_DB` | `data/catalog.sqlite3` | az importált katalógus |
| `SCRIPTORIUM_BBS_CATALOG_FILE` | `data/pg_catalog.csv.gz` | a letöltött katalógus |
| `SCRIPTORIUM_BBS_TEXTS` | `data/texts` | a szöveg-gyorsítótár |
| `SCRIPTORIUM_BBS_CACHE_MB` | `300` | a szöveg-gyorsítótár mérete |
| `SCRIPTORIUM_BBS_BOOK_MAX` | `8388608` | a legnagyobb letöltött könyv, bájtban |
| `SCRIPTORIUM_BBS_READS` | `data/reads.jsonl` | az olvasások, soronként egy JSON |

A boardnak nincs titka. Ha a fejezetszabályok változnak, ürítsd a `data/texts`-et, hogy a tárolt könyveket újravágja.

# A motorháztető alatt

A masterre pusholás a Woodpeckerből élesít (RuboCop, compose-ellenőrzés, `ci-deploy scriptorium-bbs`); a konténer neve `scriptorium-bbs`, a helye `/srv/stacks/scriptorium-bbs`, a `data/` megmarad a deployok között. Az entrypoint induláskor frissíti a rubbs-t.

A kód a házi rétegezést követi: a `lib/domain` (a könyv-, polc-, fejezet- és szövegmodell; a Gutenberg-, katalógus-, classics-, olvasás- és szöveggyorsítótár-repository; `ChapterService`, `LibraryService`, `ReadingService`; a `ScriptoriumBBS` kompozíciós gyökér) semmit sem tud a telnetről, a `lib/ui` pedig a `UI::Modern`-t a `ReaderWindow`-val és a `UI::Petscii`-t tartalmazza. A board egyszerre egy könyvet tölt le és vág fel, így egy rakás új könyv sem lépi túl a memóriakorlátot.

'; var prevLevel = 2; for (var i = 0; i < headings.length; i++) { var h = headings\[i\]; var text = h.textContent.trim(); var slug = text.toLowerCase() .replace(/\[áàâä\]/g,'a').replace(/\[éèêë\]/g,'e').replace(/\[íìîï\]/g,'i') .replace(/\[óòôöő\]/g,'o').replace(/\[úùûüű\]/g,'u') .replace(/\[^a-z0-9\]+/g, '-').replace(/^-|-$/g, ''); if (!slug) slug = 'heading-' + i; if (used\[slug\]) { slug += '-' + i; } used\[slug\] = true; h.id = slug; var level = parseInt(h.tagName.charAt(1)); var cls = level > 2 ? ' class="toc-child"' : ''; html += '- [' + text + '](#'%20+%20slug%20+%20')
'; } html += '
'; toc.innerHTML = html; // Scroll-spy: highlight current heading var links = toc.querySelectorAll('a'); var ids = \[\]; for (var j = 0; j < links.length; j++) ids.push(links\[j\].getAttribute('href').slice(1)); function updateActive() { var current = ''; for (var k = 0; k < ids.length; k++) { var el = document.getElementById(ids\[k\]); if (el && el.getBoundingClientRect().top <= 80) current = ids\[k\]; } for (var m = 0; m < links.length; m++) { links\[m\].parentNode.classList.toggle('active', links\[m\].getAttribute('href') === '#' + current); } } window.addEventListener('scroll', updateActive, { passive: true }); updateActive(); })();

---

## Navigation

- Parent: [Szolgáltatások](https://wiki.teletypegames.org/hu/services.md)
- Previous: [Nyilvános oldal](https://wiki.teletypegames.org/hu/services/public-site.md)
- Next: [Discord szálütemező](https://wiki.teletypegames.org/hu/services/statusbot.md)
