Các động lực câu hỏi đã được mô tả trong phần dưới đây. Có rất nhiều cách để làm cho văn bản in nghiêng , vì vậy, có lẽ, có nhiều hơn một tốt " swap nghiêng thuật toán ". Vấn đề cho thấy một số yếu tố quảng cáo trong mã XHTML và sử dụng <i>
thẻ phải được cân bằng . Thí dụ:
<!-- original text: -->
<p id="p1"><i>Several more</i> Homo sapiens <i>fossils were discovered</i>.</p>
<!-- same text, swapping italics: -->
<p id="p2">Several more <i>Homo sapiens</i> fossils were discovered.</p>
Vì vậy, trông như thế này,
Một số hóa thạch Homo sapiens đã được phát hiện .
Một số hóa thạch Homo sapiens đã được phát hiện.
Giới thiệu và thảo luận về Algoritms
Đối với " giải pháp bố cục ", thuật toán đơn giản nhất là kiểm tra thuộc tính font-style
CSS của tất cả các khối văn bản và đảo ngược chúng bằng jQuery:
$('#myFragment *').each(function(){
if ($(this).css('font-style')=='italic')
$(this).css('font-style','normal')
else
$(this).css('font-style','italic')
});
Nhưng thuật toán này không tồn tại đến một thử nghiệm phức tạp hơn một chút,
<p id="p3"><b><i>F</i>RAGMENT <big><i>with italics</i> and </big> withOUT.</b></p>
Thuật toán đơn giản thứ hai là cho một giải pháp cụ thể và được sử dụng trong phần "Ví dụ". Có hai bước:
- gửi đoạn XHTML vào chữ nghiêng;
- nghịch mở / thẻ nghiêng gần (ví dụ.
</i>
đến<i>
).
Đó là, viết bằng Javascript,
var s = '... a fragment of XHTML content ...';
s = '<i>'+
s.replace(/<(\/?)i>/mg,
function (m,p1){
return p1? '<i>': '</i>';
}
) +
'</i>';
Nhưng cũng không tồn tại đến thử nghiệm thứ hai, mất cân bằng các thẻ ... Thuật toán "đã sửa" chạy (!), Nhưng không di động, không nhanh hay thanh lịch. Nó được trình bày ở đây , và ở phần ví dụ dưới đây.
Quan điểm!
Vì vậy, câu hỏi là
Có một thuật toán đơn giản, tốt và chung chung (có thể sử dụng trong bất kỳ trình duyệt nào và có thể chuyển sang ngôn ngữ khác) không? Bạn biết một "thuật toán in nghiêng" khác?
PS: "generic" theo nghĩa tôi thậm chí còn dịch thuật toán của bạn sang XSLT. Thuật toán phải tạo mã XHTML cân bằng trực tiếp (không có hộp đen trung gian như Tidy).
Động lực
Tôi cần chuyển "thuật toán in nghiêng" sang trình soạn thảo văn bản, trình phân tích cú pháp máy chủ, v.v. Trong mọi trường hợp tôi có thể "bình thường hóa đầu vào" (và đầu ra) bằng <i>
thẻ XHTML và thẻ tiêu chuẩn .
Tôi đang phân tích văn bản XHTML của sách văn xuôi và bài báo khoa học, được xuất từ các nguồn gốc và phong cách khác nhau ... Hầu hết các văn bản được xuất dưới dạng "văn bản bình thường", nhưng rất nhiều tiêu đề (ví dụ như tiêu đề bài viết, tiêu đề chương), và, đôi khi , một chương đầy đủ hoặc một hộp văn bản đầy đủ (ví dụ: tóm tắt bài viết) được cách điệu bằng chữ in nghiêng. Tất cả những "cách điệu với chữ nghiêng" phải được đảo ngược. Các trường hợp điển hình:
Chuyển đổi "tất cả các chữ in nghiêng" ban đầu thành "tất cả các chương văn bản thông thường": xem trường hợp này , trong một cuốn sách dài khoảng 300 trang, 8 trong số 25 chương cần phải được đảo ngược.
Dấu ngoặc kép in nghiêng, tóm tắt, vv Xem ví dụ này . Cần thay đổi trở lại bình thường, nhưng không mất các từ nhấn mạnh.
Viết tên nhị thức của các loài , trong các văn bản Khoa học, thường là kiểu chữ in nghiêng (hoặc đảo ngược, trong một phông chữ khác với chữ được sử dụng cho "văn bản bình thường"). Hàng trăm tiêu đề in nghiêng (của các bài báo và các phần bài viết) của các bài viết xuất XHTML phải được đảo ngược tại nơi làm việc của tôi. PS: xem ví dụ về phần đầu của câu hỏi ("Một số Homo sapiens nữa ...").
Tôi cũng cần dịch thuật toán chung (câu trả lời của bạn!) Sang thư viện XSLT , trong đó không tồn tại "hiệu chỉnh cân bằng thẻ".
Ví dụ
Triển khai trong Javascript và PHP một thuật toán "Hoán đổi chữ nghiêng" không chung chung . Một cái chung cần một "thuật toán xen kẽ XML" chung ... Ở đây tôi sử dụng các chỉnh sửa (DOM) và Tidy của trình duyệt, như là một cách thay thế cho "xen kẽ".
Javascript
Nó chạy với đầu vào phức tạp (!). Minh họa, bằng cách triển khai jQuery :
var s = $('#sample1').html(); // get original html text fragment
// INVERSION ALGORITHM: add and remove italics.
s = "<i>"+
s.replace(/<(\/?)i>/mg,
function (m,p1){
return p1? '<i>': '</i>';
}
) +
"</i>"; // a not-well-formed-XHTML, but it is ok...
$('#inverted').html(s); // ...the DOM do all rigth!
// minor corrections, for clean empties:
s = $('#inverted').html();
s = s.replace(/<([a-z]+)>(\s*)<\/\1>/mg,'$2'); // clean
s = s.replace(/<([a-z]+)>(\s*)<\/\1>/mg,'$2'); // clean remain
$('#inverted').html(s);
// END ALGORITHM
alert(s);
PHP, với Tidy
Tương tự Javascript, "được dịch" sang PHP - bản dịch tự nhiên đang sử dụng DOMDocument()
lớp và loadHTML
/ saveXML
phương thức, nhưng những gì có cùng hành vi so với các phóng viên của trình duyệt là tidy
lớp . Hiển thị kết quả tương tự (!)
$sample1='<b><i>O</i>RIGINAL <big><i>with italics</i> and </big> withOUT</b>';
$inverted = '... inverted will be here ...';
echo $sample1;
// Tidy correction
$s = $sample1; // get original html text fragment
// INVERSION ALGORITHM: add and remove italics.
$s = "<i>".
preg_replace_callback('/<(\/?)i>/s', function ($m){
return $m[1]? '<i>': '</i>';}, $s) .
"</i>"; // a not-well-formed-XHTML, but it is ok...
$config = array('show-body-only'=>true,'output-xhtml'=>true);
$tidy = new tidy;
$tidy->parseString($s, $config, 'utf8');
$s = $tidy; // ... because Tidy corrects!
// minor corrections, for clean empties:
$s = preg_replace('/<([a-z]+)>(\s*)<\/\1>/s', '$2', $s); // clean
$s = preg_replace('/<([a-z]+)>(\s*)<\/\1>/s', '$2', $s); // clean remain
// END ALGORITHM
echo "\n\n$s";