Обернуть текст в элемент, используя xforms
Есть ли способ обернуть отмеченный текст в элемент, используя xforms? Например:
Поместите тег вокруг этого word
-> Поместите тег вокруг этого <tag>
слово </tag>
Я новичок в xforms, в настоящее время использую Xsltxforms на сервере exist-db, и я пытаюсь выяснить, пропустил ли я что-то или нет способа сделать такую вещь в поле textarea, например. Заранее спасибо!
2 ответа
В Рекомендации XForms нет механизма для такой обработки.
Но это было добавлено как расширение в XSLTForms: дополнительное действие с именем "xf:wrap" позволяет указать с помощью элемента управления, который следует учитывать, и что следует добавить до и после выбора.
<?xml-stylesheet href="xsl/xsltforms.xsl" type="text/xsl"?>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:xf="http://www.w3.org/2002/xforms" xmlns:ev="http://www.w3.org/2001/xml-events">
<head>
<title>Wrap Selection</title>
<xf:model>
<xf:instance>
<data xmlns="">Sed ut perspiciatis, unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt, explicabo.</data>
</xf:instance>
</xf:model>
</head>
<body>
<xf:trigger>
<xf:label><a></xf:label>
<xf:wrap ev:event="DOMActivate" control="t" pre="<a>" post="</a>"/>
</xf:trigger>
<xf:trigger>
<xf:label><b></xf:label>
<xf:wrap ev:event="DOMActivate" control="t" pre="<b>" post="</b>"/>
</xf:trigger>
<xf:trigger>
<xf:label><c></xf:label>
<xf:wrap ev:event="DOMActivate" control="t" pre="<c>" post="</c>"/>
</xf:trigger>
<br/>
<xf:textarea id="t" ref="." incremental="true"/>
<br/>
<xf:output value=".">
<xf:label>Value: </xf:label>
</xf:output>
</body>
</html>
Есть еще одна возможность с действием xf: setselection:
<?xml-stylesheet href="xsl/xsltforms.xsl" type="text/xsl"?>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:xf="http://www.w3.org/2002/xforms" xmlns:ev="http://www.w3.org/2001/xml-events">
<head>
<title>Set Selection</title>
<xf:model>
<xf:instance>
<data xmlns="">Sed ut perspiciatis, unde omnis iste natus error sit voluptatem accusantium doloremque laudantium...</data>
</xf:instance>
</xf:model>
</head>
<body>
<xf:trigger>
<xf:label><span></xf:label>
<xf:setselection ev:event="DOMActivate" control="t" value="concat('<span start="', control-property('t', 'selectionStart'), '" end="', control-property('t', 'selectionEnd'), '">', selection('t'), '</span>')"/>
</xf:trigger>
<br/>
<xf:textarea id="t" ref="." incremental="true"/>
<br/>
<xf:output value=".">
<xf:label>Value: </xf:label>
</xf:output>
</body>
</html>
Демонстрационная версия: http://www.agencexml.com/direct/wrap/setselection.xml
Как вы думаете?
Исправленный ответ: Некоторые возможные решения - это интегрировать библиотеку, такую как Rangy ( https://github.com/timdown/rangy), в XSLTForms или даже текстовый редактор, такой как TinyMCE (который XSLTForms делает в этом примере: http://www.agencexml.com/xsltforms/tinymce.xml). Другой вариант - взглянуть на Teian ( https://sourceforge.net/projects/teian/), который разработан для TEI, но может стать шагом в правильном направлении.