質問の動機は、以下のセクションに描かれています。テキストをイタリックにする方法はたくさんあるので、おそらく、「イタリックスワップアルゴリズム」は複数あるでしょう。この問題は、XHTMLコードの追加の難しさ、および<i>
タグの使用を明らかにします。例:
<!-- 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>
このように見えます
さらにいくつかのヒトの化石が発見されました。
さらにいくつかのヒトの化石が発見されました。
アルゴリズムの紹介と議論
「レイアウトソリューション」の場合、最も簡単なアルゴリズムはfont-style
、すべてのテキストブロックのCSSプロパティをチェックし、jQueryで反転します。
$('#myFragment *').each(function(){
if ($(this).css('font-style')=='italic')
$(this).css('font-style','normal')
else
$(this).css('font-style','italic')
});
しかし、このアルゴリズムはもう少し複雑なテストには耐えられません。
<p id="p3"><b><i>F</i>RAGMENT <big><i>with italics</i> and </big> withOUT.</b></p>
2番目に単純なアルゴリズムは具体的なソリューションであり、「例」セクションで使用されました。2つのステップがあります。
- XHTMLフラグメントをイタリック体で囲みます。
- イタリックタグの開閉を反転します(例:
</i>
から<i>
)。
つまり、Javascriptで書く、
var s = '... a fragment of XHTML content ...';
s = '<i>'+
s.replace(/<(\/?)i>/mg,
function (m,p1){
return p1? '<i>': '</i>';
}
) +
'</i>';
しかし、タグのバランスを失い、2番目のテストにも耐えられません...「修正された」アルゴリズムは実行されますが(!)、移植性がなく、高速でもエレガントでもありません。それは 、ここでdemonstred、および以下の例のセクションで。
ポイント!
だから問題は、
シンプルで優れた一般的な(任意のブラウザーで使用可能で、他の言語に移植可能な)アルゴリズムはありますか? あなたは別の「スワップイタリックアルゴリズム」を知っていますか?
PS:私があなたのアルゴリズムをXSLTに変換するという意味での「一般的な」。アルゴリズムは、直接バランスのとれたXHTMLコードを生成する必要があります(Tidyのような中間ブラックボックスなしで)。
動機
「イタリックスワップアルゴリズム」をテキストエディター、サーバーパーサーなどに移植する必要があります。すべてのケースで、標準のXHTMLと<i>
タグによって「入力(および出力)を正規化」できます。
散文の本や科学記事のXHTMLテキストを解析しています。さまざまな出所やスタイルからエクスポートされています...ほとんどのテキストは「通常のテキスト」としてエクスポートされますが、タイトル(例:記事のタイトル、章のタイトル)が多く、場合によっては、完全な章または完全なテキストボックス(記事の要約など)は、イタリック体で様式化されています。これらの「イタリック体で様式化された」すべてを逆にする必要があります。典型的なケース:
元の「すべての章の斜体」を「すべての章の通常のテキスト」に変換します。このケースを参照してください。約300ページの本では、25の章のうち8つの章を反転する必要があります。
斜体の引用符、要約など。この例を参照してください。通常に戻す必要がありますが、強調の言葉を失うことはありません。
ライティング種の二項名前を、科学的な文章で、通常(「通常のテキスト」のために使用されたものからフォント異なる中で、または反転)、イタリックでタイプセットされています。XHTMLでエクスポートされた記事の(記事および記事セクションの)イタリック体の何百ものタイトルを私の職場で反転させる必要があります。PS:質問の冒頭の例を参照してください(「さらにいくつかのホモサピエンス ...」)。
(答えの)汎用アルゴリズムをXSLTライブラリに変換する必要もあります。この場合、「タグバランシング修正」は存在しません。
例
JavaScriptとPHPで非一般的な「スワップイタリックアルゴリズム」を実装します。一般的なものには、一般的な「XMLインターリーブアルゴリズム」が必要です...ここでは、「インターリーブ」の代わりに、ブラウザー(DOM)とTidyの修正を使用しています。
Javascript
複雑な入力(!)で実行されます。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、Tidy
PHPに「変換」されたJavascriptと同じ—自然な変換はDOMDocument()
クラスとloadHTML
/ saveXML
メソッドを使用しますが、ブラウザの対応するものと同じ動作をするのはtidy
クラスです。同じ結果を表示します(!)
$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";