ArkML/Реализации кодеков

Материал из ARK Wiki
Перейти к навигации Перейти к поиску

Преобразование в 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, '&#xA;'))">
        <xsl:copy-of select="$str"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="substring-before($str, '&#xA;')"/>
        <br />
        <xsl:call-template name="br">
          <xsl:with-param name="str" select="substring-after($str, '&#xA;')"/>
        </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'&#x26;') + b"</span>", features="xml")[0])

А затем вы можете преобразовать его обратно в байт/строку:

print(b''.join([etree.tostring(c) for c in htmlspan.getroot().iterdescendants()]))