QTextEditエディタで生成されたHTMLを実際のWebページで使用するために少しフレンドリーに変換したいと思っています。残念ながら、QTextEdit APIの一部であるHTMLジェネレータはパブリックではなく、変更することはできません。XQueryでHTMLを変換する
qt-interestメーリングリストに関する簡単な議論で、誰かがQtXmlPatternsモジュールを介してXQueryを使って言及しました。
を醜いHTMLエディタ出力の例については、それは、太字テキストの<span style=" font-weight:600">
を使用して大胆ため<span style=" font-weight:600; text-decoration: underline">
とテキストに下線を引くなどここのサンプルです:
<html>
<head>
</head>
<body style=" font-family:'Lucida Grande'; font-size:14pt; font-weight:400; font-style:normal;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">plain text</p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">plain text <span style=" font-weight:600;">bold text</span></p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:600;"></p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">plain text <span style=" font-style:italic;">italics text</span></p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-style:italic;"></p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">plain text <span style=" text-decoration: underline;">underline text</span></p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">plain text <span style=" font-weight:600; text-decoration: underline;">bold underline text</span></p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">plain text <span style=" font-weight:600;">bold text </span><span style=" font-weight:600; text-decoration: underline;">bold underline text</span></p>
</body>
</html>
私はこれを変換したいのですがどのようなこの行に沿って何かがあります。
<body>
<p>plain text</p>
<p/>
<p>plain text <b>bold text</b></p>
<p/>
<p>plain text <em>italics text</em></p>
<p/>
<p>plain text <u>underline text</u></p>
<p/>
<p>plain text <b>bold text <u>bold underline text</u></b></p>
</body>
私は、必要な場所の90%近くを得ています。各<span>
スタイルメンバーが斜体、太字、または下線のいずれかの属性しか持たない最初の4つを正しく変換できます。スパンスタイルに複数の属性がある場合、私は問題を抱えています。たとえば、スパンスタイルにfont-weight:600
とtext-decoration: underline
の両方が含まれているとします。
は、ここで私はこれまで持っている私のXQueryコードです:
ALMOST正しい結果を与えるdeclare function local:process_span_data($node as node())
{
for $n in $node
return (
for $attr in $n/@style
return (
if(contains($attr, 'font-weight:600')) then (
<b>{data($n)}</b>
)
else if(contains($attr, 'text-decoration: underline')) then (
<u>{data($n)}</u>
)
else if (contains($attr, 'font-style:italic')) then (
<em>{data($n)}</em>
)
else (
data($n)
)
)
)
};
declare function local:process_p_data($data as node()+)
{
for $d in $data
return (
if ($d instance of text()) then $d
else local:process_span_data($d)
)
};
let $doc := doc('myfile.html')
for $body in $doc/html/body
return
<body>
{
for $p in $body/p
return (
if (contains($p/@style, '-qt-paragraph-type:empty;')) then (
<p />
)
else (
if (count($p/*) = 0) then (
<p>{data($p)}</p>
)
else (
<p>
{for $data in $p/node()
return local:process_p_data($data)}
</p>
)
)
)
}</body>
:
<body>
<p>plain text</p>
<p/>
<p>plain text <b>bold text</b>
</p>
<p/>
<p>plain text <em>italics text</em>
</p>
<p/>
<p>plain text <u>underline text</u>
</p>
<p/>
<p>plain text <b>bold underline text</b>
</p>
<p>plain text <b>bold text </b>
<b>bold underline text</b> <!-- NOT UNDERLINED!! -->
</p>
</body>
誰もが自分の所望の出力を達成するための正しい方向に私を指すことができます? XQuery n00bから事前に感謝します!
私は、XQueryが何であるか分からないが、問題は、一度コードかどうかをチェックするということです要素はスタイルを持ち、値を返します。要素のすべての値をチェックしてからそれを返す必要があります。 – JCOC611
これにXSLTを使用しないことを決定するには、むしろマゾヒスティックでなければなりません。 XSLTソリューションは些細なことであり、書き込むのに2分しかかかりません。 :) –
XSLTについて何も知らない人のために書くのにどれくらい時間がかかりますか? –