Textpattern: Entity místo českých znaků

Každou chvíli mi píšete o radu, jak udělat to či ono v Textpatternu. Toto je tedy první díl seriálu, ve kterém postupně popíši, jak jsem implementoval Textpattern zde na Sově a na webu Vyhledávače.info. Ale pozor! Textpattern používám sotva měsíc a PHP vůbec neumím. Nečekejte proto kvalitní návod, nýbrž prostý záznam mých pokusů (v lepších případech) a omylů (v případech ostatních).

Zatracené entity

Nejčastější dotaz zní, jak se zbavit HTML entit, které Textpattern generuje místo některých českých znaků s diakritikou. Ve skutečnosti tyto entity negeneruje přímo Textpattern, nýbrž jeho editační modul Textile. Zde jsem také tuto vlastnost změnil. Můžete mne napodobit takto:

1. V adresáři textile/lib/ si najděte soubor classTextile.php a otevřete ho vhodným textovým editorem.

2. Na řádku 679 byste měli mít toto:

htmlentities($text, ENT_NOQUOTES, "utf-8");

Přepište to tímto:

htmlspecialchars($text, ENT_NOQUOTES, "utf-8");

3. Soubor uložte, uploadujte a je hotovo. Vlastně není. Textile entity generuje už při zápisu do databáze. Pokud se jich chcete zbavit i ve starších článcích (nemělo by to být nezbytné), musíte je znovu uložit talčítkem Publish.

Další problémy s Textile

Textile má s češtinou i další problém. Značky pro důraz (_) a silný důraz () nefungují, pokud vyznačený text začíná nebo končí písmenem s diakritikou. Slovo *důrazný proto vidíte s hězdičkami a ne správně takto: důrazný. To zatím opravit neumím a řeším to ručním psaním značek <em> a <strong>.

Možná někdo z vás nějaký trik najde a v tom případě budu rád, podílete-li se s námi o něj v komentářích.

, 4. 02. 2005 01:43, Pošli komentář

| Nejnovější |

Komentáře

  1. Problem bude asi v LOCALE.

    Textile je totiz plne regularnich vyrazu ktere hojne pouzivaji vyrazy typu \w, coz napr. znamena “jakykoliv slovni znak”.
    Pokud budeme mit LOCALE nastaveno na anglicky mluvici zeme, nase specificke znaky jako treba č,ý,ř jsou pak pro regularni vyraz neslovni znaky a tudiz dojde k chybnemu zpracovani retezcu.

    Resenim je nastavit pred volanim Textile fci LOCALE specificke pro nase oblasti, napr:

    setlocale(LC_ALL, 'cs');

    Pokud pak zavolate metodu TextileThis, mela by uz spravne interpretovat Vami uvadeny priklad.

    Uf. Doufam ze jsem to nepopsal moc zmatene. Za pripadne nepresnosti se omlouvam…

    Kopyto · 5538 days ago · #

  2. Áno môže to tak byť, ako napísal Kopyto. Za vhodné považujem uviesť aj kódovanie:

    setlocale(LC_ALL, 'cs_CS.UTF-8');

    Je to však trochu záludné a občas to môže spôsobiť problémy, vid komentáre k funkcii setlocale

    — Ondrej Ivanič · 5537 days ago · #

  3. upozornil bych, že ne vždy to musí být cs, bohužel záleží, na jakém systému je to provozováno…

    — xxx · 5537 days ago · #

  4. I když TP a jeho kód neznám, skoro určitě je problém s \w v regulárních výrazech, jak psal kopyto. Podle manuálu funkce regulárních výrazů podporují pouze jednobajtová kódování, nejjistější je proto \w nahradit \S (sám ve svém projektu (který _nepoužívá_ textile) mám následující funkci:

    $returnString = preg_replace('/(\s+)\*(\S.*?)\*/', "\\1[strong]\\2[/strong]", $returnString);

    (bílý znak, potom hvězdička, potom znak, potom cokoliv až do další hvězdičky) Funguje to spolehlivě.

    P.S. V tom preg_replace mám samozřejmě normální HTML tagy strong, jen tady na Sově jsem použil [strong], protože i v rámci kódu jsou HTML tagy vynechány (což by neměly).

    — NeNe · 5537 days ago · #

  5. Textile je plne regularnich vyrazu, pred jejich upravou doporucuji prozkoumat kod, jestli se tim neovlivni neco dalsiho.

    Nene: Podle manuálu funkce regulárních výrazů podporují pouze jednobajtová kódován…
    Neresi to modifikator \u (PCRE_UTF8)?

    Kopyto · 5537 days ago · #

  6. Pardon, chtel sem napsat /u…

    Kopyto · 5537 days ago · #

  7. Ten problém je ale zcela jinde, takovýchto bugů bude v tom systému více, co třeba Atom, RSS, Trackback, a mraky dalších věcí? SEO jména a názvy článků, kategorií?

    Podobné problémy ale nemá jen Textpattern, ale i WordPress a další, pro lidi neznalé je proto mnohem lepší použít BLOG:CMS, který jede v UTF-8, a veškeré komponenty tam fungují zcela korektně s češtinou…

    Radek Hulán · 5537 days ago · #

  8. Radek Hulán: Ten problém je ale zcela jinde…
    Muzu se zeptat, kde je teda ten problem?

    Ja TextPattern taky neznam, ale kdyz jsem se dival do zdrojaku, tak je delany taky v UTF-8.

    Kopyto · 5537 days ago · #

  9. Jak již uvedli kolegové, je třeba nahradit generický typ “slovo”: \w za generický typ “není whitespace”: \S .

    Týká se to metody span()—řádek 487:

    $text = preg_replace_callback("/
    (?<=^|\s|[[:punct:]]|[{([])
    ($f)
    ($this->c)
    (?::(\S+))?
    ([\S<&].*[\S]) # Zde upraveno
    ([[:punct:];]*)
    $f
    (?=[])}]|[[:punct:]]+|\s|$)
    /xmU", array(&$this, "fSpan"), $text);

    Co se týče entit, proč jednoduše nezakomentovat volání encodeEntities() v hlavní metodě textileThis()—o typografické jemnosti jako &mdash; se stejně stará metoda glyph()—, tj. řádek 220-221:

    //$text = $this->incomingEntities($text);
    //$text = $this->encodeEntities($text);

    — karmi · 5537 days ago · #

  10. Používání htmlentities namísto htmlspecialchars je velmi častým nešvarem zahraničních skriptů.
    Konkrétně jsem na to narazil třeba u CMS Pivot nebo v jednom návodu na ONLamp.

    llook · 5536 days ago · #

  11. Udelal jsem zmeny, co psal Marek Prokop i Kami (komentar 9), cimz jsem se sice zbavil entit, ale kdyz se kouknu do zdrojaku vysledne stranky, tak tam jsou misto ceskych znaku vselike paznaky.

    A po dalsich dvaceti minutach jsem prisel na nasledujici:
    Mam nastavene clean URL mode – to jest, ze v url je defacto obsazeny title clanku a pokud se v nem objevi znak s cestinou, tak se nejak prevede na otaznik a potom jsou ve zdrojaku paznaky, pokud title ten otaznik neobsahuje, tak tam paznaky nejsou… no to jsem z toho jelen, muze mi to nekdo vysvetlit?

    A druha vec, da se nejak automaticky vytvaret ta userfriendly adresa? Tedy aby to z “Název článku” udelalo “nazev-clanku” – tedy nahradilo ceske znaky a mezery, tedy abych to nemusel vsechno delat rucne… poradite?

    Testovaci system mi bezi na http://petr.vaclavek.com

    Petr Vaclavek · 5531 days ago · #

  12. Petře, url-title se musí psát ručně, což je dobže, protože URL generovaná automaticky z celých názvů článků vypadají většinou příšerně.

    Marek Prokop · 5531 days ago · #

  13. ok, diky za odpoved, mate asi pravdu – ja jsem jen moc liny a zvykly na vselike usnadneni (s cizim redakcnim systemem teprve zacinam, doted jsem pouzival svuj vlastni)

    Petr Vaclavek · 5531 days ago · #

  14. “Petře, url-title se musí psát ručně, což je dobže, protože URL generovaná automaticky z celých názvů článků vypadají většinou příšerne”

    Lenze ja nevidim nikde miesto, kde to urobit (som TP-lama, sorry) – kde rucne napisat to title, vo WordPresse na to bola kolonka, tu ju nevidim. Pri pisani clanku mam iba kolonku pre nazov. Neviete mi poradit, prosim?

    TOmáš Ulej · 5382 days ago · #

  15. Při psaní článku, v právem sloupci je (Rozšířené nastavení), po rozbalení nabídky je to poslední kolonka (Název do odkazů).

    Máte-li zájem, pak na http://ivorius.com/textpattern/ je textpattern rc 3 v češtině a s integrovaým texy. Dále pak také návod na zprovoznění, správu a instalaci textpatternu

    Ivorius · 5372 days ago · #

Commenting is closed for this article.