JSFiddle - React, Tailwind, and code Playground

by zequez

HTML

<textarea id='input'>
Jan 2016
8 caramelos 44 banco
8 dietética USD45
9 Antitrans 43
11 alquiler 500
11 impuestos 180
13 depósito mama 910 banco
14 food truck show entrada 20
14 salida comida wrap 55
14 salida comida helado 60
14 leche 55
15 quita manchas 26
17 helado salida PA 90
18 rúcula 9
18 dados 40
18 helado 45
18 ajinomoto 12
18 café 97
02/29/2016 11:26	 AGROVET	$7.35	
02/29/2016 11:26	 GRUPO NUCLEO	$30.06	
02/27/2016 23:46	 ABC CONDUCCION	$67.04	
02/26/2016 11:24	 ABETE Y CIA SA	$7.65	
02/23/2016 10:23	 MARE REVESTIMIENTOS	$41.01	
02/15/2016 12:46	 STEAMGAMES.COM	$24.23	
02/11/2016 10:10	 HEROKU	$7.07	
02/06/2016 21:44	 GOOGLE *Human Japanese	$10.09	
02/04/2016 14:37	 Amazon web services	$1.31	
</textarea>
<!-- <div><button>Inject</button></div> -->
<textarea id='output'>
  
</textarea>

CSS

textarea {
  display: block;
  width: 500px;
  margin: 0;
  font-family: monospace;
}

#input {
  height: 150px;
}

#output {
  height: 400px;
}

JavaScript

//var button = document.querySelector('button');
var textarea = document.querySelector('#input');
var pre = document.querySelector('#output');

var accounts = [
  "Efectivo",
  "EfectivoUSD",
  "Banco",
  "Papá",
  "Mamá",
  "Adsense",
  "AbuelaN",
  "Payoneer"
]

var accountsDowncased = accounts.map(function(a){return a.toLocaleLowerCase()})

var accountsRegex = accounts.join('|')
var lineRegex = new RegExp("([0-9]+)\\s*(.*?)\\s*(" + accountsRegex + ")?\\s*(USD|EUR)?([0-9]+)\\s*(" + accountsRegex + ")?", 'i')

// 0 = day
// 1 = description
// 2 = source account
// 3 = currency
// 4 = money
// 5 = destination account
function parseLine (line, month, year) {
	if (line.match(/\$[0-9.]+\s*$/)) {
    var m = line.split(/\t/);
    var d = new Date(m[0]);
    return [[
    	d.getDay() + ' ' + month + ' ' + year,
      m[1].replace(/^\s*|\s*$/g, ''),
      ''
      'Payoneer',
      -parseInt(m[2].replace(/^\s*|\s*$/g, '').replace(/\$/, '')),
      'USD',
     ]];
  } else {
    var source = line.match(lineRegex);
    source.shift();
    var destinyAccount = source.pop();
    var destiny;
    if (source[2] == null) source[2] = accounts[0]
    if (destinyAccount) {
      destiny = source.slice(0, 5);
      destiny[2] = destinyAccount;
    }

    source = decorateLine(source, month, year);
    source[4] = -source[4];
    if (destiny) {
      destiny = decorateLine(destiny, month, year);
      return [source, destiny]
    }

    return [source];
  }
	
}

function parsePayoneerLine (line) {
  
}

// 0 = day
// 1 = description
// 2 = source account
// 3 = currency
// 4 = money
function decorateLine (line, month, year) {
  line[0] = line[0] + ' ' + month + ' ' + year;
  line[4] = parseInt(line[4]);
  line[3] = line[3] ? line[3] : ""
  line[2] = accounts[accountsDowncased.indexOf(line[2].toLocaleLowerCase())];
  line[1] = line[1][0].toLocaleUpperCase() + line[1].slice(1);
  return line
}

function parsedExpenses (raw) {
  var lines =...