2012-12-04 13 views
19

Jestem zainteresowany problemami z siecią w Internecie pod numerem microtypography.Parsowanie kodu HTML w celu naprawienia problemów związanych z mikrotypologią i glifami

Chcę narzędziem naprawić:

  • Cytaty
    • „(& # 8220;) otwarcia cytat (zamiast„)
    • ”(& # 8221;) zamykający cudzysłów (zamiast „)
  • Apostrophe
    • ”(& # 8217;) apostrofu (zamiast„)
  • kreski i łączniki
    • - (& # 8211; lub & ndash;) en dash, używane dla zakresów, np. "13-15 listopada" (zamiast -)
    • - (& # 8212; lub & mdash;) em dash, używane do zmiany myśli, np. „Star Wars to, jak każdy wie, niesamowite.” (Zamiast - lub -)
  • Wielokropek
    • ... (& # 8230; lub & hellip;) pozioma elipsa, używany do wskazania pominięcie lub pauza (zamiast ...)
  • i bardziej \ o/

Wszystkie te poprawki zależą od języka treści. Na przykład w języku francuskim musimy dodać niezabezpieczoną przestrzeń (nie łamiąc) przed każdym skomponowanym glifem (:, ;, , ?, !, ...), a nasze cytaty są "podobne do tego".

Istnieje wiele ograniczeń dla takiego narzędzia:

  • nie może edytować dowolny kod HTML wewnątrz chronione Tagi (pre, code ...)
  • musi być szybka (stosowany na wyjściu CMS)
  • to nie może łamać HTML
  • i tak dalej.

Istnieją już pewne narzędzia na rynku:

Są one mniej lub bardziej oparte na omnibus, A 2005 lib, nie przetestowany, nieudokumentowany, parsujący HTML ręcznie i nie radzący sobie z innymi regułami niż angielski. Do diabła nie.

Więc moje pytania to:

  • Czy znasz godnej narzędzia jak to?
  • Jak mogę to zrobić? Mam już POC przy użyciu DomCrawler, ale nie jestem przekonany. Jaki jest najlepszy sposób analizowania i edytowania HTML w PHP?

Edit lipca 2013: Mam opracowane JoliTypo z badań i wiedzy zdobytych I z tym problemem. Żadna istniejąca biblioteka nie robiła tego, co chciałem.

+5

Świetne pytanie, chociaż zastanawiam się, czy to nie jest rzeczy, które lepiej byłoby przetwarzać w miejscu, w którym dane są zapisywane, a nie w punkcie, w którym są wysyłane?Zwłaszcza jeśli masz dużo tekstu (co jest najbardziej użyteczne), trudno wyobrazić sobie przetwarzanie w celu uzyskania szczegółów (np. Rozróżnienie między odpowiednim em i en dash) w sposób wystarczająco wydajny, aby wygrał " t drastycznie zwiększa czas ładowania strony. –

+3

@MichaelCSchuller To powinno być obsługiwane przez system IMO pamięci podręcznej. Wydaje mi się, że edytowanie treści nadesłanych przez użytkowników i utrzymywanie ich jest złym pomysłem, ponieważ nie ma możliwości odzyskania wersji z zapisanym typem. Przechowywanie zarówno tekstu użytkownika, jak i tekstu konwertowanego może być rozwiązaniem problemów związanych z wydajnością. – Damien

+1

Oczywiście wiąże się to z ryzykiem, że stosunek wyniku do danych wejściowych stanie się nieco nieprzejrzysty dla użytkownika wprowadzającego oryginalny tekst, ale przypuszczam, że jest to kwestia filozoficzna, a nie techniczna. Jednym z powodów, dla których uważam, że takie rzeczy jak Markdown są tak dobrym rozwiązaniem do formatowania wprowadzania tekstu, jest to, że dokładnie wiesz, jakie transformacje zostaną zastosowane (i jak można powiedzieć, odzyskasz oryginał po jego wprowadzeniu). –

Odpowiedz

8

Mój nieco przyjacielski Sean zbudował coś, czego używam do tego celu dość często. Można zobaczyć demo tutaj: http://files.seancoates.com/lexentity/ on napisał o nim tutaj: http://seancoates.com/blogs/lexentity i można pobrać tutaj źródło: https://github.com/scoates/lexentity

Może nie spotkać pełnych potrzeb językowych, ale to dopiero początek z angielskim.

+0

Bardzo dziękuję! Jest na githubie, są testy jednostkowe, jestem szczęśliwy. Ale parsowanie kodu HTML za pomocą wyrażeń regularnych przypomina mi ten wpis na blogu: http://www.codinghorror.com/blog/2009/11/parsing-html-the-cthulhu-way.html Będę uważać i spróbuj mimo to - ale to nie jest dla mnie kula odporna. – Damien

+1

Jak wskazuje artykuł, istnieje wiele prostych przypadków, w których używanie wyrażenia regularnego jest bardziej sensowne niż pełny mechanizm HTML. Kod w tym przypadku został zaprojektowany w taki sposób, aby zajmować się artykułami na ich stronie http://phpadvent.org. Twój szczególny przypadek, w którym chcesz go uruchomić w części treści wyjściowej CMS, wydaje się pasować. Ponadto: tylko rozwiązanie, które mam. – preinheimer

+0

Rozwiązania oparte na Regex stosowane na poziomie ciągu tekstowego to właściwe rozwiązanie. Thx za pomoc, Lexentity to najlepszy punkt wyjścia, jaki mogłem dostać. Ciesz się nagrodą ;-) – Damien

2

Możesz być zainteresowany tidy. Jest on ograniczony do PHP 5+ (wszystko czego potrzebujesz to libtidy). Nie tylko parsuje HTML, ale także je naprawia.

Ale z lokalizacją, jesteś sam - intl nie ma żadnych danych na temat ofert - np. .; przynajmniej nie mogłem ich znaleźć.

2

Co do cytatów przeczytaj ten Q tag, inni użyję biblioteki bbcode. Trudno byłoby napisać algorytm, aby odróżnić kreski. BBcode umożliwia edytorowi wybór, ale w takim przypadku, gdy edytor musi wykonać akcję Możesz pomyśleć o dodaniu 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 muszą być świadome lokalnie Tworzysz inny zestaw reguł dla różnych języków. Dziedziczenie obce w OOP przyda się tutaj.

2

Jak mówili inni, rozwiązanie oparte na regex może być niebezpieczne/zabronione ...

Ale jeśli masz blokady w dół na tego rodzaju treści, które chcą korzystać z tego narzędzia na (i brzmi tak jak robisz, jeśli treść pochodzi z twojego CMS), brzmi jak rozszerzenie programu Perl Demoroniser może zająć się tym dla ciebie: http://www.fourmilab.ch/webtools/demoroniser/