Přidání pevné mezery k neslabičným předložkám a spojkám

koren
Člen | 59
+
0
-

Ahoj. Řešíte někdo na webu české typografické pravidlo, podle kterého by měly být všechny jednoznaková slova (a některé další textové elementy) zalomená na další řádek?

Např. u WordPressu existuje super plugin Zalomení, který elegantně řeší všechny možné případy. Pro Nette jsem ale bohužel nic takového nenašel.

Říkal jsem si, že bych to chtěl mít na webech pokryté alespoň částečně, ale vlastně nevím, která cesta je nejlepší. Dává větší smysl texty při ukládání prohnat nějakým PHP skriptem a s pevnýma mezerama to uložit už rovnou do DB, nebo stačí, aby to prošlo nějakým latte filtrem až při renderování a načítání z DB?

Jak byste to řešili / řešíte vy? ;)

Kamil Valenta
Člen | 758
+
+3
-

Máme na to filtr v latte. Mělo by to jít až v šabloně, protože z db může být hromada výstupů, kde takovou mezeru nechceš. Třeba v API, v exportech…

dakur
Člen | 493
+
+1
-

Záleží web od webu. Někde to neřešíme, jinde ano. Martin Zlámal sdílel na svém webu kdysi toto:

function nbsp(string $input): string
{
	return \preg_replace('/(\s)([ksvzaiou])\s/i', "$1$2\xc2\xa0", $input); //   === \xc2\xa0
}

edit: i když teda vlastně teď přemýšlím, jestli to vůbec funguje. 😁 Měl jsem pocit, že to fungovalo.. 🤷‍♂️

edit 2: jo a teď koukám, že se ptáš na to kdy, ne na implementaci. Tož sorry. :-)

Editoval dakur (20. 10. 2022 14:33)

dakur
Člen | 493
+
0
-

@KamilValenta To záleží, jak se na to díváš. Pokud uživatel úmyslně píše nbsp a ty mu je odstraníš už na vstupu, protože se ti nehodí v API, tak to podle mě dobře není. Já bych naopak řekl, že to do DB patří/může patřit, protože je to součást toho sdělení, a pokud se ti to v API nehodí, tak si to odstraníš.

Editoval dakur (20. 10. 2022 14:39)

Kamil Valenta
Člen | 758
+
0
-

@dakur Pokud se nepletu, tak uživatel v běžných inputech ani nemá jak &nbsp zadat. Takže se bavíme o nějakých JS editorech a z nich už v principu očekáváš HTML, které do případného API musí v cdata.

koren
Člen | 59
+
0
-

@dakur Implementace mě určitě taky zajímá :D Ten kód jsem zkusil a vypadá to funkčně, takže díky! ;)

Podle všeho to asi pokrývá jen ty jednopísmenné spojky a předložky, ale pro drtivou většinu případů myslím bude stačit.

Nicméně kdyby měl někdo i nějaké sofistikovanější řešení, sem s ním ;) Myslím, že by se to lidem mohlo hodit…

David Matějka
Moderator | 6445
+
+5
-

Komplexnější implementace kdyztak tu: https://github.com/Mikulas/vlna

dakur
Člen | 493
+
0
-

Kamil Valenta napsal(a):

@dakur Pokud se nepletu, tak uživatel v běžných inputech ani nemá jak &nbsp zadat. Takže se bavíme o nějakých JS editorech a z nich už v principu očekáváš HTML, které do případného API musí v cdata.

  ne (i když některé JS editory to mohou dělat/převádět), ale nbsp (tedy znak nedělitelné mezery) ano – např. na macOS je to tuším Shift+mezera nebo tak něco. (Naopak mě mrzí, že na win to tak jednoduché není, stejně jako pomlčka.)

Editoval dakur (21. 10. 2022 14:29)

roman.campula
Člen | 60
+
+1
-

Já na tom mám vlastní filtr do Latte. Možná ne úplně dokonalý, ale na základní úpravu textu to funguje.

/**
   * Nahradí na vybradných místech mezery za nezalomitelné mezery
   *
   * @param string $string
   * @return string
   */
  function nbsp(string $string): string {
    $pattern = "/([ >;][ksvzouai%]) (.?)/i";
    $replacement = "$1 $2";
    $string = Nette\Utils\Strings::replace($string, $pattern, $replacement);
    $string = Nette\Utils\Strings::replace($string, $pattern, $replacement); # druhy pruchod pro vicenasobne znaky ("a i Pavel tam byl")

    $pattern = "/(např|tj|tzn|tzv)\. /i";
    $replacement = "$1. ";
    $string = Nette\Utils\Strings::replace($string, $pattern, $replacement);
    $html = new Nette\Utils\Html;
    $html->setHtml($string);

    return $html;
  }