ArkML/Implémentations Codec

De ARK Wiki
Aller à la navigation Aller à la recherche

Conversion en HTML

La conversion en HTML facilite l'affichage d'ArkML sur des moteurs de rendu HTML, tels qu'un Webkit intégré ou MozEmbed.

XSLT 1.0

XSLT est un langage de transformation XML universel, et doit être utilisé dans tous les environnements de programmation en faveur des transformations procédurales spécifiques au langage.

Aucune fonctionnalité XSLT 2.0 n'est requise pour cette transformation.

Remarque: XSLT fonctionne uniquement sur XML. Vous devez d'abord convertir le SGML en XML - ce qui est généralement un processus simple. Pour les environnements de ligne de commande, voir l'utilitaire "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 utilisant LXML et BeautifulSoup

Vous aurez besoin de deux packages PyPI: lxml et beautifulsoup4.

Nous devons d'abord créer le transformateur XSLT pour éviter de le créer à chaque fois que nous analysons ArkML. "xsltstr" est une chaîne (ou des octets) contenant le code XSLT ci-dessus.

from lxml import etree
transform = etree.XSLT(etree.fromstring(xsltstr))

Maintenant, nous analysons les données ArkML. "arkmlstr" est une chaîne (ou des octets) contenant les données ArkML d'entrée. L'entrée doit être enveloppée dans des éléments span car XSLT ne fonctionne que sur des documents XML (les API qui vous permettent d'appliquer des transformations XSLT sur des fragments XML ajoutent secrètement un document rien autour du fragment, mais en python, cela se fait explicitement). La sortie ("htmlspan") sera un objet LXML contenant un élément HTML span. Ce code analyse généralement SGML en choisissant automatiquement tout analyseur SGML disponible installé dans l'installation de Python.

from lxml.html import soupparser
htmlspan = transform(soupparser.fromstring(b"<span>" + arkmlstr.replace(b'&', b'&#x26;') + b"</span>", features="xml")[0])

Et puis vous pouvez le reconvertir en octets / chaîne:

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