Parsing HTML to fix microtypography & Gliph issues
Jestem zainteresowanymikrotypografią zagadnieniami w sieci.
Chcę narzędzie do naprawy:
- Cytaty
- " ( ") cytat otwierający (zamiast")
- " ( ") cytat zamykający (zamiast")
- apostrof
- " ( ") apostrof (zamiast")
- myślniki i myślniki
-
{–14]} – (- lub -) EN dash, używany dla zakresów, np. "13-15 listopada" (zamiast -)
- - (- lub -) em dash, używany do zmiany myśli, np. " Gwiezdne Wojny są-jak każdy wie-niesamowite."(zamiast -, lub --)
- ... (... lub ...) elipsa pozioma, używana do wskazania pominięcia lub pauzy (zamiast ...)
Wszystkie te poprawki zależą od języka zawartości. Na przykład w języku francuskim musimy dodać niepewną (niełamliwą) spację przed każdym złożonym glifem (:
, ;
, …
, ?
, !
, ...), a nasze cytaty są " jak to ".
- nie może edytować żadnego HTML wewnątrz chronionych tagów (
pre
,code
...)
To musi być szybkie (używane na wyjściu CMS)
- nie może złamać HTML
- i tak dalej.
Są już pewne narzędzia na Rynek:
- http://michelf.ca/projects/php-smartypants/typographer/
- http://kingdesk.com/projects/php-typography/
- http://code.google.com/p/typogrify/
Wszystkie są mniej więcej oparte na SmartyPants, lib z 2005 roku, nie testowane, nie udokumentowane, parsowanie HTML ręcznie i nie radzenie sobie z innymi zasadami niż Angielski. Nie ma mowy.
Więc moje pytania to:
- Czy znasz jakieś porządne narzędzie jak to?
- Jak mogę to zrobić? Mam już POC używającego DomCrawler , ale nie jestem przekonany. Jak najlepiej parsować i edytować HTML w PHP?
Edycja lipiec 2013: opracowałem JoliTypo z testów i wiedzy, którą zdobyłem w tym problemie. Żadna Lib nie robiła tego, co chciałem.
4 answers
Mój w pewnym sensie przyjaciel Sean zbudował coś, czego używam do tego celu dość często. Demo można obejrzeć tutaj: http://files.seancoates.com/lexentity / napisał o tym tutaj: http://seancoates.com/blogs/lexentity i możesz pobrać źródło tutaj: https://github.com/scoates/lexentity
Może nie zaspokoi Twoich potrzeb językowych, ale zacznij od angielskiego.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-19 23:41:40
Być może zainteresuje cię tidy . Jest on związany z PHP 5+ (wszystko, czego potrzebujesz, to libtidy). Nie tylko parsuje HTML, ale także go naprawia.
Ale z lokalizacją jesteś zdany na siebie- intl nie ma żadnych danych o cudzysłowach - f.ex.; przynajmniej nie mogłem ich znaleźć.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-10 23:12:06
Co do cudzysłowów przeczytaj ten Q tag , inne użyłbym biblioteki bbcode. Ponieważ byłoby to naprawdę trudne do napisania algorytmu rozróżniania kresek, których potrzebujesz. BBcode pozwala edytorowi wybrać, ale w takim przypadku, gdy edytor musi wykonać akcję, możesz pomyśleć o udostępnieniu jakiegoś przycisku do wstawiania znaków specjalnych. Dla rzeczy, które są łatwe do rozpoznania, po prostu tworzysz nowe reguły dla BBCode lib i jeśli mają być lokalne, utworzysz inny zestaw reguł dla różne języki. Oczywiście dziedziczenie w OOP przydałoby się tutaj.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-10 23:44:49
Jak powiedzieli inni, rozwiązanie oparte na regex może być niebezpieczne/zabronione...
Ale jeśli masz blokadę tego rodzaju treści ,na których chcesz użyć tego narzędzia (i brzmi to tak, jak robisz, jeśli zawartość pochodzi z twojego CMS), brzmi to tak, jakby rozszerzenie do programu Perl Demoroniser mogło się tym zająć: http://www.fourmilab.ch/webtools/demoroniser/
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-12 22:57:37