2012-12-04 30 views
19

Tôi quan tâm đến các vấn đề về microtypography trên web.Phân tích cú pháp HTML để khắc phục sự cố microtypography & glyph

Tôi muốn có một công cụ để sửa chữa:

  • Quotes
    • “(& # 8220;) mở quote (thay vì ")
    • ”(& # 8221;) bế mạc quote (thay vì ")
  • Apostrophe
    • ’(& # 8217;) dấu nháy đơn (thay vì ')
  • Dấu gạch ngang và Dấu nối
    • - (& # 8211; hoặc & ndash;) vi dấu gạch ngang, được sử dụng cho các phạm vi, ví dụ: “13–15 tháng 11” (thay vì -)
    • - (& # 8212; hoặc & mdash;) dấu gạch ngang, được sử dụng để thay đổi suy nghĩ, ví dụ: “Star Wars là-như mọi người đều biết, tuyệt vời.” (Thay vì - hoặc -)
  • Ellipsis
    • ... (& # 8230; hoặc & hellip;) ellipsis ngang, được sử dụng để chỉ ra một thiếu sót hoặc tạm dừng (thay vì ...)
  • Và hơn thế nữa \ o/

Tất cả những sửa chữa phụ thuộc vào ngôn ngữ nội dung. Ví dụ, trong tiếng Pháp, chúng ta phải thêm khoảng trắng không an toàn trước mỗi glyph được tạo (:, ;, , ?, !, ...) và báo giá của chúng tôi là «như thế này».

Có rất nhiều khó khăn đối với một công cụ như vậy:

  • nó không phải chỉnh sửa bất kỳ thẻ HTML được bảo vệ bên trong (pre, code ...)
  • nó phải được nhanh (sử dụng trên một đầu ra CMS)
  • không được ngắt HTML
  • v.v.

Hiện đã có một số công cụ trên thị trường:

Họ đều ít nhiều dựa trên thông thái, một lib 2005, không được kiểm tra, không được ghi chép, phân tích cú pháp HTML theo cách thủ công và không xử lý các quy tắc khác ngoài tiếng Anh. Trơi ơi không.

Vì vậy, câu hỏi của tôi là:

  • Bạn có biết của bất kỳ công cụ đàng hoàng như thế này?
  • Tôi có thể làm như thế nào? Tôi đã có một POC sử dụng DomCrawler nhưng tôi không thuyết phục. Cách tốt nhất để phân tích cú pháp và chỉnh sửa HTML bằng PHP là gì?

Sửa tháng 7 năm 2013: Tôi đã phát triển JoliTypo từ các cuộc thử nghiệm và chuyên môn tôi đã đạt được với vấn đề này. Không có lib nào đang làm những gì tôi muốn làm.

+5

Câu hỏi hay, mặc dù tôi tự hỏi nếu đây không phải là sắp xếp của điều nó sẽ là tốt hơn để xử lý tại thời điểm mà dữ liệu được lưu, chứ không phải là điểm mà nó là đầu ra?Đặc biệt là nếu bạn có nhiều văn bản (trường hợp này sẽ hữu ích nhất), thật khó để tưởng tượng việc xử lý để biết chi tiết (như phân biệt giữa cách sử dụng thích hợp và sử dụng dấu gạch ngang) theo cách đủ hiệu quả để chiến thắng ' t tăng đáng kể thời gian tải trang. –

+3

@MichaelCSchuller Điều này sẽ được xử lý bởi một hệ thống bộ nhớ cache IMO. Tôi nghĩ rằng việc chỉnh sửa nội dung do người dùng gửi và kiên trì đó là một ý tưởng tồi vì không có cách nào để lấy lại phiên bản loại được viết. Lưu trữ cả người dùng và văn bản được chuyển đổi có thể là giải pháp cho các vấn đề liên quan đến hiệu suất. – Damien

+1

Điều đó tất nhiên có nguy cơ làm cho mối quan hệ của đầu ra với đầu vào hơi mờ đối với người dùng đang nhập văn bản gốc, nhưng tôi cho rằng đó là một triết lý, chứ không phải là một câu hỏi kỹ thuật. Một lý do tại sao tôi nghĩ những thứ như Markdown là một giải pháp tốt để định dạng đầu vào văn bản là bạn biết chính xác những biến đổi nào sẽ được áp dụng (và bạn có thể lấy lại bản gốc khi được nhập, như bạn nói). –

Trả lời

8

Sean thân thiết của tôi đã tạo ra thứ gì đó mà tôi sử dụng cho mục đích này khá thường xuyên. Bạn có thể xem bản demo tại đây: http://files.seancoates.com/lexentity/ anh ấy viết blog về nó tại đây: http://seancoates.com/blogs/lexentity và bạn có thể lấy nguồn tại đây: https://github.com/scoates/lexentity

Nó có thể không đáp ứng được nhu cầu ngôn ngữ đầy đủ của bạn, nhưng đó là sự bắt đầu bằng tiếng Anh.

+0

Rất cảm ơn! Đó là trên github, có bài kiểm tra đơn vị, tôi hạnh phúc. Nhưng nó phân tích cú pháp HTML với các regex, và điều đó nhắc tôi nhớ đến bài đăng trên blog này: http://www.codinghorror.com/blog/2009/11/parsing-html-the-cthulhu-way.html Tôi sẽ xem xét và hãy thử nó anyway - nhưng điều đó không seams chống đạn cho tôi. – Damien

+1

Như bài viết chỉ ra, có rất nhiều trường hợp đơn giản khi sử dụng một cái gì đó giống như một biểu thức chính quy là hợp lý hơn so với một động cơ HTML đầy đủ thổi. Mã trong trường hợp đó được thiết kế để xử lý các bài viết cho trang web http://phpadvent.org của họ. Trường hợp cụ thể của bạn muốn chạy nó trên phần nội dung của đầu ra CMS có vẻ phù hợp. Ngoài ra: Chỉ có giải pháp tôi có. – preinheimer

+0

Các giải pháp dựa trên Regex được áp dụng ở cấp chuỗi văn bản là giải pháp đúng. Thx cho sự giúp đỡ, Lexentity là điểm khởi đầu tốt nhất tôi có thể nhận được. Hãy tận hưởng tiền thưởng ;-) – Damien

2

Bạn có thể quan tâm đến tidy. Nó được giới hạn với PHP 5+ (tất cả những gì bạn cần để sử dụng nó là libtidy). Nó không chỉ phân tích HTML, mà còn sửa chữa nó.

Nhưng với bản địa hóa, bạn đang sở hữu một mình - intl không có bất kỳ dữ liệu nào về dấu ngoặc kép - f.ex .; ít nhất tôi không thể tìm thấy chúng.

2

Về báo giá đọc số Q tag này, những người khác tôi sẽ sử dụng thư viện bbcode. Vì sẽ rất khó để viết thuật toán để phân biệt giữa các dấu gạch ngang mà bạn cần. BBcode cho phép trình soạn thảo để lựa chọn, nhưng trong trường hợp đó khi biên tập viên phải thực hiện một hành động Bạn có thể nghĩ đến việc cung cấp một số loại nút để chèn các ký tự đặc biệt. Đối với những thứ dễ nhận biết, Bạn chỉ cần tạo quy tắc mới cho BBcode lib và nếu chúng phải là nhận thức cục bộ Bạn sẽ tạo các quy tắc khác nhau cho các ngôn ngữ khác nhau. Thừa kế thừa kế trong OOP sẽ có ích ở đây.

2

Như những người khác đã nói, một giải pháp regex dựa trên có thể nguy hiểm/cấm ...

Nhưng nếu bạn có một ổ khóa xuống vào loại nội dung mà bạn muốn sử dụng công cụ này trên (và nó có vẻ giống như bạn làm nếu nội dung đến từ CMS của bạn), có vẻ như phần mở rộng của chương trình Perl Demoroniser có thể giải quyết vấn đề này cho bạn: http://www.fourmilab.ch/webtools/demoroniser/

Các vấn đề liên quan