Balance+ test assignment

by Alexander Tymchuk

HTML

<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.18.0/ramda.min.js"></script>
<p>Тестовое задание на вакансию <a href="http://krawlly.com/vacancies/js.html">"JavaScript разработчик"</a>.</p>
<script>
    var html = '<!doctype html>\
<!--[if IE 7 ]>		 <html class="no-js ie ie7 lte7 lte8 lte9" lang="en-US"> <![endif]-->\
<!--[if IE 8 ]>		 <html class="no-js ie ie8 lte8 lte9" lang="en-US"> <![endif]-->\
<!--[if IE 9 ]>		 <html class="no-js ie ie9 lte9>" lang="en-US"> <![endif]-->\
<!--[if (gt IE 9)|!(IE)]><!--> <html class="no-js" lang="en-US"> <!--<![endif]-->\
<head>\
    <meta charset="utf-8" />\
    <meta name="description" content="Личный кабинет провайдера" />\
    <meta name="keywords" content="текущий тариф, текущий баланс, обещаный платёж, бонусных баллов" />\
    <title>Личный кабинет провайдера</title>\
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"><\/script>\
	<script>window.jQuery || document.write(\'<script src="//jquery.com/jquery-wp-content/themes/jquery/js/jquery-1.11.2.min.js"><\\/script>\')<\/script>\
    <!--[if lte IE 7]>\
      <script src=""><\/script>\
    <![endif]-->\
    <script>\
        //текущий тариф 599 Promo\
        //текущий баланс 0\
        //обещаный платёж 200\
        //бонусных баллов 0\
    <\/script>\
    <style>\
        .bad {\
            color: red;\
        }\
        .good {\
            color: green;\
        }\
        .currency {\
            color: blue;\
        }\
    </style>\
</head>\
<body>\
    <form>\
    <table border=0 >\
    <tr>\
        <td class = caption2 align=center  ><strong> "текущий&nbsp;тариф&quot; </strong> </td>\
        <td>\
            <select>\
                <option value="499 Promo">599 Promo</option>\
                <option value="399 Promo">399 Promo</option>\
                <option value="299 Promo" selected>299 Promo</option>\
            <select>\
            <button title="Изменить текущий тариф">Изменить</button>\
            (изменится с...

JavaScript

'use strict';
var tableRe = /<table[^>]*>(.*?)<\/table>/ig,
    trRe = /<tr[^>]*>\s*(.*?)\s*<\/tr>/ig,
    tdRe = /<(?:(td)|(th))[^>]*>(.*?)<\/(?:(td)|(th))\s*>/ig,
	result = {
        tariff: { re: /текущий тариф/i, tag: 'em' },
        balance: { re: /текущий баланс/i, tag: 'span' },
        payment: { re: /обещаный плат[её]ж/i, tag: 'span' },
        bonus: { re: /бонусных баллов/i, tag: null }
    };

// находим второй `table`
var tableHtml = html.match(tableRe)[1];
// находим все `tr`
var trHtml = tableHtml.match(trRe);
// находим все `td` и делим на левые и правые
var match = R.compose(R.flatten, R.map);
var tdHtml = match(R.match(tdRe), trHtml);
var isEven = (v, i) => i % 2 === 0 ? v : false;
var isOdd = (v, i) => i % 2 !== 0 ? v : false;
var leftCols = tdHtml.filter(isEven).map(prettify);
var rightCols = tdHtml.filter(isOdd);

Object.keys(result).forEach(key => {
    let tag = result[key].tag || 'td';
    let re = new RegExp('<' + tag + '[^>]*\\s*>(.*?)<\\/' + tag + '\\s*>', 'gi');
    let processArr = R.compose(getFloat, prettify, R.nth(1), R.flatten, R.filter(n => n || false), R.addIndex(R.map));
    let value = processArr((el, i) => result[key].re.test(el) ? re.exec(rightCols[i]) : false, leftCols);    
	result[key] =  value || null;
});

console.log(result);

function prettify(str) {
    return str && str.replace('&nbsp;', ' ')
        .replace('&quot;', '"')
        .replace('&minus;', '-')
        .trim() || '';
}

function getFloat(val) {
	return /^(-)?[0-9]\d*(\.\d+)?$/.test(val) ? parseFloat(val, 10) : val;
}