ArkML/Реализации кодеков
Преобразование в HTML
Преобразование в HTML упрощает отображение ArkML в средствах визуализации на основе HTML, таких как встроенный Webkit или MozEmbed.
XSLT 1.0
XSLT является универсальным языком преобразования XML, и его следует использовать во всех средах программирования в пользу процедурных преобразований, специфичных для языка.
Для этого преобразования не требуется никаких функций XSLT 2.0.
Примечание. XSLT работает только с XML. Вы должны сначала преобразовать SGML в XML - что, как правило, является простым процессом. Для сред командной строки см. утилиту "osx".
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="yes"/> <xsl:template match="@* | node()"> <xsl:copy> <xsl:apply-templates select="@* | node()"/> </xsl:copy> </xsl:template> <xsl:template match="RichColor"> <span> <xsl:apply-templates select="@* | node()"/> </span> </xsl:template> <xsl:template match="RichColor/@Color"> <xsl:attribute name="style"> <xsl:value-of select="concat( 'color: rgba(', round(substring-before(., ',') * 255), ', ', round(substring-before(substring-after(., ','), ',') * 255), ', ', round(substring-before(substring-after(substring-after(., ','), ','), ',') * 255), ', ', substring-after(substring-after(substring-after(., ','), ','), ',') * 1, ');' )"/> </xsl:attribute> </xsl:template> <xsl:template match="text()" name="br"> <xsl:param name="str" select="."/> <xsl:choose> <xsl:when test="not(contains($str, '
'))"> <xsl:copy-of select="$str"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="substring-before($str, '
')"/> <br /> <xsl:call-template name="br"> <xsl:with-param name="str" select="substring-after($str, '
')"/> </xsl:call-template> </xsl:otherwise> </xsl:choose> </xsl:template> </xsl:stylesheet>
Python 3 с использованием LXML и BeautifulSoup
Вам понадобятся два пакета PyPI: lxml и beautifulsoup4.
Сначала нам нужно создать преобразователь XSLT, чтобы не создавать его каждый раз, когда мы анализируем ArkML. «xsltstr» — это строка (или байты), содержащая указанный выше код XSLT.
from lxml import etree transform = etree.XSLT(etree.fromstring(xsltstr))
Теперь мы анализируем данные ArkML. "arkmlstr" - это строка (или байты), содержащая входные данные ArkML. Входные данные должны быть обернуты в элементы span, поскольку XSLT работает только с XML-документами (API, которые позволяют применять преобразования XSLT к фрагментам XML, тайно добавляют документ nothing вокруг фрагмента, но в python это делается явно). Выходные данные ("htmlspan") будут представлять собой объект LXML, содержащий элемент HTML span. Этот код обычно выполняет синтаксический анализ SGML, автоматически выбирая любой доступный анализатор SGML, установленный в установке Python.
from lxml.html import soupparser htmlspan = transform(soupparser.fromstring(b"<span>" + arkmlstr.replace(b'&', b'&') + b"</span>", features="xml")[0])
А затем вы можете преобразовать его обратно в байт/строку:
print(b''.join([etree.tostring(c) for c in htmlspan.getroot().iterdescendants()]))