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 --)
  • Elipsa
    • ... (... lub ...) elipsa pozioma, używana do wskazania pominięcia lub pauzy (zamiast ...)
  • i więcej \o /
  • 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 ".

    Istnieje wiele ograniczeń dla takiego narzędzia:]}
    • 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:

    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.

    Author: Damien, 2012-12-04

    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.

     8
    Author: preinheimer,
    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źć.

     2
    Author: pozs,
    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.

     2
    Author: Gustek,
    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/

     2
    Author: uptownnickbrown,
    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