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);
}