Алгоритм Христова

by Nikita Polevoy

HTML

<textarea id="input">Дефолтное значение такое дефолтное</textarea>
  <div class="release-the-power">
  	<span>Release the power of {алгоритм П.Христова в модификации Дымченко и Варсанофьева} now!</span>
  </div>
  <textarea id="output" readonly="readonly"></textarea>

CSS

* {
    margin: 0;
    padding: 0;
    vertical-align: top;
    box-sizing: border-box;
  }
  textarea {
  	width: 100%;
  	min-width: 100%;
  	max-width: 100%;
  	height: 300px;
  	height: 45vh;
  	background-color: #ccffed;
  }
  .release-the-power {
  	text-align: center;
  	height: auto;
    height: 10vh;
    line-height: auto;
    line-height: 10vh;
  }

JavaScript

if (typeof module === 'undefined') {
	module = {};
}

module.exports = (function() {
	var vowels = 'оеаиуяыюэё',
	    voiced = 'нрвлмдгбзчхжшцщ',
	    deaf = 'тскпф',
	    brief = 'й',
	    other = 'ьъ',
	    consonants = 'нтсрвлкмдпгбзчхжшцщф';

	function isNotLastSep(remainStr) {
	  var is = false;

	  for (var i = 0; i < remainStr.length; i++) {
	    if (vowels.indexOf(remainStr.substr (i, 1)) != -1) { 
	      is = true; 
	      break; 
	    }
	  } 

	  return is;
	} 

	return function() {
	  var letter = '',
	      syllable = '',
	      syllables = [],
	      word = this.toLowerCase();

	  function pushSyllable() {
	    syllables.push(syllable);
	    syllable = '';
	  };

	  for (var i = 0; i < word.length; i++) {
	    letter = word.substr(i, 1);
	    syllable += this.substr(i, 1);

		// не первая буква
		if (i === 0) {
			continue;
		}
	    
	    // Проверка на признаки конца слогов
	    // если буква равна 'й' и она не первая и не последняя и это не последний слог
	    if (
	      (i != 0) && 
	      (i != word.length -1) && 
	      (brief.indexOf (letter) != -1) &&
	      (isNotLastSep (word.substr (i+1, word.length-i+1)))
	    ) { pushSyllable (); continue; }

	    // если текущая гласная и следующая тоже гласная
	    // EDIT: этот блок необходим если задача - корректно разбить слово на фонетические слоги,
	    // и не нужен если задача - разбить слово на части, которые можно переносить
	    //
	    //  if (
	    //  (i < word.length - 1) && 
	    //  (vowels.indexOf (letter) != -1) && 
	    //  (vowels.indexOf (word.substr (i+1, 1)) != -1)
	    //) { pushSyllable (); continue; }

	    // если текущая гласная, следующая согласная, а после неё гласная
	    if (
	      (i < word.length - 2) && 
	      (vowels.indexOf (letter) != -1) && 
	      (consonants.indexOf (word.substr (i+1, 1)) != -1) && 
	      (vowels.indexOf (word.substr (i+2, 1)) != -1)
	    ) { pushSyllable (); continue; }

	    // если текущая гласная, следующая глухая согласная, а после...