k47.cz  — každý den dokud se vám to nezačne líbit
výběr foto Praha povídky kultura
TECH ▞▞ kolo | twitter RSS
««« »»»

Typografické udělátko

9. 7. 2009 (před 10 lety) — k47 (CC by-nc-sa) (♪)

Všechny vtipy, které teď na strán­kách vtipy.k47.cz vy­dá­vám za své jsem ukradl. Po­cho­pi­telně. Přece bych sám ne­do­ká­zal vy­pro­du­ko­vat 26 tisíc vtipů. To není v silách jed­not­livce. Krádež byla vcelku rych­lou a po­ho­dl­nou cestou, jak vy­bu­do­vat nej­větší da­ta­bázi vtipů na čes­kých in­terwebech. Ale má to svou stin­nou stránku – kva­litu. Teď ne­na­rá­žím na to, že ně­které vtipy jsou špatné nebo bůh ví co (kaž­dému se navíc líbí něco jiného, žejo), ale na úroveň textu, gra­ma­tiku a zásady ty­po­gra­fie. Je­li­kož byl zdro­jem lid – a lid vůbec neumí psát správně česky – pak je jasné, že to místy stojí za hovno.


Lidi z ne­po­cho­pi­tel­ných důvodů rádi píšou bez háčků a bez čárek, někdy si vy­stačí jenom s vel­kými pís­meny, vy­pro­du­kují spoustu chyb v y/i, mě/mně a hlavně ta ty­po­gra­fie. Za čárkou, tečkou, vy­křič­ní­kem, otaz­ní­kem, dvoj­teč­kou a střed­ní­kem se píše mezera, nikdy ne před ním. In­ter­punkční zna­ménko stačí jedno, nejsou po­třeba tři vy­křič­níky. Ale v pří­padě takové troj­tečky, jsou třeba přesně tři tečky ne dvě, ne deset. Pa­ne­bože, je to tak těžký? Není. Navíc nejde o nějaké vy­myš­le­nosti, pro­tože text, kde se do­dr­žují tyto (a další) pra­vi­dla se čte mnohem lépe, než nějaká samo-domo zmr­še­nina.

Navíc vtipy jsou už z pod­staty věci vtipné a proto tam není třeba cpát smaj­líky. To člověk po­chopí, že je to vtip. Boha jeho.

A pro­tože mě tyhle věci štvaly a chtěl jsem trochu po­zved­nout úroveň vtipů, napsal jsem si malou PHP třídu Ty­po­gra­phCorrec­tor, která přesně tyhle věci řeší.

Jed­no­duše stačí za­vo­lat TypographCorrector::correct('To,co chci zkorektůrovat ? :D olol') a vý­sled­kem je krásný opra­vený text. Do­konce se metoda snaží de­te­ko­vat případ, kdy je celý text na­psaný vel­kými pís­meny. V tom pří­padě text pře­vede na malé písmo s vý­jim­kami za­čátků vět (má to nějaké chyby, jako třeba, že zvětší pís­meno i za po­řa­do­vým číslem, ale je to pořád lepší než zlo SE ZA­PNU­TÝM CA­PSLOCKEM).

A teď kód:

<?php
/**
 * Třída, která se snaží napravit aspoň nějaké prohřešky proti typografickým pravidlům.
 *
 * Něco málo o typografii: http://www.pixy.cz/pixylophone/2003_02_archiv.html#1046432237
 *
 * ----------------------------------------------------------------------------
 * "BEER-WARE LICENSE"
 * XXXXX 'kaja47' XXXXX (k47.cz) stvořil tento soubor.
 * Dokud ponecháte tuto hlavičku s licencí beze změna, můžete si s kusem kódu
 * pod ní dělat, co se vám zlíbí. Když se někdy potkáme a vy si budete myslet,
 * že za to tahle věc stojí, můžete mi na oplátku koupit pivo.
 * ----------------------------------------------------------------------------
 *
 */
class TypographCorrector {

  /**
   * @param string $text
   */
  public static function correct($text, $removeSmiles = TRUE) {
    //odstraní opakované vykřičníky nebo otazníky
    $text = preg_replace('#\!{2,}#', '!', $text);
    $text = preg_replace('#\?{2,}#', '?', $text);

    //odstraní smajlíky
    if( $removeSmiles === TRUE ) {
      $text = preg_replace(array('#\:\)+(?! )#', '#\:D+(?= )#'), '', $text);
    }

    //více mezer za sebou zredukuje na jednu
    $text = preg_replace('# +#', ' ', $text);

    //více než tři tečky za sebou zredukuje na tři
    $text = preg_replace('#\.{4,}#', '...', $text);

    //dvě tečky za sebou zredukuje na jednu (předpokládá, že to neměla být trojtečka)
    $text = preg_replace('#([^\.])\.\.([^\.])#', '\\1.\\2', $text);

    //mezera po interpunkčním znaménku
    //když po ,.;:?! rovnou následuje písmeno, pak za ní udělá mezeru
    $text = preg_replace('#([,\.;\:\?\!])([a-zA-Záčďéíňóřšťúůýž])#', '\\1 \\2', $text);

    //odstraní mezery před interpunkčními znaménky
    $text = preg_replace('# ([,\.;\:\?\!])#', '\\1', $text);

    if( self::isMostlyUpperCase($text) ) {
      $text = self::guessUpperCaseLetters($text);
    }

    return trim($text);
  }

  private static function isMostlyUpperCase($text, $limit = 0.45) {
    $upperCaseLetters = preg_match_all('#[A-ZÁČĎÉÍŇÓŘŠŤÚŮÝŽ]#', $text, $m);
    $allLetters = mb_strlen($text);
    return ( $upperCaseLetters / $allLetters ) > $limit;
  }

  private static function guessUpperCaseLetters($text) {
    $text = mb_strtolower($text, 'utf8');
    $s = preg_split('#([\.\?\!] )#', $text, -1, PREG_SPLIT_DELIM_CAPTURE);
    for ($i = 0 ; $i < count($s) ; $i+=2) {
      $sentences[] = $s[$i] . ( isset($s[$i+1]) ? $s[$i+1] : '' ) ;
    }

    foreach ($sentences as $key => $sentence) {
      $sentences[$key] = ucfirst($sentence);
    }
    $text = implode('', $sentences);
    return $text;
  }

}

Když už se roz­hod­nete pro dvoj­takt copy-paste (což schva­luji a budu moc rád, když to po­u­ži­jete a do­sáhnu ni­r­vány, když do ko­men­tářů na­pí­šete, že jste to sku­tečně po­u­žili), vě­nujte po­zor­nost hlavně li­cenci. Jde o beer­ware!

píše k47 & hosté, ascii@k47.cz