build_scripts/generate_reactions.js   A
last analyzed

Complexity

Total Complexity 23
Complexity/F 2.88

Size

Lines of Code 114
Function Count 8

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
wmc 23
nc 3
mnd 3
bc 22
fnc 8
dl 0
loc 114
rs 10
bpm 2.75
cpm 2.875
noi 0
c 0
b 0
f 0

8 Functions

Rating   Name   Duplication   Size   Complexity  
C generate_reactions.js ➔ elementsFromHalf 0 23 8
A generate_reactions.js ➔ parseReaction 0 8 2
A generate_reactions.js ➔ extractElements 0 5 1
A lineReader.close 0 11 1
A generate_reactions.js ➔ vectorToMap 0 11 3
A generate_reactions.js ➔ generateKey 0 12 3
A lineReader.line 0 8 1
A generate_reactions.js ➔ generateHTML 0 11 3
1
/* eslint-env node */
2
/*jslint node: true */
3
'use strict';
4
5
let jsonfile = require('jsonfile');
6
let parser = require('molecular-parser');
7
8
let resources = jsonfile.readFileSync('build/data/resources.json');
9
let elements = jsonfile.readFileSync('build/data/elements.json');
10
11
for (let element in elements) {
12
  elements[element].reactions = elements[element].reactions || [];
13
}
14
15
let lineReader = require('readline').createInterface({
16
  input: require('fs').createReadStream('build/data/raw_reactions.txt')
17
});
18
19
let reactions = {};
20
// for each reaction
21
lineReader.on('line', function (line) {
22
  let reaction = parseReaction(line);
23
  let key = generateKey(reaction);
24
  reactions[key] = {};
25
  reactions[key].reactant = vectorToMap(reaction[0]);
26
  reactions[key].product = vectorToMap(reaction[1]);
27
  extractElements(reactions[key], key);
28
});
29
30
lineReader.on('close', function () {
31
  jsonfile.writeFileSync('build/data/resources.json', resources, {
32
    spaces: 2
33
  });
34
  jsonfile.writeFileSync('build/data/elements.json', elements, {
35
    spaces: 2
36
  });
37
  jsonfile.writeFileSync('build/data/reactions.json', reactions, {
38
    spaces: 2
39
  });
40
});
41
42
function vectorToMap(vector){
43
  let map = {};
44
  for(let i in vector){
45
    let resource = vector[i];
46
    if(typeof elements[resource] !== 'undefined'){
47
      resource = elements[resource].main;
48
    }
49
    map[resource] = map[resource]+1 || 1;
50
  }
51
  return map;
52
}
53
54
function extractElements(reaction, key) {
55
  reaction.elements = [];
56
  elementsFromHalf(reaction.reactant, reaction.elements, key);
57
  elementsFromHalf(reaction.product, reaction.elements, key);
58
}
59
60
function elementsFromHalf(half, reactElements, key){
61
  for (let molecule in half) {
62
    let breakdown = parser.decomposeFormula(molecule);
63
  	if (!resources[molecule] && !elements[molecule]) {
64
        resources[molecule] = {};
65
        resources[molecule].elements = breakdown;
66
        resources[molecule].html = generateHTML(breakdown);
67
        resources[molecule].type = ['molecule'];
68
      }
69
    for (let j in breakdown) {
70
      // we add the elements involved in both parts
71
      if (reactElements.indexOf(j) === -1) {
72
        reactElements.push(j);
73
      }
74
      if (elements[j].includes.indexOf(molecule) === -1) {
75
        elements[j].includes.push(molecule);
76
      }
77
      if (elements[j].reactions.indexOf(key) === -1) {
78
        elements[j].reactions.push(key);
79
      }
80
    }
81
  }
82
}
83
84
function generateKey(reaction) {
85
  let key = '';
86
  for (let half in reaction) {
87
    for (let i in reaction[half]) {
88
      key += reaction[half][i] + '.';
89
    }
90
    key = key.replace(/.$/, '');
91
    key += '-';
92
  }
93
  key = key.replace(/-$/, '');
94
  return key;
95
}
96
97
function parseReaction(line) {
98
  let part = line.split('->');
99
  let reaction = [];
100
  for (let i in part) {
101
    reaction[i] = part[i].trim().split(' ').sort();
102
  }
103
  return reaction;
104
}
105
106
function generateHTML(breakdown){
107
  let html = '';
108
  for (let k in breakdown) {
109
    html += k;
110
    let number = breakdown[k];
111
    if(number > 1){
112
      html += '<sub>'+number+'</sub>';
113
    }
114
  }
115
  return html;
116
}
117