FatturaElettronica Styling

Reader for the Italian Electronic Invoice (Fattura Elettronica) xml files

// ==UserScript==
// @name FatturaElettronica Styling
// @description Reader for the Italian Electronic Invoice (Fattura Elettronica) xml files
// @namespace 3v1n0.net
// @version 0.6
// @include /^[A-z0-9]+:\/\/.*\/(IT([0-9]{11}|[0-9A-z]{11,16})|[A-Z]{2}[0-9A-z]{2,28})_[0-9A-z]{5}(_(RC|NS|MC|MT|EC|SE|NE|DT|AT)__?[0-9]{3})?\.xml(\.p7m)?$/
// @include /^[A-z0-9]+:\/\/.*\/Canonical Invoice.*\.xml$/
// @inject-into auto
//
// @grant GM_getResourceText
// @resource sdi_ordinaria https://www.fatturapa.gov.it/export/documenti/fatturapa/v1.2/fatturaordinaria_v1.2.xsl
// @resource aruba_ordinaria https://webmail.pec.it/fatturapa/xsl/aruba/fatturapa_vFPR12.xsl?_v_=1.3
// @resource asso_software_ordinaria http://dev.3v1n0.net/scripts/unzip-remote-xsl.php?file=http://www.assosoftware.it/allegati/assoinvoice/FoglioStileAssoSoftware.zip
// @resource ricevuta_RC https://www.agenziaentrate.gov.it/portale/documents/20143/288192/RC_v1.1_RC_v1.1.xsl
// @resource ricevuta_NS https://www.agenziaentrate.gov.it/portale/documents/20143/288192/ST+Fatturazione+elettronica+-+ITHVQWPH73P42H501Y+00022+NS_001_ITHVQWPH73P42H501Y_00022_NS_001.xml
// @resource ricevuta_MC https://www.agenziaentrate.gov.it/portale/documents/20143/288192/ST+Fatturazione+elettronica+-+ITHVQWPH73P42H501Y+00022+MC_001_ITHVQWPH73P42H501Y_00022_MC_001.xml
// @resource ricevuta_MT https://www.agenziaentrate.gov.it/portale/documents/20143/288192/ST+Fatturazione+elettronica+-+ITHVQWPH73P42H501Y_00022_MT_001_ITHVQWPH73P42H501Y_00022_MT_001.xml
// @resource ricevuta_EC https://raw.githubusercontent.com/link-it/govfat/master/web/commons/src/main/resources/xsl/EC_v1.0.xsl
// @resource ricevuta_SE https://raw.githubusercontent.com/link-it/govfat/master/web/commons/src/main/resources/xsl/SE_v1.0.xsl
// @resource ricevuta_NE https://raw.githubusercontent.com/link-it/govfat/master/web/commons/src/main/resources/xsl/NE_v1.0.xsl
// @resource ricevuta_DT https://raw.githubusercontent.com/link-it/govfat/master/web/commons/src/main/resources/xsl/DT_v1.0.xsl
// @resource ricevuta_AT https://raw.githubusercontent.com/link-it/govfat/master/web/commons/src/main/resources/xsl/AT_v1.1.xsl
// ==/UserScript==

// Tests at https://www.agenziaentrate.gov.it/wps/content/Nsilib/Nsi/Schede/Comunicazioni/Fatture+e+corrispettivi/Fatture+e+corrispettivi+ST/ST+invio+di+fatturazione+elettronica/?page=schedecomunicazioni
//          https://www.fatturapa.gov.it/export/fatturazione/it/a-3.htm
//          https://www.fatturapa.gov.it/export/fatturazione/it/normativa/f-3.htm

let xslStyle = 'aruba'; // Valid values: aruba, asso_software, sdi

function getXslSource(xslType) {
    let text = GM_getResourceText(xslType);
    if (text.charCodeAt(0) === 0xFEFF)
        return text.substr(1);
    return text;
}

let xmlSource = document;
let webkitViewer = document.getElementById('webkit-xml-viewer-source-xml');

if (webkitViewer) {
    xmlSource = new DOMParser().parseFromString(webkitViewer.innerHTML, 'text/xml');
    xslStyle = 'sdi';
}

let xslType = `${xslStyle}_ordinaria`;

let matchSubType = document.location.toString().match(/_(RC|NS|MC|MT|EC|SE|NE|DT|AT)__?[0-9]{3}?\.xml/);
if (matchSubType)
    xslType = `ricevuta_${matchSubType[1]}`

const xslSource = getXslSource(xslType);

if (!xslSource || !xslSource.length)
    throw new Error('Invalid XSL URI provided')

if (!matchSubType) {
    let fattura = xmlSource.getElementsByTagNameNS(
        'http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2',
        'FatturaElettronica');

    if (!fattura.length)
        throw new Error('FatturaElettronica tag is missing from XML');
}

let xsl = new DOMParser().parseFromString(xslSource, 'text/xml');
let parseError = xsl.getElementsByTagName('parsererror');
if (parseError.length > 0)
    throw new Error(`Can't parse the XSL file: ${parseError[0].innerText}`);

try {
    let xsltProcessor = new XSLTProcessor();
    xsltProcessor.importStylesheet(xsl);

    if (webkitViewer) {
        var nodeDocType = document.implementation.createDocumentType(
            'html',
            '-//W3C//DTD XHTML 1.0 Transitional//EN',
            'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtdd'
        );
        document.insertBefore(nodeDocType, document.childNodes[0]);
    }

    let newContent = xsltProcessor.transformToDocument(xmlSource);
    document.replaceChild(
        document.importNode(newContent.documentElement, true),
        document.documentElement);
/**/
} catch (e) {
    throw new Error(`Impmossible to import stylesheet: ${e}`);
}