Я хочу взять HTML-код, сгенерированный редактором QTextEdit, и преобразовать его во что-то более дружественное для использования на реальной веб-странице.К сожалению, генератор HTML, который является частью API QTextEdit, не является общедоступным и не может быть изменен.Я бы предпочел не создавать WYSIWYG html-редактор, когда у меня есть большая часть того, что мне нужно встроить.
В кратком обсуждении списка рассылки qt-Interest, кто-то упомянул об использовании XQuery через модуль QtXmlPatterns.
Для примера уродливого 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% пути туда, где я должен быть.Я могу правильно преобразовать первые 4, где каждый элемент стиля <span>
имеет только один из атрибутов курсив, полужирный или подчеркивание.У меня проблемы, когда у стиля span есть несколько атрибутов.Например, если у стиля span есть и font-weight:600
, и text-decoration: underline
.
Вот мой код XQuery, который у меня есть на данный момент:
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>
, который дает ALMOST правильный результат:
<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!