from ..periodic_table import periodic_table
from collections import Counter
[docs]class Actions(object):
[docs] def make_number(self, input, start, end, elements):
return int(input[start:end])
[docs] def make_element(self, input, start, end, elements):
element = input[start:end]
if element not in periodic_table:
raise InvalidFormulaError("element {} is not in periodic table".format(element))
return element
[docs] def multiply_by_sign(self, input, start, end, elements):
sign, complex = elements
if sign.text == '+':
return complex
counts = Counter()
for el in complex:
counts[el] = -complex[el]
return counts
[docs] def make_simple_fragment(self, input, start, end, elements):
n = 1
if isinstance(elements[1], int):
n = elements[1]
counts = Counter({elements[0]: n})
return counts
[docs] def combine_fragments(self, input, start, end, elements):
counts = Counter()
for el in elements:
counts.update(el)
return counts
[docs] def expand_fragment(self, input, start, end, elements):
fragment = elements[1]
num = elements[3]
if not isinstance(num, int):
num = 1
counts = Counter()
for el in fragment:
counts[el] = fragment[el] * num
return counts
[docs] def expand_complex(self, input, start, end, elements):
num = elements[0]
if not isinstance(num, int):
num = 1
counts = Counter()
for el in elements[1]:
for k in el:
counts[k] += el[k] * num
return counts