A classe de objeto Elemento contém o layout de processamento especializado sobre os objetos no vetor apontado pela variável listaElementos declarada no arquivo tpp-lista-elementos.js.

Cada objeto Elemento instanciado corresponde a um objeto do vetor listaElementos

{ 
  record: {
    recordType: "AtomicNumber",
    recordNumber: 1,
    recordTitle: "Hydrogen",
    section: [
      {
        tocHeading: "Identifiers",
        description: "Element names and identifiers, inluding atomic symbol, InChI string and InChI key.",
        section: [
          {
            tocHeading: "Element Name",
            description: "Element name refers to a formal name for a given elemnt originating from factors such as common usage and the person or place involved in its discovery. Element, also called chemical element, refers to a species of atoms; all atoms with the same number of protons in the atomic nucleus.",
            url: "https://goldbook.iupac.org/html/C/C01022.html",
            information: [
              {
                referenceNumber: 1,
                name: "Element Name",
                value: {
                  stringWithMarkup: [
                    {
                      string: "Hydrogen"
                    }
                  ]
                }
              },
...

 O objeto Elemento pode ser instanciado com o comando new.

var instancia = new Elemento();

Os objetos do vetor listaElementos são aqueles convertidos a partir dos objetos json obtidos do Pubchem.

function Elemento(recordPubchem) {
   this.record = recordPubchem;
   this.section = this.record.section;
}

No exemplo a seguir o objeto h carrega os dados do objeto de dados do hidrogênio disponíveis no primeiro índice do vetor listaElementos.

var h = new Elemento(listaElementos[0].record);

O objeto record contém os dados do hidrogênio no vetor listaElementos, e que serão processados pelo objeto Elemento instanciado em h.

A função item implementa a instanciação dinâmica dos objetos utilizados pelos objetos da classe Elemento. Nenhum objeto referido na classe Elemento é inicialmente instanciado enquanto não é utilizado. Os objetos são instanciados no momento em que são referidos pela primeira vez.

Elemento.prototype.item = function(nomeVar,vetor,nomeChave,valorChave) {
   if (!this[nomeVar]) {
      this[nomeVar] = vetor.find(s => s[nomeChave] === valorChave);
   }
   return this[nomeVar];
}

No primeiro nível de record do objeto Elemento tempos as propriedades recordType, recordNumber, recordTitle e section.

O vetor section (de record) contém as seções de primeiro nível de dados do  elemento, que neste nível são 7: Identifiers, Properties, History, Uses, Sources, Compounds, Element Forms e Isotopes.

Elemento.prototype.itemPrimSec = function(nomeVarPrimSecao,chavePrimSecao) {
	return this.item(nomeVarPrimSecao,this.record.section,"tocHeading",chavePrimSecao);
}

Esta função é utilizada por sete funções correspondentes às seções de primeiro nível de record: iden(), prop(), hist(), usos(), orig(), comp() e isot().

Elemento.prototype.iden = function() {
   return this.itemPrimSec("_iden","Identifiers");
}

Elemento.prototype.prop = function() {
   return this.itemPrimSec("_prop","Properties");
}

Elemento.prototype.hist = function() {
   return this.item("_hist","History");
}

Elemento.prototype.usos = function() {
   return this.item("_usos","Uses");
}

Elemento.prototype.orig = function() {
   return this.item("_orig","tocHeading","Source");
}

Elemento.prototype.comp = function() {
   return this.item("_comp","tocHeading","Compounds");
}

Elemento.prototype.isot = function() {
   return this.item("_isot","tocHeading","Isotopes");
}

As seções de segundo nível são aquelas internas às seções de primeiro nível.

A função itemSegSecao() recebe como parâmetros:

 

  • O nome da função de primeiro nível nomeFuncPrimNivel;
  • o nome da variável de instanciação nomeVarSegNivel ;
  • a chave de localização do objeto da seção de segundo nível no vetor de seções de segundo nível do objeto de primeiro nível.
Elemento.prototype.itemSegSecao = function(nomeFuncPrimSecao,nomeVarSegSecao,chaveSegSecao) {
   var primSecao = this[nomeFuncPrimSecao]();
   return this.item(nomeVarSegSecao,primSecao.section,"tocHeading",chaveSegSecao);
}

Finalmente em cada seção de segundo nível temos um vetor de informações information.

A função itemSegSecao() recebe como parâmetros:

  • O nome da função de primeiro nível nomeFuncPrimNivel;
  • o nome da variável de instanciação nomeVarSegNivel ;
  • a chave de localização do objeto da seção de segundo nível no vetor de seções de segundo nível do objeto de primeiro nível;
  • o nome da variável de instanciação do objeto de informação nomeInfo;
  • o campo de busca campoBusca do objeto no vetor information a ser localizado e utilizado;
  • o valor valorBusca utilizado pelo campo de busca campoBusca
Elemento.prototype.itemInfo = function(nomeFuncPrimSecao,nomeVarSegSecao,chaveSegSecao,nomeVarInfo,campoBusca,valorBusca,campoValue) {
   var aux1 = this.itemSegSecao(nomeFuncPrimSecao,nomeVarSegSecao,chaveSegSecao);
   var aux2 = this.item(nomeVarInfo,aux1.information,campoBusca,valorBusca,campoValue);
   return aux2.value[campoValue][0];
}

Existem dois campos dos objetos de information que podem ser utilizados na pesquisa: refNum e name.

O ideal é que todos os objetos de informação pudessem ter um campo refNum único, mas não é isso que acontece. Por isso, na localização dos dados algumas vezes o campo name é utilizado.

 

Elemento.prototype.itemInfoRefNum = function(nomeFuncPrimSecao,nomeVarSegSecao,chaveSegSecao,nomeVarInfo,numRef,campoValue) {
   return this.itemInfo(nomeFuncPrimSecao,nomeVarSegSecao,chaveSegSecao,nomeVarInfo,"referenceNumber",numRef,campoValue);
}

 

Elemento.prototype.itemInfoRefNumSWM = function(nomeFuncPrimSecao,nomeVarSegSecao,chaveSegSecao,nomeVarInfo,numRef) {
   return this.itemInfoRefNum(nomeFuncPrimSecao,nomeVarSegSecao,chaveSegSecao,nomeVarInfo,numRef,"stringWithMarkup").string;
}

 

Elemento.prototype.itemInfoName = function(nomeFuncPrimSecao,nomeVarSegSecao,chaveSegSecao,nomeVarInfo,nome,campoValue) {
   return this.itemInfo(nomeFuncPrimSecao,nomeVarSegSecao,chaveSegSecao,nomeVarInfo,"name",nome,campoValue);
}

 

Elemento.prototype.itemInfoNameNumber = function(nomeFuncPrimSecao,nomeVarSegSecao,chaveSegSecao,nomeVarInfo,nome) {
   return this.itemInfoName(nomeFuncPrimSecao,nomeVarSegSecao,chaveSegSecao,nomeVarInfo,nome,"number");
}

 

Elemento.prototype.itemInfoNameSWM = function(nomeFuncPrimSecao,nomeVarSegSecao,chaveSegSecao,nomeVarInfo,nome,campoValue) {
   return this.itemInfoName(nomeFuncPrimSecao,nomeVarSegSecao,chaveSegSecao,nomeVarInfo,nome,"stringWithMarkup").string;
}

 

Elemento.prototype.nome = function() {
   return this.itemInfoRefNumSWM("iden","_nome","Element Name","_nome1",1);
}

Elemento.prototype.simb = function() {
   return this.itemInfoRefNumSWM("iden","_simb","Element Symbol","_simb1",1);
}

Elemento.prototype.inchi = function() {
   return this.itemInfoRefNumSWM("iden","_inchi","InChI","_inchi1",1);
}

Elemento.prototype.inchikey = function() {
   return this.itemInfoRefNumSWM("iden","_inchikey","InChI Key","_inchikey1",1);
}